FreePBX کو سمجھنا اور اسے Bitrix24 اور مزید کے ساتھ مربوط کرنا

Bitrix24 ایک بہت بڑا کمبائن ہے جو CRM، ورک فلو، اکاؤنٹنگ اور بہت سی دوسری چیزوں کو یکجا کرتا ہے جو مینیجرز کو واقعی پسند ہے اور IT عملہ واقعی پسند نہیں کرتا ہے۔ پورٹل کو بہت سی چھوٹی اور درمیانے درجے کی کمپنیاں استعمال کرتی ہیں، جن میں چھوٹے کلینک، مینوفیکچررز اور یہاں تک کہ بیوٹی سیلون بھی شامل ہیں۔ مینیجر جو اہم کام "محبت" کرتے ہیں وہ ٹیلی فونی اور CRM کا انضمام ہے، جب کوئی بھی کال فوری طور پر CRM میں ریکارڈ کی جاتی ہے، کلائنٹ کارڈز بنائے جاتے ہیں، آنے والے وقت، کلائنٹ کے بارے میں معلومات ظاہر ہوتی ہیں اور آپ فوری طور پر دیکھ سکتے ہیں کہ وہ کون ہے، وہ کیا ہے۔ بیچ سکتا ہے اور اس کا کتنا مقروض ہے۔ لیکن Bitrix24 سے ٹیلی فونی اور CRM کے ساتھ اس کے انضمام پر پیسہ خرچ ہوتا ہے، بعض اوقات بہت زیادہ۔ مضمون میں میں آپ کو اوپن ٹولز اور مقبول آئی پی پی بی ایکس کے ساتھ انضمام کا تجربہ بتاؤں گا۔ فری پی بی ایکس، اور مختلف حصوں کے کام کی منطق پر بھی غور کریں۔

میں ایک ایسی کمپنی میں آؤٹ سورس کے طور پر کام کرتا ہوں جو آئی پی ٹیلی فونی کو فروخت اور ترتیب دیتی ہے، انٹیگریٹ کرتی ہے۔ جب مجھ سے پوچھا گیا کہ کیا ہم اس اور اس کمپنی کو Bitrix24 کو PBXs کے ساتھ ضم کرنے کے لیے کچھ پیش کر سکتے ہیں جو صارفین کے پاس ہے، نیز مختلف VDS کمپنیوں پر ورچوئل PBXs کے ساتھ، میں گوگل گیا۔ اور یقیناً اس نے مجھے ایک لنک دیا۔ habr میں مضمون، جہاں ایک وضاحت، اور گیتوب ہے، اور ہر چیز کام کرتی نظر آتی ہے۔ لیکن جب اس حل کو استعمال کرنے کی کوشش کی گئی تو معلوم ہوا کہ Bitrix24 اب پہلے جیسا نہیں رہا اور بہت کچھ دوبارہ کرنے کی ضرورت ہے۔ اس کے علاوہ، FreePBX آپ کے لیے کوئی ننگا ستارہ نہیں ہے، یہاں آپ کو یہ سوچنے کی ضرورت ہے کہ کنفگ فائلوں میں استعمال میں آسانی اور ایک کٹر ڈائل پلان کو کیسے یکجا کیا جائے۔

ہم کام کی منطق کا مطالعہ کرتے ہیں۔

تو شروعات کرنے والوں کے لیے، یہ سب کیسے کام کرنا چاہیے۔ جب PBX کے باہر سے کال موصول ہوتی ہے (فراہم کنندہ سے SIP INVITE ایونٹ)، ڈائل پلان (ڈائل پلان، ڈائل پلان) کی پروسیسنگ شروع ہوتی ہے - اس بات کے قواعد کہ کال کے ساتھ کیا اور کس ترتیب میں کرنا ہے۔ پہلے پیکٹ سے، آپ بہت ساری معلومات حاصل کر سکتے ہیں، جسے پھر قواعد میں استعمال کیا جا سکتا ہے۔ SIP کے اندرونی مطالعہ کے لیے ایک بہترین ٹول تجزیہ کار ہے۔ sngrep (لنک) جو مقبول ڈسٹری بیوشنز میں apt install/yum install اور اس طرح کے ذریعے آسانی سے انسٹال ہوتا ہے، لیکن اسے ماخذ سے بھی بنایا جا سکتا ہے۔ آئیے sngrep میں کال لاگ کو دیکھتے ہیں۔

FreePBX کو سمجھنا اور اسے Bitrix24 اور مزید کے ساتھ مربوط کرنا

ایک آسان شکل میں، ڈائل پلان صرف پہلے پیکٹ کے ساتھ ہی ڈیل کرتا ہے، بعض اوقات بات چیت کے دوران بھی کالز کی منتقلی، بٹن دبانے (DTMF)، مختلف دلچسپ چیزیں جیسے FollowMe، RingGroup، IVR اور دیگر۔

Invite Pack کے اندر کیا ہے۔

FreePBX کو سمجھنا اور اسے Bitrix24 اور مزید کے ساتھ مربوط کرنا

دراصل، سب سے آسان ڈائل پلان پہلے دو فیلڈز کے ساتھ کام کرتے ہیں، اور پوری منطق DID اور CallerID کے گرد گھومتی ہے۔ DID - جہاں ہم کال کر رہے ہیں، CallerID - کون کال کر رہا ہے۔

لیکن آخر کار، ہمارے پاس ایک کمپنی ہے نہ کہ ایک فون - جس کا مطلب ہے کہ PBX میں شہر کے نمبروں (رنگ گروپ) پر کال گروپس (ایک ساتھ/مسلسل کئی آلات کی گھنٹی)، IVR (ہیلو، آپ نے کال کی ہے... پریس کریں) ایک کے لیے...)، جواب دینے والی مشینیں (جملے)، وقت کی شرائط، دوسرے نمبروں پر یا سیل کو بھیجنا (FollowMe، Forward)۔ اس کا مطلب یہ ہے کہ یہ واضح طور پر طے کرنا بہت مشکل ہے کہ اصل میں کال کس کو موصول ہوگی اور کال آنے پر کس کے ساتھ بات چیت ہوگی۔ یہاں ہمارے کلائنٹس کے PBX میں ایک عام کال کے آغاز کی ایک مثال ہے۔

FreePBX کو سمجھنا اور اسے Bitrix24 اور مزید کے ساتھ مربوط کرنا

کال کامیابی کے ساتھ PBX میں داخل ہونے کے بعد، یہ ڈائل پلان کے ذریعے مختلف "سیاق و سباق" میں سفر کرتی ہے۔ Asterisk کے نقطہ نظر سے سیاق و سباق کمانڈز کا ایک عدد سیٹ ہے، جن میں سے ہر ایک ڈائل کردہ نمبر کے ذریعے ایک فلٹر پر مشتمل ہوتا ہے (اسے exten کہا جاتا ہے، ابتدائی مرحلے پر ایک بیرونی کال کے لیے exten=DID)۔ ڈائلپلان لائن میں کمانڈز کچھ بھی ہو سکتے ہیں - اندرونی افعال (مثال کے طور پر، اندرونی سبسکرائبر کو کال کریں - Dial()فون نیچے رکھ دو- Hangup()مشروط آپریٹرز (IF, ELSE, ExecIF اور اسی طرح)، اس سیاق و سباق کے دوسرے اصولوں میں منتقلی (Goto, GotoIF)، فنکشن کال (گوسوب، میکرو) کی شکل میں دوسرے سیاق و سباق میں منتقلی۔ ایک الگ ہدایت include имя_контекста, جو موجودہ سیاق و سباق کے اختتام پر دوسرے سیاق و سباق سے کمانڈز کو شامل کرتا ہے۔ شامل کے ذریعے شامل کمانڈز پر ہمیشہ عمل کیا جاتا ہے۔ کے بعد موجودہ سیاق و سباق کے احکامات۔

FreePBX کی پوری منطق گوسوب، میکرو اور ہینڈلر ہینڈلرز کے ذریعے شامل اور کال کے ذریعے مختلف سیاق و سباق کو ایک دوسرے میں شامل کرنے پر بنائی گئی ہے۔ آنے والی FreePBX کالوں کے سیاق و سباق پر غور کریں۔

FreePBX کو سمجھنا اور اسے Bitrix24 اور مزید کے ساتھ مربوط کرنا

کال باری باری اوپر سے نیچے تک تمام سیاق و سباق سے گزرتی ہے، ہر سیاق و سباق میں دوسرے سیاق و سباق جیسے میکروز (میکرو)، فنکشنز (گوسوب) یا صرف ٹرانزیشنز (گوٹو) پر کال ہو سکتی ہے، لہذا جس چیز کو کہا جاتا ہے اس کا اصل درخت صرف کر سکتا ہے۔ نوشتہ جات میں ٹریک کیا جائے۔

ایک عام PBX کے لیے ایک عام سیٹ اپ خاکہ ذیل میں دکھایا گیا ہے۔ کال کرتے وقت، آنے والے راستوں میں ڈی آئی ڈی کو تلاش کیا جاتا ہے، اس کے لیے عارضی حالات کی جانچ پڑتال کی جاتی ہے، اگر سب کچھ درست ہے، تو وائس مینیو لانچ کیا جاتا ہے۔ اس سے، بٹن 1 دبا کر یا ٹائم آؤٹ، ڈائلنگ آپریٹرز کے گروپ سے باہر نکلیں۔ کال ختم ہونے کے بعد، ہینگ اپ کال میکرو کو بلایا جاتا ہے، جس کے بعد ڈائل پلان میں کچھ نہیں کیا جا سکتا، سوائے خصوصی ہینڈلرز (ہینگ اپ ہینڈلر) کے۔

FreePBX کو سمجھنا اور اسے Bitrix24 اور مزید کے ساتھ مربوط کرنا

اس کال الگورتھم میں ہمیں CRM کو کال کے آغاز کے بارے میں معلومات کہاں فراہم کرنی چاہیے، ریکارڈنگ کہاں سے شروع کرنی ہے، ریکارڈنگ کہاں ختم کرنی ہے اور CRM کو کال کے بارے میں معلومات کے ساتھ بھیجنا چاہیے؟

بیرونی نظام کے ساتھ انضمام

PBX اور CRM انضمام کیا ہے؟ یہ وہ ترتیبات اور پروگرام ہیں جو ان دو پلیٹ فارمز کے درمیان ڈیٹا اور ایونٹس کو تبدیل کرتے ہیں اور انہیں ایک دوسرے کو بھیجتے ہیں۔ آزاد نظاموں کے لیے بات چیت کا سب سے عام طریقہ APIs کے ذریعے ہے، اور APIs تک رسائی کا سب سے مقبول طریقہ HTTP REST ہے۔ لیکن نجمہ کے لیے نہیں۔

نجمہ کے اندر ہے:

  • AGI - بیرونی پروگراموں / اجزاء کے لئے ہم وقت ساز کال، جو بنیادی طور پر ڈائل پلان میں استعمال ہوتی ہے، وہاں لائبریریاں ہیں جیسے phpagi, PAGI

  • AMI - ایک ٹیکسٹ TCP ساکٹ جو ایونٹس کو سبسکرائب کرنے اور ٹیکسٹ کمانڈز داخل کرنے کے اصول پر کام کرتا ہے، اندر سے SMTP سے مشابہت رکھتا ہے، واقعات کو ٹریک کرسکتا ہے اور کالز کا انتظام کرسکتا ہے، یہاں ایک لائبریری موجود ہے۔ PAMI - نجمہ کے ساتھ کنکشن بنانے کے لیے سب سے زیادہ مقبول

AMI آؤٹ پٹ کی مثال

واقعہ: نیا چینل
استحقاق: کال، تمام
چینل: PJSIP/VMS_pjsip-0000078b
چینل کی حالت: 4
ChannelStateDesc: رنگ
کالر آئی ڈی نمبر: 111222
کالر ID نام: 111222
ConnectedLineNum:
منسلک لائن نام:
زبان: en
اکاؤنٹ کوڈ:
سیاق و سباق: from-pstn
توسیع: s
ترجیح: 1
منفرد: 1599589046.5244
لنکڈ: 1599589046.5244

  • ARI دونوں کا مرکب ہے، سبھی REST، WebSocket کے ذریعے، JSON فارمیٹ میں - لیکن تازہ لائبریریوں اور ریپرز کے ساتھ، بہت اچھا نہیں، آف ہینڈ پایا (phparia, phpari) جو تقریباً 3 سال قبل ان کی نشوونما میں بنی تھی۔

کال شروع ہونے پر ARI آؤٹ پٹ کی مثال

{ "متغیر":"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":"سٹیسیس"، "ایپdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "Language":"en" }, "Asteriskid":"48:5b:aa:aa:aa:aa", "application":"Hello-world" }

سہولت یا تکلیف، کسی خاص API کے ساتھ کام کرنے کے امکانات یا ناممکنات کا تعین ان کاموں سے ہوتا ہے جنہیں حل کرنے کی ضرورت ہوتی ہے۔ CRM کے ساتھ انضمام کے کام درج ذیل ہیں:

  • کال کے آغاز کا پتہ لگائیں، جہاں اسے منتقل کیا گیا تھا، کالر آئی ڈی، ڈی آئی ڈی، شروع اور اختتامی اوقات، شاید ڈائرکٹری سے ڈیٹا نکالیں (فون اور CRM صارف کے درمیان کنکشن تلاش کرنے کے لیے)

  • کال کی ریکارڈنگ شروع اور ختم کریں، اسے مطلوبہ فارمیٹ میں محفوظ کریں، ریکارڈنگ کے اختتام پر بتائیں کہ فائل کہاں ہے۔

  • کسی بیرونی ایونٹ پر کال شروع کریں (پروگرام سے)، ایک اندرونی نمبر، ایک بیرونی نمبر پر کال کریں اور ان کو جوڑیں۔

  • اختیاری: کسی جگہ کی غیر موجودگی میں کالز کی خودکار منتقلی کے لیے CRM، ڈائلر گروپس اور FollowME کے ساتھ ضم کریں (سی آر ایم کے مطابق)

ان تمام کاموں کو 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

کالر ID نام: 111222

ConnectedLineNum:

منسلک لائن نام:

زبان: en

اکاؤنٹ کوڈ:

سیاق و سباق: from-pstn

توسیع: s

ترجیح: 1

منفرد: 1599589046.5244

لنکڈ: 1599589046.5244

درخواست: سیٹ ایپ ڈیٹا:

کال اسٹارٹ=1599571046

کیونکہ FreePBX extention.conf اور extention_ فائلوں کو اوور رائٹ کر دیتا ہے۔extra.conf، ہم فائل استعمال کریں گے۔ توسیع_اپنی مرضی کے.conf

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

اصل مضمون کے مصنفین کے اصل ڈائل پلان سے خصوصیت اور فرق -

  • .conf فارمیٹ میں ڈائل پلان، جیسا کہ FreePBX چاہتا ہے (ہاں، یہ .ael کر سکتا ہے، لیکن تمام ورژن نہیں اور یہ ہمیشہ آسان نہیں ہوتا)

  • exten=>h کے ذریعے اختتام پر کارروائی کرنے کے بجائے، hangup_handler کے ذریعے پروسیسنگ متعارف کرائی گئی، کیونکہ FreePBX ڈائل پلان صرف اس کے ساتھ کام کرتا تھا۔

  • فکسڈ اسکرپٹ کال سٹرنگ، اضافی قیمتیں اور ایکسٹرنل کال نمبر ExtNum

  • پروسیسنگ کو _کسٹم سیاق و سباق میں منتقل کیا جاتا ہے اور آپ کو فری پی بی ایکس کنفیگرز کو چھونے یا ترمیم کرنے کی اجازت نہیں دیتا ہے - آنے والے کے ذریعے [ext-did- 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

اب پی ایچ پی کی طرف چلتے ہیں۔

اسکرپٹ شروع کرنا اور سروس بنانا

چونکہ Bitrix 24 کے ساتھ کام کرنے کی اسکیم، AMI کے لیے ایک سروس، مکمل طور پر سادہ اور شفاف نہیں ہے، اس لیے اس پر الگ سے بحث کی جانی چاہیے۔ نجمہ، جب AMI ایکٹیویٹ ہوتا ہے، تو بس پورٹ کھولتا ہے اور بس۔ جب کوئی کلائنٹ جوائن کرتا ہے، تو وہ اجازت کی درخواست کرتا ہے، پھر کلائنٹ ضروری ایونٹس کو سبسکرائب کرتا ہے۔ واقعات سادہ متن میں آتے ہیں، جسے PAMI ساختی اشیاء میں تبدیل کرتا ہے اور صرف دلچسپی کے واقعات، فیلڈز، نمبرز وغیرہ کے لیے فلٹرنگ فنکشن سیٹ کرنے کی صلاحیت فراہم کرتا ہے۔

جیسے ہی کال آتی ہے، NewExten ایونٹ کو پیرنٹ [from-pstn] سیاق و سباق سے شروع کر دیا جاتا ہے، پھر تمام ایونٹس سیاق و سباق میں لائنوں کی ترتیب میں چلتے ہیں۔ جب CallMeCallerIDName اور CallStart متغیرات سے معلومات موصول ہوتی ہیں جو _custom dialplan میں بتائی گئی ہیں،

  1. یوزر آئی ڈی کی درخواست کرنے کا فنکشن اس ایکسٹینشن نمبر سے مطابقت رکھتا ہے جہاں کال آئی تھی۔ اگر یہ ایک ڈائل اپ گروپ ہے تو کیا ہوگا؟ سوال سیاسی ہے، کیا آپ کو ایک ہی وقت میں سب کو کال کرنے کی ضرورت ہے (جب سب ایک ہی وقت میں کال کریں) یا جب وہ باری باری کال کرتے ہیں تو اس طرح تخلیق کریں؟ زیادہ تر کلائنٹس کے پاس 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 enable callme
# systemctl start callme

سروس ضرورت کے مطابق خود کو دوبارہ شروع کرے گی (کریش ہونے کی صورت میں)۔ ان باکس ٹریکنگ سروس کو کسی ویب سرور کو انسٹال کرنے کی ضرورت نہیں ہے، صرف پی ایچ پی کی ضرورت ہے (جو یقینی طور پر FeePBX سرور پر ہے)۔ لیکن ویب سرور (https کے ساتھ بھی) کے ذریعے کال ریکارڈز تک رسائی نہ ہونے کی صورت میں کال ریکارڈز کو سننا ممکن نہیں ہوگا۔

اب بات کرتے ہیں آؤٹ گوئنگ کالز کے بارے میں۔ CallMeOut.php اسکرپٹ کے دو کام ہیں:

  • php اسکرپٹ کے لیے درخواست موصول ہونے پر کال کا آغاز (بشمول بِٹرکس میں ہی "کال" بٹن استعمال کرنا)۔ یہ ویب سرور کے بغیر کام نہیں کرتا، درخواست HTTP POST کے ذریعے موصول ہوتی ہے، درخواست میں ایک ٹوکن ہوتا ہے۔

  • Bitrix میں کال، اس کے پیرامیٹرز اور ریکارڈ کے بارے میں پیغام۔ کال ختم ہونے پر [sub-cal-internal-ended] ڈائل پلان میں Asterisk کے ذریعے فائر کیا گیا

FreePBX کو سمجھنا اور اسے Bitrix24 اور مزید کے ساتھ مربوط کرنا

ویب سرور کی ضرورت صرف دو چیزوں کے لیے ہے - Bitrix ریکارڈ فائلوں کو ڈاؤن لوڈ کرنا (HTTPS کے ذریعے) اور CallMeOut.php اسکرپٹ کو کال کرنا۔ آپ بلٹ ان FreePBX سرور استعمال کر سکتے ہیں، وہ فائلیں جن کے لیے /var/www/html ہیں، آپ دوسرا سرور انسٹال کر سکتے ہیں یا کوئی مختلف راستہ بتا سکتے ہیں۔

ویب سرور

آئیے آزاد مطالعہ کے لیے ویب سرور سیٹ اپ چھوڑ دیں (ٹائٹس, ٹائٹس, ٹائٹس)۔ اگر آپ کے پاس ڈومین نہیں ہے تو آپ فری ڈومین کو آزما سکتے ہیں۔ https://www.freenom.com/ru/index.html)، جو آپ کو آپ کے سفید IP کے لیے ایک مفت نام دے گا (اگر بیرونی ایڈریس صرف اس پر ہے تو روٹر کے ذریعے پورٹ 80, 443 کو فارورڈ کرنا نہ بھولیں)۔ اگر آپ نے ابھی ایک DNS ڈومین بنایا ہے، تو آپ کو (15 منٹ سے 48 گھنٹے تک) انتظار کرنا پڑے گا جب تک کہ تمام سرورز لوڈ نہ ہوں۔ گھریلو فراہم کنندگان کے ساتھ کام کرنے کے تجربے کے مطابق - 1 گھنٹے سے ایک دن تک۔

انسٹالیشن آٹومیشن

تنصیب کو مزید آسان بنانے کے لیے گیتھب پر ایک انسٹالر تیار کیا گیا ہے۔ لیکن یہ کاغذ پر ہموار تھا - جب کہ ہم یہ سب دستی طور پر انسٹال کر رہے ہیں، کیونکہ اس سب کے ساتھ چھیڑ چھاڑ کرنے کے بعد یہ واضح ہو گیا کہ کس کے ساتھ دوستی ہے، کون کہاں جاتا ہے اور اسے کیسے ڈیبگ کرنا ہے۔ ابھی تک کوئی انسٹالر نہیں ہے۔

میں Docker

اگر آپ حل کو جلدی سے آزمانا چاہتے ہیں تو - ڈوکر کے ساتھ ایک آپشن ہے - جلدی سے ایک کنٹینر بنائیں، اسے باہر کی بندرگاہیں دیں، سیٹنگ فائلوں کو سلپ کریں اور آزمائیں (یہ LetsEncrypt کنٹینر کے ساتھ آپشن ہے، اگر آپ کے پاس پہلے سے ہی سرٹیفکیٹ ہے، تو آپ صرف ریورس پراکسی کو FreePBX ویب سرور پر ری ڈائریکٹ کرنے کی ضرورت ہے (ہم نے اسے ایک اور پورٹ دیا ہے 88)، LetsEncrypt in docker کی بنیاد پر اس مضمون کا

آپ کو ڈاؤن لوڈ کردہ پراجیکٹ فولڈر میں فائل چلانے کی ضرورت ہے (گٹ کلون کے بعد)، لیکن پہلے ستارہ کنفیگرس (اسٹرسک فولڈر) میں جائیں اور وہاں ریکارڈز اور اپنی سائٹ کے یو آر ایل کے راستے لکھیں۔

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 APIs کا مطالعہ کیا، خاص طور پر مفت بلٹ ان PBX - ShugarCRM اور Vtiger، اور ہاں! جی ہاں، اصول ایک ہی ہے. لیکن یہ ایک اور کہانی ہے، جسے ہم بعد میں گیتھب پر الگ سے اپ لوڈ کریں گے۔

حوالہ جات

ڈس کلیمر: حقیقت سے کوئی مشابہت فرضی ہے اور یہ میں نہیں تھا۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں