Virtual PBX. الجزء 3: نقوم بترجمة النجمة إلى PjSIP بدون إيماءات غير ضرورية





في الأولى و الثانية أجزاء من سلسلة من المقالات، ونحن برزت كيفية تثبيت IP-PBX (IP-PBX) على VPS من RuVDS تشغيل أوبونتو والوظائف الأساسية تكوين باستخدام برنامج تشغيل قناة chan_sip. تم إهمال هذا الأسلوب وسيتم إسقاط دعم chan_sip في الإصدارات المستقبلية من النجمة. من الأفضل استخدام مكتبة الوسائط المتعددة PjSIP مفتوحة المصدر بدلاً من ذلك. على الرغم من الاختلافات الكبيرة في ملفات التكوين ، فإن الانتقال ليس بالصعوبة التي قد تبدو للوهلة الأولى.



ما هو PjSIP؟



من المهم أن نفهم أن PjSIP ليس بروتوكولًا جديدًا ، ولكنه مكتبة كاملة للعمل مع مجموعة من البروتوكولات التي توفر الاتصال الصوتي: SIP ، RTP ، SDP ، STUN ، إلخ. إنها مجموعة كاملة من الوحدات ، والتي تنعكس في ملف التكوين pjsip.conf (يحل محل sip.conf التقليدي). ينقسم الملف إلى أقسام ، وتعمل وحدة res_pjsip معه بشكل أساسي ، حيث يحدد كل قسم تكوين كائن ما. عادة ما تكون أسماء الأقسام محاطة بأقواس مربعة ، ويجب أن يحتوي القسم على "النوع =" البناء الذي يحدد نوعه.



يمكن أن تكون أنواع الأقسام كما يلي:



ENDPOINT - تناظرية للنظير في sip.conf ، والتي تحدد خيارات بروتوكول SIP والتفاعلات مع AOR و AUTH و TRANSPORT. مرتبطة بالضرورة بقسم AOR واحد على الأقل ؛

AOR- يصف كيفية الاتصال بـ ENDPOINT ؛

النقل - يصف هذا القسم إعدادات بروتوكول طبقة النقل ومآخذ الويب وطرق التشفير (مثل العام في sip.conf). يمكن أن يكون واحدًا لنقاط نهائية مختلفة أو فريدًا لنقطة ما ؛

التسجيل - مسؤول عن التسجيلات الصادرة ، على سبيل المثال ، جذوع لمقدمي الخدمات ؛

AUTH - يحتوي على خيارات وصلاحيات للتسجيلات الواردة والصادرة. يرتبط بها نقطة النهاية والتسجيلات ؛

تحديد الهوية - هنا يمكنك تعيين IP المصدر لـ ENDPOINT ؛

ACL - تستخدم بواسطة res_pjsip للتحكم في الاتصالات الواردة ، غير مرتبطة بـ ENDPOINT ؛

DOMAIN_ALIAS - أسماء النطاقات المستعارة ؛

اتصل- مطلوب لعدم تحديد SIP URI صراحة في Dialplan ؛

النظام - خيارات النظام ؛

عالمية - خيارات عالمية ؛



يمكن أن تكون أسماء الأقسام عشوائية في معظم الحالات ، ولكن ، على سبيل المثال ، يجب تسمية ENDPOINT و AOR بشكل مماثل لرأس SIP URI.



بالكاد يمكن اعتبار مساعدتنا شاملة ، نظرًا لوجود العديد من الرقائق المثيرة للاهتمام خلف الكواليس ، مثل معالج تكوين PjSIP: بينما نتحدث عن الترحيل إلى مكتبة جديدة مع القليل من الدم. يمكنك التعامل مع الفروق الدقيقة والدقيقة في وقت لاحق.



تحويل sip.conf إلى pjsip.conf



بسبب نمطية ، تنتشر بنية ملف التكوين pjsip.conf في طبقة رقيقة على العديد من الأقسام - إنه أكثر تعقيدًا من sip.conf القديم الجيد. فكر مطورو النجمة في وجود مشرفين بسيطين وقاموا بإنشاء برنامج نصي لتحويله. إنه مكتوب بلغة Python ، وإذا قمت ببناء برنامج من المصدر ، فهو موجود بالفعل في التوزيع: في الدليل Contrib / scripts / sip_to_pjsip / . قمنا بتثبيت Asterisk من حزمة ثنائية مضمنة في مستودع Ubuntu ، لذلك كان لابد من تنزيل البرامج النصية من GitHub.



على الرغم من أن تنسيق ملفات التكوين للإصدارات المختلفة من IP-PBX لم يتغير كثيرًا ، فمن الأفضل اختيار البرامج النصية من إصدار Asterisk الذي قمت بتثبيته بدلاً من الإصدار الافتراضي الأخير - في حالتنا 16.2.





يمكن عرض إصدار النجمة في وحدة التحكم IP-PBX باستخدام الأمر core show version version.



ستحتاج إلى جميع ملفات Python من الدليل ontrib / scripts / sip_to_pjsip / في المستودع على GitHub. يجب إضافتهم إلى دليل محلي ، انتقل إلى الدليل باستخدام تكوينات النجمة (عادةً / etc / asterisk) وقم بتشغيل البرنامج النصي sip_to_pjsip.py بامتيازات المستخدم المتميز. وتتمثل مهمتها الرئيسية في قراءة ملف الإدخال sip.conf وإنشاء ملف pjsip.conf جديد (راجع Asterisk wiki للحصول على التفاصيل).





سينشئ البرنامج النصي pjsip.conf ، وبعد ذلك سيكون عليك تلميعه يدويًا. إذا قمت بتثبيت Asterisk وفقًا لمقالاتنا ، فسيتعين عليك أيضًا تهيئة تحميل الوحدات في /etc/asterisk/modules.conf وتغيير الاستدعاء إلى تطبيق Dial في Dialplan ( /etc/asterisk/extensions.conf ).



تبين أن الملف /etc/asterisk/pjsip.conf الذي صنعه المحول معطل من الناحية العملية:



pjsip.conf
;--
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Non mapped elements start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[general]
allowoverlap = no

[office]
call-limit = 2

[sipnet]
remotesecret = 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Non mapped elements end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
--;


[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0

[sipnet]
type = aor
contact = sip:@sipnet.ru

[sipnet]
type = identify
endpoint = sipnet
match = sipnet.ru

[sipnet]
type = endpoint
context = sipnet-trunk
dtmf_mode = rfc4733
disallow = all
allow = alaw,ulaw
direct_media = no
from_user = 
from_domain = sipnet.ru
aors = sipnet

[1001]
type = aor
max_contacts = 1

[1001]
type = auth
username = 1001
password = 

[1001]
type = endpoint
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
callerid =  <1001>
auth = 1001
outbound_auth = 1001
aors = 1001

[acl]
type = acl
permit = XXX.XXX.XXX.XXX
deny = 0.0.0.0/0.0.0.0

[1002]
type = aor
max_contacts = 1

[1002]
type = auth
username = 1002
password = 

[1002]
type = endpoint
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
callerid =  <1002>
auth = 1002
outbound_auth = 1002
aors = 1002




بناء الجملة الخاص به واضح ومباشر ، ويمكن العثور على التفاصيل في Asterisk wiki . سيستغرق الأمر تحريرًا يدويًا لتنظيف ملف التكوين.



تصحيح /etc/asterisk/pjsip.conf (كما هو الحال في sip.conf، قوالب يمكن أن تستخدم في ذلك):



/etc/asterisk/pjsip.conf المصحح
;===============TRANSPORT

[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0

;===============ACL

[acl]
type = acl
deny = 0.0.0.0/0.0.0.0
permit = XXX.XXX.XXX.XXX

;===============SIPNET TRUNK

[sipnet]
type = registration
transport = transport-udp
outbound_auth = sipnet
server_uri = sip:sipnet.ru
client_uri = sip:@sipnet.ru
retry_interval = 60

[sipnet]
type = auth
auth_type = userpass
password = 
username = 

[sipnet]
type = aor
contact = sip:@sipnet.ru

[sipnet]
type = endpoint
transport = transport-udp
;      Dialplan
context = sipnet-trunk
dtmf_mode = rfc4733
disallow = all
allow = alaw,ulaw
direct_media = no
from_user = 
from_domain = sipnet.ru
outbound_auth=sipnet
aors = sipnet
 
[sipnet]
type = identify
endpoint = sipnet
match = sipnet.ru

;===============USER TEMPLATES
 
[endpoint-template](!)
type = endpoint
transport = transport-udp
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
 
[auth-template-userpass](!)
type = auth
auth_type = userpass
 
[aor-template-single-reg](!)
type = aor
; PjSIP       
max_contacts = 1

;===============User 1001

[1001](endpoint-template)
auth = auth1001
aors = 1001
callerid =  <1001>

[auth1001](auth-template-userpass)
username = 1001
password = 
 
[1001](aor-template-single-reg)

;===============User 1002

[1002](endpoint-template)
auth = auth1002
aors= 1002
callerid =  <1002>

[auth1002](auth-template-userpass)
username = 1002
password = 
 
[1002](aor-template-single-reg)




باستخدام القوالب ، يوجد عدد أقل من الأعمال الورقية ، ولكن هناك أيضًا طريقة أكثر إثارة للاهتمام لتبسيط حياة المسؤول - معالج التكوين. ربما تكون هذه إحدى الحيل الأكثر ملاءمة في PjSIP ، والتي سنتعامل معها في المقالة التالية.



إعادة كتابة Dialplan



أبسط جزء: يكفي استبدال SIP بـ PJSIP في استدعاء تطبيق Dial. بينما قمنا بتعديل بسيط لأبسط اختبار Dialplan من المقالة السابقة ، سنتعامل مع أشياء أكثر تعقيدًا لاحقًا.



ملف التكوين /etc/asterisk/extensions.conf
[general]
static=yes
writeprotect=no
priorityjumping=no
autofallthrough=yes
clearglobalvars=no

;         
[default]
exten => _X.,1,NoOp()
same => n,Busy()
same => n,HangUp()

;   homeoffice
[homeoffice]
;   
exten => _1XXX,1,Dial(PJSIP/${EXTEN})
;      SIPNET
exten => _.7XXXXXXXXXX,1,Dial(PJSIP/${EXTEN:1}@sipnet)

;   sipnet-trunk,     SIPNET
[sipnet-trunk]
;      


تبين أن الانتقال من chan_sip إلى PjSIP ليس صعبًا بشكل خاص ، ولكنه يتطلب قدرًا لا بأس به من العمل اليدوي. فشلنا في تحويل التكوين تلقائيًا: أنتج البرنامج النصي إصدارًا غير قابل للتشغيل ، وكان لا بد من إعادة كتابته يدويًا. في المقالة التالية ، سوف نلقي نظرة على معالج التكوين ونقوم في النهاية بتوسيع مخطط الاتصال لتلقي المكالمات الواردة وتنظيم المؤتمرات وحل مهام توجيه المكالمات الأخرى.










All Articles