في الأولى و الثانية أجزاء من سلسلة من المقالات، ونحن برزت كيفية تثبيت 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 ليس صعبًا بشكل خاص ، ولكنه يتطلب قدرًا لا بأس به من العمل اليدوي. فشلنا في تحويل التكوين تلقائيًا: أنتج البرنامج النصي إصدارًا غير قابل للتشغيل ، وكان لا بد من إعادة كتابته يدويًا. في المقالة التالية ، سوف نلقي نظرة على معالج التكوين ونقوم في النهاية بتوسيع مخطط الاتصال لتلقي المكالمات الواردة وتنظيم المؤتمرات وحل مهام توجيه المكالمات الأخرى.
