Κατανόηση του FreePBX και ενσωμάτωσή του με το Bitrix24 και άλλα

Bitrix24 είναι ένας τεράστιος συνδυασμός που συνδυάζει το CRM, τη ροή εργασιών, τη λογιστική και πολλά άλλα πράγματα που αρέσουν πολύ στους διευθυντές και στο προσωπικό πληροφορικής δεν αρέσουν πραγματικά. Η πύλη χρησιμοποιείται από πολλές μικρές και μεσαίες εταιρείες, συμπεριλαμβανομένων μικρών κλινικών, κατασκευαστών, ακόμη και ινστιτούτων αισθητικής. Η κύρια λειτουργία που «αγαπούν» οι διαχειριστές είναι η ενσωμάτωση της τηλεφωνίας και του CRM, όταν οποιαδήποτε κλήση καταγράφεται αμέσως στο CRM, δημιουργούνται κάρτες πελατών, κατά την είσοδο εμφανίζονται πληροφορίες για τον πελάτη και μπορείτε να δείτε αμέσως ποιος είναι, τι μπορεί να πουλήσει και πόσα χρωστάει. Αλλά η τηλεφωνία από το Bitrix24 και η ενσωμάτωσή της με το CRM κοστίζει χρήματα, μερικές φορές πολύ. Στο άρθρο θα σας πω την εμπειρία της ενσωμάτωσης με ανοιχτά εργαλεία και το δημοφιλές IP PBX freepbx, και επίσης λάβετε υπόψη τη λογική της εργασίας διαφόρων τμημάτων

Εργάζομαι ως outsourcer σε μια εταιρεία που πωλεί και διαμορφώνει, ενσωματώνει τηλεφωνία IP. Όταν με ρώτησαν αν μπορούσαμε να προσφέρουμε κάτι για την ενσωμάτωση του Bitrix24 με PBX που έχουν οι πελάτες, καθώς και με εικονικά PBX σε διάφορες εταιρείες VDS, πήγα στην Google. Και φυσικά μου έδωσε έναν σύνδεσμο άρθρο στο habr, όπου υπάρχει περιγραφή, και github, και όλα φαίνεται να λειτουργούν. Αλλά όταν προσπαθούσαμε να χρησιμοποιήσετε αυτήν τη λύση, αποδείχθηκε ότι το Bitrix24 δεν είναι πλέον το ίδιο με πριν και πολλά πρέπει να γίνουν ξανά. Επιπλέον, το FreePBX δεν είναι ένας απλός αστερίσκος για εσάς, εδώ πρέπει να σκεφτείτε πώς να συνδυάσετε την ευκολία χρήσης και ένα σκληρό σχέδιο κλήσης σε αρχεία διαμόρφωσης.

Μελετάμε τη λογική της δουλειάς

Λοιπόν, για αρχή, πώς πρέπει να λειτουργούν όλα. Όταν λαμβάνεται μια κλήση εκτός του PBX (συμβάν SIP INVITE από τον πάροχο), ξεκινά η επεξεργασία του προγράμματος κλήσης (σχέδιο κλήσης, σχέδιο κλήσης) - οι κανόνες για το τι και με ποια σειρά πρέπει να κάνετε με την κλήση. Από το πρώτο πακέτο, μπορείτε να λάβετε πολλές πληροφορίες, οι οποίες στη συνέχεια μπορούν να χρησιμοποιηθούν στους κανόνες. Ένα εξαιρετικό εργαλείο για τη μελέτη των εσωτερικών του SIP είναι ο αναλυτής sngrep (σύνδεσμος) που απλά εγκαθίσταται σε δημοφιλείς διανομές μέσω apt install/yum install και παρόμοια, αλλά μπορεί επίσης να κατασκευαστεί από την πηγή. Ας δούμε το αρχείο καταγραφής κλήσεων στο sngrep

Κατανόηση του FreePBX και ενσωμάτωσή του με το Bitrix24 και άλλα

Σε απλοποιημένη μορφή, το σχέδιο κλήσης ασχολείται μόνο με το πρώτο πακέτο, μερικές φορές και κατά τη διάρκεια της συνομιλίας, μεταφέρονται κλήσεις, πατήσεις κουμπιών (DTMF), διάφορα ενδιαφέροντα πράγματα όπως FollowMe, RingGroup, IVR και άλλα.

Τι υπάρχει μέσα στο πακέτο πρόσκλησης

Κατανόηση του FreePBX και ενσωμάτωσή του με το Bitrix24 και άλλα

Στην πραγματικότητα, τα περισσότερα απλά σχέδια κλήσης λειτουργούν με τα δύο πρώτα πεδία και όλη η λογική περιστρέφεται γύρω από το DID και το CallerID. DID - όπου καλούμε, CallerID - ποιος καλεί.

Αλλά τελικά, έχουμε μια εταιρεία και όχι ένα τηλέφωνο - πράγμα που σημαίνει ότι το PBX πιθανότατα έχει ομάδες κλήσεων (ταυτόχρονο / διαδοχικό κουδούνισμα πολλών συσκευών) σε αριθμούς πόλεων (Ring Group), IVR (Γεια, καλέσατε ... Πατήστε ένα για ...), Τηλεφωνητές ( Φράσεις), Συνθήκες χρόνου, Προώθηση σε άλλους αριθμούς ή σε κελί (FollowMe, Forward). Αυτό σημαίνει ότι είναι πολύ δύσκολο να προσδιοριστεί με σαφήνεια ποιος θα λάβει πραγματικά μια κλήση και με ποιον θα συνομιλήσει όταν φτάσει μια κλήση. Ακολουθεί ένα παράδειγμα της έναρξης μιας τυπικής κλήσης στο PBX των πελατών μας

Κατανόηση του FreePBX και ενσωμάτωσή του με το Bitrix24 και άλλα

Αφού η κλήση εισέλθει επιτυχώς στο PBX, ταξιδεύει μέσω του σχεδίου κλήσης σε διαφορετικά "πλαίσια". Το πλαίσιο από την άποψη του Αστερίσκου είναι ένα αριθμημένο σύνολο εντολών, καθεμία από τις οποίες περιέχει ένα φίλτρο από τον αριθμό που καλείται (λέγεται exten, για μια εξωτερική κλήση στο αρχικό στάδιο exten=DID). Οι εντολές στη γραμμή σχεδίου κλήσης μπορεί να είναι οτιδήποτε - εσωτερικές λειτουργίες (για παράδειγμα, καλέστε έναν εσωτερικό συνδρομητή - Dial(), κατέβασε το τηλέφωνο - Hangup()), τελεστές υπό όρους (IF, ELSE, ExecIF και τα παρόμοια), μεταβάσεις σε άλλους κανόνες αυτού του πλαισίου (Goto, GotoIF), μετάβαση σε άλλα περιβάλλοντα με τη μορφή κλήσης συνάρτησης (Gosub, Macro). Ξεχωριστή οδηγία include имя_контекста, που προσθέτει εντολές από άλλο περιβάλλον στο τέλος του τρέχοντος περιβάλλοντος. Οι εντολές που περιλαμβάνονται μέσω του include εκτελούνται πάντα μετά εντολές του τρέχοντος πλαισίου.

Ολόκληρη η λογική του FreePBX βασίζεται στη συμπερίληψη διαφορετικών πλαισίων το ένα στο άλλο μέσω των χειριστών συμπερίληψης και κλήσης μέσω Gosub, Macro και Handler. Εξετάστε το πλαίσιο των εισερχόμενων κλήσεων FreePBX

Κατανόηση του FreePBX και ενσωμάτωσή του με το Bitrix24 και άλλα

Η κλήση περνά από όλα τα περιβάλλοντα από πάνω προς τα κάτω με τη σειρά του, σε κάθε περιβάλλον μπορεί να υπάρχουν κλήσεις σε άλλα περιβάλλοντα όπως μακροεντολές (Macro), συναρτήσεις (Gosub) ή απλώς μεταβάσεις (Goto), οπότε το πραγματικό δέντρο αυτού που ονομάζεται μπορεί μόνο να παρακολουθούνται στα αρχεία καταγραφής.

Ένα τυπικό διάγραμμα εγκατάστασης για ένα τυπικό PBX φαίνεται παρακάτω. Κατά την κλήση, το DID αναζητείται στις εισερχόμενες διαδρομές, ελέγχονται οι προσωρινές συνθήκες για αυτό, εάν όλα είναι εντάξει, ξεκινά το φωνητικό μενού. Από αυτό, πατώντας το κουμπί 1 ή λήξη χρονικού ορίου, βγείτε στην ομάδα τηλεφωνητή χειριστή. Μετά το τέλος της κλήσης, καλείται η μακροεντολή hangupcall, μετά την οποία δεν μπορεί να γίνει τίποτα στο σχέδιο κλήσης, εκτός από ειδικούς χειριστές (hangup handler).

Κατανόηση του FreePBX και ενσωμάτωσή του με το Bitrix24 και άλλα

Πού σε αυτόν τον αλγόριθμο κλήσης πρέπει να παρέχουμε πληροφορίες σχετικά με την έναρξη της κλήσης στο CRM, πού να ξεκινήσετε την εγγραφή, πού να τερματίσετε την εγγραφή και να τις στείλουμε μαζί με πληροφορίες σχετικά με την κλήση στο CRM;

Ενοποίηση με εξωτερικά συστήματα

Τι είναι η ενοποίηση PBX και CRM; Πρόκειται για ρυθμίσεις και προγράμματα που μετατρέπουν δεδομένα και συμβάντα μεταξύ αυτών των δύο πλατφορμών και τα στέλνουν το ένα στο άλλο. Ο πιο συνηθισμένος τρόπος επικοινωνίας για ανεξάρτητα συστήματα είναι μέσω API και ο πιο δημοφιλής τρόπος πρόσβασης σε API είναι το HTTP REST. Όχι όμως για αστερίσκο.

Το Inside Asterisk είναι:

  • AGI - σύγχρονη κλήση εξωτερικών προγραμμάτων/εξαρτημάτων, που χρησιμοποιούνται κυρίως στο dialplan, υπάρχουν βιβλιοθήκες όπως phpagi, ΠΑΓΗ

  • AMI - μια υποδοχή TCP κειμένου που λειτουργεί με βάση την αρχή της εγγραφής σε συμβάντα και της εισαγωγής εντολών κειμένου, μοιάζει με SMTP από μέσα, μπορεί να παρακολουθεί συμβάντα και να διαχειρίζεται κλήσεις, υπάρχει μια βιβλιοθήκη ΠΑΜΙ - το πιο δημοφιλές για τη δημιουργία σύνδεσης με το Asterisk

Παράδειγμα εξόδου AMI

Εκδήλωση: Νέο κανάλι
Προνόμιο: καλέστε, όλοι
Κανάλι: PJSIP/VMS_pjsip-0000078b
Κατάσταση καναλιού: 4
ChannelStateDesc: Κουδούνισμα
Αριθμός κλήσης: 111222
Αναγνωριστικό καλούντος: 111222
ConnectedLineNum:
συνδεδεμένο όνομα γραμμής:
Γλώσσα: en
κωδικός λογαριασμού:
Πλαίσιο: από-pstn
Επέκταση: s
Προτεραιότητα: 1
Μοναδικό: 1599589046.5244
Linkedid: 1599589046.5244

  • Το ARI είναι ένα μείγμα και των δύο, όλα μέσω REST, WebSocket, σε μορφή JSON - αλλά με φρέσκες βιβλιοθήκες και περιτυλίγματα, όχι πολύ καλά, άγνωστα (phparia, phpari) που μπήκαν στην ανάπτυξή τους πριν από περίπου 3 χρόνια.

Παράδειγμα εξόδου ARI όταν ξεκινά μια κλήση

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «όνομα»:»PJSIP/VMSpjsip-000007b6″, "state":"Ring", "caller":{ "name":"111222″, "number":"111222″ }, "connected":{ "name":"", "number" :"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appname":"Stasis", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"en" }, "asteriskid":"48:5b:aa:aa:aa:aa", "application":"hello-world" }

Η ευκολία ή η ταλαιπωρία, η δυνατότητα ή η αδυναμία εργασίας με ένα συγκεκριμένο API καθορίζονται από τις εργασίες που πρέπει να επιλυθούν. Οι εργασίες για την ενοποίηση με το CRM είναι οι εξής:

  • Παρακολουθήστε την αρχή της κλήσης, όπου μεταφέρθηκε, τραβήξτε το CallerID, DID, ώρα έναρξης και λήξης, ίσως δεδομένα από τον κατάλογο (για αναζήτηση σύνδεσης μεταξύ του τηλεφώνου και του χρήστη CRM)

  • Ξεκινήστε και τερματίστε την εγγραφή της κλήσης, αποθηκεύστε την στην επιθυμητή μορφή, ενημερώστε στο τέλος της εγγραφής πού βρίσκεται το αρχείο

  • Ξεκινήστε μια κλήση σε ένα εξωτερικό συμβάν (από το πρόγραμμα), καλέστε έναν εσωτερικό αριθμό, έναν εξωτερικό αριθμό και συνδέστε τους

  • Προαιρετικός: ενσωμάτωση με CRM, ομάδες κλήσης και FollowME για αυτόματη μεταφορά κλήσεων ελλείψει θέσης (σύμφωνα με το CRM)

Όλες αυτές οι εργασίες μπορούν να επιλυθούν μέσω AMI ή ARI, αλλά το ARI παρέχει πολύ λιγότερες πληροφορίες, δεν υπάρχουν πολλά συμβάντα, πολλές μεταβλητές που έχει ακόμα το AMI (για παράδειγμα, κλήσεις μακροεντολών, ρύθμιση μεταβλητών εντός μακροεντολών, συμπεριλαμβανομένης της εγγραφής κλήσεων) δεν παρακολουθούνται. Επομένως, για σωστή και ακριβή παρακολούθηση, ας επιλέξουμε το AMI προς το παρόν (αλλά όχι εντελώς). Επιπλέον (καλά, πού θα ήταν χωρίς αυτό, είμαστε τεμπέληδες) - στο πρωτότυπο έργο (άρθρο στο habr) χρησιμοποιήστε το PAMI. *Στη συνέχεια, πρέπει να προσπαθήσετε να ξαναγράψετε στο ARI, αλλά όχι το γεγονός ότι θα λειτουργήσει.

Επανεφεύρεση της ολοκλήρωσης

Προκειμένου το FreePBX μας να μπορεί να αναφέρει στην AMI με απλούς τρόπους σχετικά με την έναρξη της κλήσης, την ώρα λήξης, τους αριθμούς, τα ονόματα των εγγεγραμμένων αρχείων, είναι ευκολότερο να υπολογίσετε τη διάρκεια της κλήσης χρησιμοποιώντας το ίδιο τέχνασμα με τους αρχικούς συντάκτες - εισάγετε τις μεταβλητές σας και αναλύστε την έξοδο για την παρουσία τους. Η PAMI προτείνει να το κάνετε αυτό απλά μέσω μιας λειτουργίας φίλτρου.

Ακολουθεί ένα παράδειγμα ρύθμισης της δικής σας μεταβλητής για την ώρα έναρξης της κλήσης (s είναι ένας ειδικός αριθμός στο σχέδιο κλήσης που εκτελείται ΠΡΙΝ ξεκινήσετε την αναζήτηση DID)

[ext-did-custom]

exten => s,1,Set(CallStart=${STRFTIME(epoch,,%s)})

Ένα παράδειγμα συμβάντος AMI για αυτήν τη γραμμή

Εκδήλωση: Νέο κανάλι

Προνόμιο: καλέστε, όλοι

Κανάλι: PJSIP/VMS_pjsip-0000078b

Κατάσταση καναλιού: 4

ChannelStateDesc: Κουδούνισμα

Αριθμός κλήσης: 111222

Αναγνωριστικό καλούντος: 111222

ConnectedLineNum:

συνδεδεμένο όνομα γραμμής:

Γλώσσα: en

κωδικός λογαριασμού:

Πλαίσιο: από-pstn

Επέκταση: s

Προτεραιότητα: 1

Μοναδικό: 1599589046.5244

Linkedid: 1599589046.5244

Εφαρμογή: Ορισμός AppData:

CallStart=1599571046

Επειδή το FreePBX αντικαθιστά τα αρχεία extension.conf και extension_Επιπλέον.conf, θα χρησιμοποιήσουμε το αρχείο επέκταση_έθιμο.conf

Πλήρης κωδικός extension_custom.conf

[globals]	
;; Проверьте пути и права на папки - юзер asterisk должен иметь права на запись
;; Сюда будет писаться разговоры
WAV=/var/www/html/callme/records/wav 
MP3=/var/www/html/callme/records/mp3

;; По этим путям будет воспроизводится и скачиваться запись
URLRECORDS=https://www.host.ru/callmeplus/records/mp3

;; Адрес для калбека при исходящем вызове
URLPHP=https://www.host.ru/callmeplus

;; Да пишем разговоры
RECORDING=1

;; Это макрос для записи разговоров в нашу папку. 
;; Можно использовать и системную запись, но пока пусть будет эта - 
;; она работает
[recording]
exten => ~~s~~,1,Set(LOCAL(calling)=${ARG1})
exten => ~~s~~,2,Set(LOCAL(called)=${ARG2})
exten => ~~s~~,3,GotoIf($["${RECORDING}" = "1"]?4:14)
exten => ~~s~~,4,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called})
exten => ~~s~~,5,Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)})
exten => ~~s~~,6,System(mkdir -p ${MP3}/${datedir})
exten => ~~s~~,7,System(mkdir -p ${WAV}/${datedir})
exten => ~~s~~,8,Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "${WAV}/${datedir}/${fname}.wav"  "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3")
exten => ~~s~~,9,Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3)
exten => ~~s~~,10,Set(CDR(filename)=${fname}.mp3)
exten => ~~s~~,11,Set(CDR(recordingfile)=${fname}.wav)
exten => ~~s~~,12,Set(CDR(realdst)=${called})
exten => ~~s~~,13,MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt})
exten => ~~s~~,14,NoOp(Finish if_recording_1)
exten => ~~s~~,15,Return()


;; Это основной контекст для начала разговора
[ext-did-custom]

;; Это хулиганство, делать это так и здесь, но работает - добавляем к номеру '8'
exten =>  s,1,Set(CALLERID(num)=8${CALLERID(num)})

;; Тут всякие переменные для скрипта
exten =>  s,n,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
exten =>  s,n,ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp())
exten =>  s,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten =>  s,n,Set(CallMeDISPOSITION=${CDR(disposition)})

;; Самое главное! Обработчик окончания разговора. 
;; Обычные пути обработки конца через (exten=>h,1,чтототут) в FreePBX не работают - Macro(hangupcall,) все портит. 
;; Поэтому вешаем Hangup_Handler на окончание звонка
exten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Обработчик окончания входящего вызова
[sub-call-from-cid-ended]

;; Сообщаем о значениях при конце звонка
exten => s,1,Set(CDR_PROP(disable)=true)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})

;; Статус вызова - Ответ, не ответ...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return


;; Обработчик исходящих вызовов - все аналогичено
[outbound-allroutes-custom]

;; Запись
exten => _.,1,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
;; Переменные
exten => _.,n,Set(__CallIntNum=${CALLERID(num)})
exten => _.,n,Set(CallExtNum=${EXTEN})
exten => _.,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Set(CallmeCALLID=${SIPCALLID})

;; Вешаем Hangup_Handler на окончание звонка
exten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Обработчик окончания исходящего вызова
[sub-call-internal-ended]

;; переменные
exten => s,1,Set(CDR_PROP(disable)=true)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})

;; Вызов скрипта, который сообщит о звонке в CRM - это исходящий, 
;; так что по факту окончания
exten => s,n,System(curl -s ${URLPHP}/CallMeOut.php --data action=sendcall2b24 --data ExtNum=${CallExtNum} --data call_id=${SIPCALLID} --data-urlencode FullFname='${FullFname}' --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition='${CallMeDISPOSITION}')
exten => s,n,Return

Χαρακτηριστικό και διαφορά από το αρχικό σχέδιο κλήσης των συντακτών του αρχικού άρθρου -

  • Dialplan σε μορφή .conf, όπως το θέλει το FreePBX (ναι, μπορεί να .ael, αλλά όχι όλες οι εκδόσεις και δεν είναι πάντα βολικό)

  • Αντί να επεξεργαστεί το τέλος μέσω exten=>h, η επεξεργασία εισήχθη μέσω του hangup_handler, επειδή το σχέδιο κλήσης FreePBX λειτουργούσε μόνο με αυτό

  • Διορθώθηκε η συμβολοσειρά κλήσης σεναρίου, προστιθέμενα εισαγωγικά και εξωτερικός αριθμός κλήσης ExtNum

  • Η επεξεργασία μετακινείται στο _custom contexts και σας επιτρέπει να μην αγγίζετε ή να επεξεργάζεστε τις ρυθμίσεις του FreePBX - εισερχόμενες μέσω [ext-dod-custom], εξερχόμενη μέσω [outbound-allroutes-custom]

  • Δεν δεσμεύεται με αριθμούς - το αρχείο είναι καθολικό και χρειάζεται μόνο να ρυθμιστεί για τη διαδρομή και τη σύνδεση με τον διακομιστή

Για να ξεκινήσετε, πρέπει επίσης να εκτελέσετε σενάρια στο AMI με σύνδεση και κωδικό πρόσβασης - για αυτό, το FreePBX διαθέτει επίσης ένα αρχείο _custom

αρχείο manager_custom.conf

;;  это логин
[callmeplus]
;; это пароль
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0

;; я работаю с локальной машиной - но если надо, можно и другие прописать
permit = 127.0.0.1/255.255.255.255
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,log,verbose,user,config,command,reporting,originate

Και τα δύο αυτά αρχεία πρέπει να τοποθετηθούν στο /etc/asterisk και μετά να διαβάσετε ξανά τις ρυθμίσεις παραμέτρων (ή να επανεκκινήσετε τον αστερίσκο)

# astrisk -rv
  Connected to Asterisk 16.6.2 currently running on freepbx (pid = 31629)
#freepbx*CLI> dialplan reload
     Dialplan reloaded.
#freepbx*CLI> exit

Τώρα ας προχωρήσουμε στην PHP

Εκκίνηση σεναρίων και δημιουργία υπηρεσίας

Δεδομένου ότι το σχέδιο εργασίας με το Bitrix 24, μια υπηρεσία για την AMI, δεν είναι εντελώς απλό και διαφανές, πρέπει να συζητηθεί ξεχωριστά. Ο αστερίσκος, όταν είναι ενεργοποιημένος το AMI, απλά ανοίγει τη θύρα και τέλος. Όταν ένας πελάτης εγγραφεί, ζητά εξουσιοδότηση και, στη συνέχεια, ο πελάτης εγγράφεται στα απαραίτητα συμβάντα. Τα συμβάντα έρχονται σε απλό κείμενο, το οποίο το PAMI μετατρέπει σε δομημένα αντικείμενα και παρέχει τη δυνατότητα ρύθμισης της λειτουργίας φιλτραρίσματος μόνο για συμβάντα ενδιαφέροντος, πεδία, αριθμούς κ.λπ.

Μόλις έρθει η κλήση, το συμβάν NewExten ενεργοποιείται ξεκινώντας από το γονικό περιβάλλον [from-pstn] και, στη συνέχεια, όλα τα συμβάντα πηγαίνουν με τη σειρά των γραμμών στα περιβάλλοντα. Όταν λαμβάνονται πληροφορίες από τις μεταβλητές CallMeCallerIDName και CallStart που καθορίζονται στο _custom dialplan, το

  1. Η λειτουργία αιτήματος του UserID που αντιστοιχεί στον αριθμό επέκτασης όπου ήρθε η κλήση. Τι γίνεται αν πρόκειται για ομάδα μέσω τηλεφώνου; Το ερώτημα είναι πολιτικό, χρειάζεται να δημιουργήσετε μια κλήση προς όλους ταυτόχρονα (όταν όλοι καλούν ταυτόχρονα) ή να δημιουργήσετε όπως καλούν όταν καλούν με τη σειρά τους; Οι περισσότεροι πελάτες έχουν τη στρατηγική Fisrt Available, επομένως δεν υπάρχει πρόβλημα με αυτό, μόνο μία κλήση. Όμως το θέμα πρέπει να λυθεί.

  2. Η λειτουργία εγγραφής κλήσης στο Bitrix24, η οποία επιστρέφει το αναγνωριστικό κλήσης, το οποίο στη συνέχεια απαιτείται να αναφέρει τις παραμέτρους κλήσης και έναν σύνδεσμο προς την εγγραφή. Απαιτεί είτε αριθμό επέκτασης είτε UserID

Κατανόηση του FreePBX και ενσωμάτωσή του με το Bitrix24 και άλλα

Μετά το τέλος της κλήσης, καλείται η λειτουργία λήψης εγγραφής, η οποία αναφέρει ταυτόχρονα την κατάσταση ολοκλήρωσης της κλήσης (Απασχολημένος, Χωρίς απάντηση, Επιτυχία) και επίσης κατεβάζει έναν σύνδεσμο προς το αρχείο mp3 με την εγγραφή (εάν υπάρχει).

Επειδή η λειτουργική μονάδα CallMeIn.php πρέπει να εκτελείται συνεχώς, έχει δημιουργηθεί ένα αρχείο εκκίνησης SystemD για αυτήν callme.service, το οποίο πρέπει να τοποθετηθεί στο /etc/systemd/system/callme.service

[Unit]
Description=CallMe

[Service]
WorkingDirectory=/var/www/html/callmeplus
ExecStart=/usr/bin/php /var/www/html/callmeplus/CallMeIn.php 2>&1 >>/var/log/callmeplus.log
ExecStop=/bin/kill -WINCH ${MAINPID}
KillSignal=SIGKILL

Restart=on-failure
RestartSec=10s

#тут надо смотреть,какие права на папки
#User=www-data  #Ubuntu - debian
#User=nginx #Centos

[Install]
WantedBy=multi-user.target

η προετοιμασία και η εκκίνηση του σεναρίου πραγματοποιείται μέσω του systemctl ή της υπηρεσίας

# systemctl enable callme
# systemctl start callme

Η υπηρεσία θα επανεκκινήσει μόνη της όπως απαιτείται (σε ​​περίπτωση σφαλμάτων). Η υπηρεσία παρακολούθησης εισερχομένων δεν απαιτεί εγκατάσταση διακομιστή web, χρειάζεται μόνο php (που σίγουρα υπάρχει στον διακομιστή FeePBX). Ωστόσο, ελλείψει πρόσβασης σε εγγραφές κλήσεων μέσω του διακομιστή Web (επίσης με https), δεν θα είναι δυνατή η ακρόαση εγγραφών κλήσεων.

Τώρα ας μιλήσουμε για τις εξερχόμενες κλήσεις. Το σενάριο CallMeOut.php έχει δύο λειτουργίες:

  • Έναρξη κλήσης όταν λαμβάνεται ένα αίτημα για ένα σενάριο php (συμπεριλαμβανομένης της χρήσης του κουμπιού "Κλήση" στο ίδιο το Bitrix). Δεν λειτουργεί χωρίς διακομιστή web, το αίτημα λαμβάνεται μέσω HTTP POST, το αίτημα περιέχει ένα διακριτικό

  • Μήνυμα σχετικά με την κλήση, τις παραμέτρους και τις εγγραφές της στο Bitrix. Ενεργοποιείται από το Asterisk στο σχέδιο κλήσης [sub-call-internal-ended] όταν λήγει μια κλήση

Κατανόηση του FreePBX και ενσωμάτωσή του με το Bitrix24 και άλλα

Ο διακομιστής ιστού χρειάζεται μόνο για δύο πράγματα - τη λήψη αρχείων εγγραφής Bitrix (μέσω HTTPS) και την κλήση του σεναρίου CallMeOut.php. Μπορείτε να χρησιμοποιήσετε τον ενσωματωμένο διακομιστή FreePBX, τα αρχεία του οποίου είναι /var/www/html, μπορείτε να εγκαταστήσετε έναν άλλο διακομιστή ή να καθορίσετε μια διαφορετική διαδρομή.

Διακομιστής Ιστού

Ας αφήσουμε τη ρύθμιση του διακομιστή web για ανεξάρτητη μελέτη (tyts, tyts, tyts). Εάν δεν έχετε domain, μπορείτε να δοκιμάσετε το FreeDomain( https://www.freenom.com/ru/index.html), το οποίο θα σας δώσει ένα δωρεάν όνομα για τη λευκή σας IP (μην ξεχάσετε να προωθήσετε τις θύρες 80, 443 μέσω του δρομολογητή εάν η εξωτερική διεύθυνση είναι μόνο σε αυτήν). Εάν μόλις δημιουργήσατε έναν τομέα DNS, τότε πρέπει να περιμένετε (από 15 λεπτά έως 48 ώρες) μέχρι να φορτωθούν όλοι οι διακομιστές. Σύμφωνα με την εμπειρία της εργασίας με εγχώριους παρόχους - από 1 ώρα έως μία ημέρα.

Αυτοματισμός εγκατάστασης

Ένα πρόγραμμα εγκατάστασης έχει αναπτυχθεί στο github για να κάνει την εγκατάσταση ακόμα πιο εύκολη. Αλλά ήταν ομαλή σε χαρτί - ενώ τα εγκαθιστούμε όλα χειροκίνητα, αφού μετά από τσιμπήματα με όλα αυτά έγινε ξεκάθαρο τι είναι φίλοι με ποιον, ποιος πηγαίνει πού και πώς να το διορθώσει. Δεν υπάρχει πρόγραμμα εγκατάστασης ακόμα

Λιμενεργάτης

Εάν θέλετε να δοκιμάσετε γρήγορα τη λύση - υπάρχει μια επιλογή με το Docker - δημιουργήστε γρήγορα ένα κοντέινερ, δώστε του θύρες προς τα έξω, περάστε τα αρχεία ρυθμίσεων και δοκιμάστε (αυτή είναι η επιλογή με το κοντέινερ LetsEncrypt, εάν έχετε ήδη πιστοποιητικό , απλά πρέπει να ανακατευθύνετε τον αντίστροφο διακομιστή μεσολάβησης στον διακομιστή web FreePBX (του δώσαμε μια άλλη θύρα είναι 88), LetsEncrypt in docker με βάση του παρόντος άρθρου

Πρέπει να εκτελέσετε το αρχείο στον φάκελο του ληφθέντος έργου (μετά το git clone), αλλά πρώτα να μπείτε στις ρυθμίσεις παραμέτρων αστερίσκου (φάκελος αστερίσκος) και να γράψετε εκεί τις διαδρομές προς τις εγγραφές και τη διεύθυνση URL του ιστότοπού σας

version: '3.3'
services:
  nginx:
    image: nginx:1.15-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/ssl_docker.conf:/etc/nginx/conf.d/ssl_docker.conf
  certbot:
    image: certbot/certbot
  freepbx:
    image: flaviostutz/freepbx
    ports:
      - 88:80 # для настройки
      - 5060:5060/udp
      - 5160:5160/udp
      - 127.0.0.1:5038:5038 # для CallMeOut.php
#      - 3306:3306
      - 18000-18100:18000-18100/udp
    restart: always
    environment:
      - ADMIN_PASSWORD=admin123
    volumes:
      - backup:/backup
      - recordings:/var/spool/asterisk/monitor
      - ./callme:/var/www/html/callme
      - ./systemd/callme.service:/etc/systemd/system/callme.conf
      - ./asterisk/manager_custom.conf:/etc/asterisk/manager_custom.conf
      - ./asterisk/extensions_custom.conf:/etc/asterisk/extensions_custom.conf
#      - ./conf/startup.sh:/startup.sh

volumes:
  backup:
  recordings:

Αυτό το αρχείο docker-compose.yaml εκτελείται μέσω

docker-compose up -d

Εάν το nginx δεν ξεκινά, τότε κάτι δεν πάει καλά με τη διαμόρφωση στο φάκελο nginx/ssl_docker.conf

Άλλες ενσωματώσεις

Και γιατί να μην βάλουμε και λίγο CRM σε σενάρια ταυτόχρονα, σκεφτήκαμε. Μελετήσαμε πολλά άλλα CRM API, ειδικά το δωρεάν ενσωματωμένο PBX - ShugarCRM και Vtiger, και ναι! ναι, η αρχή είναι η ίδια. Αλλά αυτή είναι μια άλλη ιστορία, την οποία αργότερα θα ανεβάσουμε στο github ξεχωριστά.

παραπομπές

Αποποίηση ευθύνης: Οποιαδήποτε ομοιότητα με την πραγματικότητα είναι πλασματική και δεν ήμουν εγώ.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο