Հասկանալով FreePBX-ը և ինտեգրելով այն Bitrix24-ին և ավելին

Bitrix24 հսկայական կոմբինատ է, որը համատեղում է CRM-ը, աշխատանքային հոսքը, հաշվապահությունը և շատ այլ բաներ, որոնք մենեջերներին իսկապես դուր են գալիս, իսկ ՏՏ անձնակազմը՝ ոչ: Պորտալն օգտագործվում է բազմաթիվ փոքր և միջին ընկերությունների կողմից, ներառյալ փոքր կլինիկաները, արտադրողները և նույնիսկ գեղեցկության սրահները: Հիմնական գործառույթը, որը «սիրում» են մենեջերները, հեռախոսակապի և CRM-ի ինտեգրումն է, երբ ցանկացած զանգ անմիջապես գրանցվում է CRM-ում, ստեղծվում են հաճախորդի քարտեր, մուտքային ժամանակ ցուցադրվում է հաճախորդի մասին տեղեկատվությունը և անմիջապես կարող ես տեսնել, թե ով է նա, ինչ է նա: կարող է վաճառել և որքան է նա պարտք: Բայց Bitrix24-ի հեռախոսակապը և դրա ինտեգրումը CRM-ի հետ ծախսեր են պահանջում, երբեմն՝ շատ: Հոդվածում ես ձեզ կպատմեմ բաց գործիքների և հանրաճանաչ IP PBX-ի հետ ինտեգրվելու փորձը freepbx, և նաև հաշվի առեք տարբեր մասերի աշխատանքի տրամաբանությունը

Ես աշխատում եմ որպես աութսորսեր մի ընկերությունում, որը վաճառում և կարգավորում է, ինտեգրում IP հեռախոսակապը: Երբ ինձ հարցրին, թե արդյոք մենք կարող ենք ինչ-որ բան առաջարկել Bitrix24-ը ինտեգրելու PBX-ներին, որոնք ունեն հաճախորդները, ինչպես նաև տարբեր VDS ընկերությունների վիրտուալ PBX-ների հետ, ես գնացի Google: Եվ, իհարկե, նա ինձ հղում տվեց հոդվածը habr, որտեղ կա նկարագրություն, և github, և ամեն ինչ կարծես թե աշխատում է: Բայց երբ փորձում էին օգտագործել այս լուծումը, պարզվեց, որ Bitrix24-ն այլևս նախկինի նման չէ, և շատ բան պետք է վերամշակվի: Բացի այդ, FreePBX-ը ձեզ համար մերկ աստղանիշ չէ, այստեղ դուք պետք է մտածեք այն մասին, թե ինչպես համատեղել օգտագործման հեշտությունը և կոշտ թվային պլանը կազմաձևման ֆայլերում:

Մենք ուսումնասիրում ենք աշխատանքի տրամաբանությունը

Այսպիսով, սկսնակների համար, թե ինչպես պետք է ամեն ինչ աշխատի: Երբ PBX-ում դրսից զանգ է ստացվում (SIP INVITE միջոցառում մատակարարից), սկսվում է հեռախոսային պլանի մշակումը (հավաքել պլան, հավաքել պլան)՝ կանոնները, թե ինչ և ինչ կարգով պետք է անել զանգը: Առաջին փաթեթից դուք կարող եք ստանալ շատ տեղեկատվություն, որը կարող է օգտագործվել կանոնների մեջ: SIP-ի ներքին կառուցվածքն ուսումնասիրելու հիանալի գործիք է անալիզատորը sngrep (ՈՒղեցույց), որը պարզապես տեղադրվում է հանրաճանաչ բաշխումներում apt install/yum install-ի և նմանատիպերի միջոցով, բայց այն կարող է կառուցվել նաև աղբյուրից։ Եկեք նայենք sngrep-ի զանգերի մուտքին

Հասկանալով FreePBX-ը և ինտեգրելով այն Bitrix24-ին և ավելին

Պարզեցված ձևով, dialplan-ը գործ ունի միայն առաջին փաթեթի հետ, երբեմն նաև զրույցի ընթացքում, զանգերը փոխանցվում են, կոճակները սեղմվում են (DTMF), տարբեր հետաքրքիր բաներ, ինչպիսիք են FollowMe, RingGroup, IVR և այլն:

Ինչ կա Invite Pack-ի ներսում

Հասկանալով FreePBX-ը և ինտեգրելով այն Bitrix24-ին և ավելին

Իրականում, պարզ թվային պլանների մեծ մասն աշխատում է առաջին երկու դաշտերի հետ, և ամբողջ տրամաբանությունը պտտվում է DID-ի և CallerID-ի շուրջ: DID - որտեղ մենք զանգում ենք, CallerID - ով է զանգում:

Բայց, ի վերջո, մենք ունենք ընկերություն և ոչ թե մեկ հեռախոս, ինչը նշանակում է, որ PBX-ը, ամենայն հավանականությամբ, ունի զանգերի խմբեր (մի քանի սարքերի միաժամանակյա / անընդմեջ զանգ) քաղաքի համարներով (Ring Group), IVR (Բարև, դուք զանգահարեցիք ... Սեղմեք մեկը ...), Պատասխանող մեքենաներ ( Արտահայտություններ), Ժամկետային Պայմաններ, Փոխանցում այլ թվերի կամ բջիջի (FollowMe, Forward): Սա նշանակում է, որ շատ դժվար է միանշանակ որոշել, թե իրականում ում հետ է զանգվելու և ում հետ կզրուցվի, երբ զանգը հասնի: Ահա մեր հաճախորդների PBX-ում սովորական զանգի սկզբի օրինակ

Հասկանալով FreePBX-ը և ինտեգրելով այն Bitrix24-ին և ավելին

Այն բանից հետո, երբ զանգը հաջողությամբ մուտքագրվում է PBX, այն անցնում է տարբեր «համատեքստերով» թվային պլանով: Աստղանիշի տեսանկյունից համատեքստը համարակալված հրամանների շարք է, որոնցից յուրաքանչյուրը պարունակում է զտիչ ըստ հավաքված համարի (այն կոչվում է exten, սկզբնական փուլում արտաքին զանգի համար exten=DID): Dialplan տողում հրամանները կարող են լինել ցանկացած բան՝ ներքին գործառույթներ (օրինակ՝ զանգահարել ներքին բաժանորդին. 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 մակրո, որից հետո չի կարելի ոչինչ անել dialplan-ում, բացի հատուկ մշակողներից (hangup handler):

Հասկանալով FreePBX-ը և ինտեգրելով այն Bitrix24-ին և ավելին

Որտե՞ղ այս զանգի ալգորիթմում պետք է տեղեկատվություն տրամադրենք CRM-ին զանգի սկզբի մասին, որտեղից սկսել ձայնագրությունը, որտեղ ավարտել ձայնագրությունը և ուղարկել այն CRM-ին զանգի մասին տեղեկատվության հետ միասին:

Ինտեգրում արտաքին համակարգերի հետ

Ի՞նչ է PBX և CRM ինտեգրումը: Սրանք կարգավորումներ և ծրագրեր են, որոնք փոխակերպում են տվյալներն ու իրադարձությունները այս երկու հարթակների միջև և ուղարկում դրանք միմյանց: Անկախ համակարգերի համար հաղորդակցվելու ամենատարածված ձևը API-ների միջոցով է, իսկ API-ներ մուտք գործելու ամենատարածված միջոցը HTTP REST-ն է: Բայց ոչ աստղանիշի համար:

Աստղանիշի ներսում հետևյալն է.

  • AGI - համաժամանակյա զանգ դեպի արտաքին ծրագրեր / բաղադրիչներ, որոնք օգտագործվում են հիմնականում հավաքագրման պլանում, կան գրադարաններ, ինչպիսիք են. phpagi, ՊԱԳԻ

  • AMI - տեքստային TCP վարդակ, որն աշխատում է իրադարձություններին բաժանորդագրվելու և տեքստային հրամաններ մուտքագրելու սկզբունքով, ներսից հիշեցնում է SMTP, կարող է հետևել իրադարձություններին և կառավարել զանգերը, կա գրադարան: PAMI - ամենահայտնին Asterisk-ի հետ կապ ստեղծելու համար

AMI ելքի օրինակ

Իրադարձություն՝ Նոր ալիք
Արտոնություն՝ զանգել, բոլորը
Ալիք՝ PJSIP/VMS_pjsip-0000078b
Ալիքի վիճակը՝ 4
ChannelStateDesc. Ring
Զանգողի IDN համարը՝ 111222
Զանգողի ID անունը՝ 111222
ConnectedLineNum:
միացված տողի անունը.
Լեզուն՝ en
հաշվի կոդը:
Համատեքստ՝ from-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»:«Զանգ», «զանգահարող»:{ «անուն»: :"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":111222, "appname":"Stasis", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"en" }, "astterisk"id":"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. Ring

Զանգողի IDN համարը՝ 111222

Զանգողի ID անունը՝ 111222

ConnectedLineNum:

միացված տողի անունը.

Լեզուն՝ en

հաշվի կոդը:

Համատեքստ՝ from-pstn

Ընդլայնել: s

Առաջնահերթություն՝ 1

Եզակի՝ 1599589046.5244

Linkedid՝ 1599589046.5244

Հավելված. Սահմանել AppData:

CallStart=1599571046

Քանի որ FreePBX-ը վերագրանցում է extension.conf և extension_ ֆայլերըլրացուցիչ.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 համատեքստեր և թույլ է տալիս չդիպչել կամ չխմբագրել FreePBX կոնֆիգուրացիաները՝ մուտքային միջոցով [ext-did-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-ը, որը համապատասխանում է ընդլայնման համարին, որտեղ եկել է զանգը: Իսկ եթե դա dial-up խումբ է: Հարցը քաղաքական է՝ անհրաժեշտ է արդյոք միանգամից կոչ ստեղծել բոլորին (երբ բոլորը միանգամից զանգում են), թե՞ ստեղծել այնպես, ինչպես իրենք են կոչում՝ հերթով զանգահարելիս։ Հաճախորդների մեծամասնությունն ունի Fisrt Available ռազմավարություն, ուստի այս հարցում խնդիր չկա, միայն մեկ զանգ է: Բայց հարցը պետք է լուծվի։

  2. Զանգի գրանցման գործառույթը Bitrix24-ում, որը վերադարձնում է CallID-ը, որն այնուհետև պետք է զեկուցի զանգի պարամետրերը և հղում դեպի ձայնագրությունը: Պահանջվում է ընդլայնման համար կամ 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

Ծառայությունը կվերագործարկվի ըստ անհրաժեշտության (վթարների դեպքում): Inbox-ի հետևման ծառայությունը չի պահանջում վեբ սերվերի տեղադրում, անհրաժեշտ է միայն php (որը հաստատ FeePBX սերվերի վրա է)։ Բայց վեբ սերվերի միջոցով զանգերի ձայնագրությունների հասանելիության բացակայության դեպքում (նաև https-ով) հնարավոր չի լինի լսել զանգերի գրառումները:

Հիմա խոսենք ելքային զանգերի մասին։ CallMeOut.php սկրիպտն ունի երկու գործառույթ.

  • Զանգի մեկնարկը, երբ հարցում է ստացվում php սկրիպտի համար (այդ թվում՝ օգտագործելով «Զանգել» կոճակը հենց Bitrix-ում): Այն չի աշխատում առանց վեբ սերվերի, հարցումը ստացվում է HTTP POST-ի միջոցով, հարցումը պարունակում է նշան

  • Զանգի, դրա պարամետրերի և գրառումների մասին հաղորդագրություն Bitrix-ում: Գործարկվում է Asterisk-ի կողմից [ենթազանգի ներքին ավարտված] թվային պլանում, երբ զանգն ավարտվում է

Հասկանալով FreePBX-ը և ինտեգրելով այն Bitrix24-ին և ավելին

Վեբ սերվերն անհրաժեշտ է միայն երկու բանի համար՝ Bitrix ձայնագրման ֆայլեր ներբեռնելու (HTTPS-ի միջոցով) և CallMeOut.php սկրիպտը կանչելու համար: Կարող եք օգտագործել ներկառուցված FreePBX սերվերը, որի ֆայլերն են /var/www/html, կարող եք տեղադրել այլ սերվեր կամ նշել այլ ուղի։

Վեբ սերվեր

Եկեք թողնենք վեբ սերվերի կարգավորումը անկախ ուսումնասիրության (tyts, tyts, tyts) Եթե ​​չունեք տիրույթ, կարող եք փորձել FreeDomain( https://www.freenom.com/ru/index.html), որը ձեզ կտա անվճար անուն ձեր սպիտակ IP-ի համար (մի մոռացեք փոխանցել 80, 443 նավահանգիստները երթուղիչի միջոցով, եթե արտաքին հասցեն միայն դրա վրա է): Եթե ​​դուք պարզապես ստեղծել եք DNS տիրույթ, ապա դուք պետք է սպասեք (15 րոպեից մինչև 48 ժամ), մինչև բոլոր սերվերները բեռնվեն: Համաձայն ներքին պրովայդերների հետ աշխատելու փորձի՝ 1 ժամից մինչև օր:

Տեղադրման ավտոմատացում

Տեղադրումը ավելի հեշտ դարձնելու համար github-ում մշակվել է տեղադրող: Բայց դա հարթ էր թղթի վրա. մինչ մենք այդ ամենը տեղադրում ենք ձեռքով, քանի որ այս ամենի հետ զուգակցելուց հետո պարզ դարձավ, թե որն է ում հետ ընկերները, ով որտեղ է գնում և ինչպես կարգաբերել այն: Տեղադրող դեռ չկա

դոկեր

Եթե ​​ցանկանում եք արագ փորձել լուծումը. կա Docker-ի տարբերակ. արագ ստեղծեք կոնտեյներ, տվեք դրսում պորտեր, սահեցրեք կարգավորումների ֆայլերը և փորձեք (սա LetsEncrypt կոնտեյների տարբերակն է, եթե արդեն ունեք վկայական, դուք պարզապես անհրաժեշտ է վերահղել հակադարձ պրոքսին դեպի 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 առանձին:

Սայլակ

Հրաժարում. Իրականության հետ ցանկացած նմանություն մտացածին է, և դա ես չեմ եղել:

Source: www.habr.com

Добавить комментарий