Intellectus FreePBX et integrans eam cum Bitrix24 et amplius

Bitrix24 ingens est combinatio quae CRM, workflow, rations et multa alia quae administratores re vera amo et IT baculum non vere amo. Portus multum utitur societatibus parvis et mediocribus, in parvis clinicis, fabricatoribus et etiam salons pulchritudinis. Praecipuum munus quod administratores "amoris" est integratio telephony et CRM, cum quaelibet vocatio statim in CRM scripta est, cardines clientes creantur, cum advenientes, informationes de cliente ostenduntur et statim videre potes quis ille sit, qualis ille sit. potest vendere et quantum debet. Sed telephony a Bitrix24 eiusque integratio cum CRM pecuniam constat, interdum multum. In articulo dicam tibi experientiam integrandi instrumentis apertis et popularibus IP PBX freepbx *atque etiam logicam operum variarum partium considera

Laboro ut outsourcer in societate quae vendit ac conformat, IP telephonia integrat. Cum interrogatus sum, si aliquid huic et huic societati offerre possemus, ut Bitrix24 integraret cum PBXs clientes habere, necnon cum virtualis PBXs in variis VDS societatibus, ad Google perrexi. Et sane mihi nexum dedit articulus in habrubi est descriptio, et github, et omne opus videtur. Sed cum hac solutione uti conetur, evenit ut Bitrix24 iam non sit eadem quae antea, et multa repetenda sunt. Praeterea FreePBX asteriscus nudum tibi non est, hic cogitare debes quomodo faciliorem usum componendi et dialplanum Hardcore in fasciculis config.

Nos rationem operis studere

In primis itaque, quam id omnis laboris. Cum invitatio ab extra PBX recipitur (SIP INVITO eventum a provisore), processus dialplani (dialis consilii, dialplani) incipit - normas quid et quo ordine faciendum cum vocatione. Ex primo fasciculo, multam informationem habere potes, quae tunc in regulis adhiberi potest. Praeclarum instrumentum ad perspiciendas internas HAUSTUS est analyser sngrep (Link) quae in popularibus distributionibus simpliciter instituitur per aptum institutionem/yum et similia, sed etiam a fonte aedificari potest. Intueamur vocationem sngrep

Intellectus FreePBX et integrans eam cum Bitrix24 et amplius

In simplici forma, dialplanum solum de primo fasciculo agit, interdum etiam in colloquio, vocat transferuntur, globulum premit (DTMF), variae res interesting ut FollowMe, RingGroup, IVR et alii.

Quid intus invita Pack

Intellectus FreePBX et integrans eam cum Bitrix24 et amplius

Profecto simplicissimae dialplana operantur cum duobus primis campis, et tota logica circa DID et CallerID versatur. DID - ubi vocamus, CallerID - qui vocat.

Sed tamen, turmam habemus et non unum telephonum - id quod maxime verisimile est PBX coetus vocare (singulos simultaneos/continuos plurium machinorum) in numeris urbanis (Ring Group), IVR (Salve, vocasti... Press. unum pro ...), machinis respondens (Phrases), Temporum condiciones, Transmissio ad alios numeros vel ad cellam (Sequere, Transmittere). Hoc significat difficillimum est sine ambiguitate determinare qui vocationem actu recipiet et qui colloquium cum vocatione pervenerit habebit. Exemplum hic initii vocationis typicae in PBX clientium nostrorum

Intellectus FreePBX et integrans eam cum Bitrix24 et amplius

Post vocationem PBX feliciter intrat, per dialplanum in diversis "contextis" transit. Contextus ex parte Asterisci est numerus mandatorum constitutus, quorum unumquodque colum a numero dialedo continet (exten- tum appellatur, nam externa vocatio ad initium exten=DID). Mandata in linea dialplan esse aliquid possunt - functiones internas (exempli gratia, subscribens internam appellant - Dial(), telephonum descendit - Hangup()) conditionalis operariorum (IF, ELSE, ExecIF et similia, transitus ad alias regulas huius loci.Goto, GotoIF) , transitus ad alios contextus in forma vocationis (Gosub, Macro). A directivum separatum include имя_контекста, quae ab alio contextu ad finem praesentis temporis praecepta addit. Mandata inclusa via includit semper supplicium после mandata hodierna.

Tota logica FreePBX constructa est in inclusione diversorum contextuum in se invicem per includendi et vocati per Gosub, Macro et Handler tractores. Considerans contextum vocat FreePBX advenientis

Intellectus FreePBX et integrans eam cum Bitrix24 et amplius

Vocatio per omnes contextus a summo ad imum vicissim percurrit, in singulis contextibus vocari possunt ad alios contextus sicut macros (Macro), functiones (Gosub) vel sicut transitus (Goto), ita verum lignum quod appellatur non potest nisi. investiganda sunt omnia.

A typicam figuram habeat pro typico PBX infra ostendetur. Cum vocatio, DID in ineuntes inquiritur, condiciones temporales pro ea sedantur, si omnia ordinentur, vox menu emissa est. Ex eo, premendo bullam 1 vel timeout, exit in coetum operariorum dialing. Post vocationum fines, tortor vocatur hangupcallus, post quem nihil in dialplano fieri potest, praeter speciales tractores (handup tracto).

Intellectus FreePBX et integrans eam cum Bitrix24 et amplius

Ubi in hac vocatione algorithmus informationes suppeditare debet de initio vocationis ad CRM, ubi ad recordationem incipiendum, ubi ad amussim finiendum eamque cum informationibus de vocatione ad CRM mittendum?

Integratio cum systematibus externis

Quid est integratio PBX et CRM? Hi sunt occasus et programmata quae notitias et eventus convertunt inter haec duo suggesta et ea inter se mittunt. Frequentissima via systematum independentium communicandi per APIs est, et via popularis ad APIs accessus est HTTP REQUIES. Sed non asterisco.

Intus Asteriscus est:

  • AGI - synchrona vocatio programmatum externorum/componentium, maxime in dialplano adhibita, bibliothecae sunt similia phpagi, PAGI

  • AMI - textus TCP nervus qui operatur in principio scribendi eventibus ac mandatis textus intrantibus, similis ESMTP ab interiori, eventus investigare et vocat regere potest, bibliotheca est. PAMI - maxime popularibus ad connexionem cum Asterisco creando

AMI output example

Eventus: Novus alveus
Privilegium: vocatio, all
Channel: PJSIP/VMS_pjsip-0000078b
Channel State: 4
ChannelStateDesc: Ring
CallerIDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
linename connexa;
Lingua: en
propter codicem:
Contextus: from-pstn
Exten: s
Prior: I
Uniqueid: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI mixtura utriusque, tota via REST, WebSocket, in forma JSON - sed in recentibus bibliothecis et involucris, non valde bonis, repertis (phparia, phpari) quae in evolutione circiter 3 annos facta est.

Exemplum ARI output cum invitatio initiatur

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "fluvium":{ "id »:»1599644315.5334″, «nomen»: »PJSIP/VMSpjsip-000007b6″, "status": "Ring", "rector":{ "nomen":"111222″, "numerus":" 111222″ }, "connexum": { "nomen":", "numerus" :" }, "accountcode":", "dialplan":{ "contextum": "ex-pstn", "exten":"s", "prioritas": 2, "app.nomen": "Stasis", "appdata", "salve mundi" }, "asteriscus":"2020-09-09T09:38:35.926+0000", "lingua": "en" }, "asteriscusid":"48:5b:aa:aa:aa:aa", "applicatio": "salve mundi" }

Commodum vel incommodum, possibilitas vel impossibilitas operandi cum particulari API determinantur per opera quae solvenda sunt. Operae integrationis cum CRM sunt haec:

  • Initium vocationis, ubi translatum est, excute CallerID, DID, incipiunt et extrema tempora, fortasse notitia ex indicem (ad quaerendum nexum inter telephonum et CRM usorem)

  • Incipere et finire recordationem vocationis, eam in forma desiderata, certiorem facere in fine actis diurnis ubi tabella sita est.

  • Inchoare vocationem ad eventum externum (ex ratione), vocare numerum internum, numerum externum eosque coniungere

  • libitum: integrare cum CRM, coetibus dialeticis et FollowME pro latae translationis vocationis in absentia loci (secundum CRM)

Omnia haec officia per AMI vel ARI solvi possunt, sed ARI multo minus notitias praebet, multae eventus non sunt, multae variabiles adhuc AMI (exempli gratia, tortor vocat, variabiles intra macros, inter recordationem vocant) non pervestigatae sunt. Itaque ad rectam et accuratam semitam, nunc AMI eligamus (sed non omnino). Praeterea (bene ubi sine hoc esset, homines pigri sumus) - in opere originali.articulus in habr) uti PAMI. *Tunc opus est ut conetur rescribere ad ARI, sed non opus est.

Reinventing integration

Ut nostris FreePBX in simplicibus modis circa principium vocationis, finis temporis, numeri, nomina tabulariorum conscriptorum referre possimus, durationem vocationis eadem stropha cum auctoribus auctoribus calculare facillimum est. - Intrant variabiles et parse output ad eorum praesentiam. PAMI suggerit hoc simpliciter per filtrum functionem facere.

Exemplum est hic ponere proprium tuum variabile ad tempus vocationis initium (s est numerus specialis in dialplano quod fit ante initium quaerendi)

[ext-did-custom]

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

Exemplum AMI huius rei

Eventus: Novus alveus

Privilegium: vocatio, all

Channel: PJSIP/VMS_pjsip-0000078b

Channel State: 4

ChannelStateDesc: Ring

CallerIDNum: 111222

CallerIDName: 111222

ConnectedLineNum:

linename connexa;

Lingua: en

propter codicem:

Contextus: from-pstn

Exten: s

Prior: I

Uniqueid: 1599589046.5244

Linkedid: 1599589046.5244

Applicationem: pone AppData:

CallStart=1599571046

Quia FreePBX overwrites ad extension.conf et extension_ filesadditional.conf, utemur tabella extension_consuetudinem.conf

Plenum codicem extention_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

Pluma et differentia ab originali dialplano auctorum archetypi articuli -

  • Dialplan in .conf forma, sicut FreePBX vult (sic, potest .ael, sed non omnes versiones et non semper commodam)

  • Instead of expediendi finem per exten=>h, processus per hangup_handler introductus est, quia FreePBX dialplanum solum cum eo laboravit.

  • Certum scriptionem chordae vocant, additae quotes et numerum vocationis externae ExtNum

  • Processus ad contextus consuetudo movetur et permittit te non tangere vel recensere FreePBX configs - ineuntes per [ext-did-mos-], per [Outbound, allroutes, consuetudo]

  • Nihil obstringens ad numeros - tabella universalis est et solum configurari debet pro via et nexu cum servo

Ut incipias, debes etiam scripta in AMI currere per rationem et clavem - hoc enim, FreePBX etiam fasciculum _customum habet.

manager_custom.conf file

;;  это логин
[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

Utraque lima in /etc/asterisco collocanda est, deinde configs (vel asterisco sileo) legendo.

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

Nunc transeamus ad PHP

Scripta initializing et creando servitium

Cum schema operandi cum Bitrix 24, usus pro AMI, non est omnino simplex et perspicuus, separatim disputandum est. Asteriscus, cum reducitur AMI, simpliciter portum aperit et illud est. Cum cliens coniungit, licentiam petit, cliens eventibus necessariis subscribet. Eventus in textu manifesto veniunt, qui PAMI in res structas convertitur et facultatem praebet ut munus eliquandi solum ad eventa usurarum, agrorum, numeri, etc.

Cum vocatio venit, NewExten eventus a parente [a-pstn] contextu incipiens accenditur, tum certe in ordine linearum in contextu contextus ingrediuntur. Cum indicia ex CallMeCallerIDName et CallStart variabilium in usu dialplano denotatas recipitur.

  1. Munus petendi UserID respondet numero extensioni ubi vocatio venit. Quid si horologium coetus? Politica quaestio est, numquid opus est ut omnes simul vocantes (cum omnes simul vocant) an efficiant ut vocant, cum vicissim vocant? Plerique clientes belli Available Fisrt habent, ergo cum hoc non est dubium, solum unum vocat. Sed exitus certus est.

  2. Vocatio adscriptionis munus in Bitrix24, quod CallID redit, quod tunc opus est nuntiare vocationi parametri et nexum cum recordatione. Aut numerum vel extensionem requirit UserID

Intellectus FreePBX et integrans eam cum Bitrix24 et amplius

Post finem vocationis, munus downloade recordum appellatur, quod simul refert statum vocationis complementum (Busy, No responsum, Success), et etiam nexum downloads cum instrumento mp3 (si).

Quia CallMeIn.php modulus continuus currere debet, fasciculus satus SystemD pro eo creatus est callme.service, quod conici debet in /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

initialization and launch of the script occurs through systemctl or service

# systemctl enable callme
# systemctl start callme

Ministerium ipsum ut opus sileo (in casu ruinis). Intheca servitium tracking non requirit ut servo interretiali instituatur, solum php opus est (quod est certus in servo FeePBX). Sed sine accessu ad litteras electronicas per Web server (etiam cum https), audire tabulas appellare non poterit.

Nunc de exitu vocat fama. In CallMeOut.php scriptor duo munera habet:

  • Initiatio vocationis cum petitio pro scripto php accipitur (including bullam "vocationis" in ipsa Bitrix). Sine servo telam non operatur, petitio per HTTP POST recipitur, petitio signum continet

  • Nuntius de vocatione, parametris et monumentis in Bitrix. Asteriscus accensus in [sub-call-internal-finitus] dialplan cum appellatione desinit

Intellectus FreePBX et integrans eam cum Bitrix24 et amplius

Servo interretiali tantum duabus rebus opus est - tabulariorum recordum Bitrix downloading (per HTTPS) et vocantem CallMeOut.php script. In Servo FreePBX aedificato uti potes, tabellas pro quibus /var/www/html sunt, alium servo instituere vel aliam viam exprimere potes.

Web server

Relinquemus telam server setup pro independens studio (tyts ", tyts ", tyts "). Si domain non habes, FreeDomain experiri potes ( https://www.freenom.com/ru/index.html) , quod liberum nomen tibi tradet pro albo IP tuo (portus deinceps noli oblivisci 80, 443 per iter, si inscriptio externa tantum in eo est). Si modo DNS dominium creasti, tunc exspectandum est (ab 15 minutis ad 48 horas) donec omnes servientes onerentur. Secundum experientiam laboris cum provisoribus domesticis — ab hora 1 ad diem.

institutionem automation

Installer in github elaboratum est ut institutionem faciliorem redderet. Sed levis in charta erat - dum omnia manually nos insternimus, quoniam tinnitus cum his omnibus liquido claruit quid sit amicis cum quibus, qui it quo et quomodo debug. Non est tamen installer

Docker

Si vis cito solutionem experiri - optio est cum Docker - cito fac continens, da portum foris, lapsus imaginum uncinorum et experire (hoc est optio cum LetsEncrypt continente, si libellum iam habes. , vos iustus postulo ut vicissim procuratorem ad FreePBX interretialem server (dedimus ei alium portum 88), LetsEncrypt in docker fundatum. hoc articulum

Te necesse est tabellam currere in tabula in folder (post clone git) asterisco ingredere confis (asterisco folder) et scribe vias ad tabulas et domicilium situs tui ibi

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:

Hoc docker-compose.yaml Scapus currere per

docker-compose up -d

Si nginx non incipit, ergo aliquid mali est cum configuratione in nginx/ssl_docker.conf folder

Aliae integrationes

Et cur non CRM in scriptoribus aliquid posui simul, nobis visum est. Pluribus aliis CRM APIs studuimus, praesertim gratis constructis in PBX - ShugarCRM et Vtiger, et sic! principium vero idem est. Sed haec alia est fabula, quam postea separatim ad github onerabimus.

References

Disclaimer: Omnis similitudo rei ficta est et non me.

Source: www.habr.com

Add a comment