تم إيقاف هذا المشروع الآن.
هذا لأنني صادفت مشروع Drachtio الذي يشترك في نفس الرؤية والهيكل اللذين كنت في ذهني لهذا المشروع. Drachtio هو مكون واحد فقط من هذا المشروع - لذلك تحول هذا المتوقع إلى مشاريع أخرى من شأنها في نهاية المطاف من جميع المكونات المطلوبة للحصول على PBX لينة.
هناك المزيد للقيام به ، بما في ذلك التواجد.
تم تصميم Project MediaSwitch ليكون مفتاح VoIP قابل للتطوير. ننسى سكينًا سويسريًا يدعم 20 بروتوكولًا يسد طرق ISDN القديمة مع H323 أو SIP. تم تصميم هذا المشروع ليكون نحيفًا وفعالًا وسريعًا باستخدام بنية غير متزامنة تعتمد على الحدث. SIP ، التحكم في المكالمات و RTP.
يتم تقسيم التصميم إلى 3 مكونات أساسية. كل مكون هو في المقام الأول بنية واحدة مترابطة مع منافذ إتمام الإدخال/الإخراج للشبكة (فكر في Nginx على Apache). هذا ل:
لاحظ إعادة ترابط RE الأخضر - المعروف باسم التعاونية متعددة الخيوط. عيب واحد مع استخدام هذه التقنية هو أن البرنامج الخاص بك يجب أن يتعاون مع مؤشرات الترابط الأخرى - أي التخلي عن وقت المعالجة. يستخدم مكون SIP C ++ Boost ASIO والتحكم في المكالمات يستخدم Node JS - كلاهما أطر جيدة جدًا لهذا النمط. كلاهما أطر عمل عالية الأداء. يستخدم RTP أيضًا C ++ Boost Asio.
بالنسبة لمعظم المستخدمين ، هذا يعني عندما تكتب برامج نصوص عقدة لسيناريوهات التحكم في المكالمات الخاصة بك ، يجب أن تفهم الطبيعة غير المتزامنة للعقدة وكيفية كتابة JavaScript غير المتزامنة بشكل صحيح. يمكنك حبس مؤشر ترابط التحكم بأكمله من خلال عدم التخلي عن وقت المعالج. ومع ذلك ، عندما تحصل عليه بشكل صحيح ، ينتهي بك الأمر بخادم فعال للغاية.
المكونات الرئيسية الثلاثة:
يمكن أن يعمل كل مكون إما على نفس الخادم أو على خوادم منفصلة. يتيح ذلك ، على سبيل المثال ، الخادم 1 تشغيل SIP والتحكم في المكالمات ، ثم إذا قمت بنقل الرمز الشديد مما يزيد من تحميل خوادم RTP ، خوادم RTP متعددة.
يتم توصيل الأحداث عبر آلية حدث HTTP. أي إذا تم إنشاء مكالمة SIP جديدة من قبل عميل (الذي يرسل دعوة SIP) ، فسيقوم Project-SIP بتمرير طلب HTTP إلى خادم التحكم. سيقوم خادم التحكم بعد ذلك بتوصيل التعليمات مرة أخرى إلى كل من SIP Server و RTP Server (S).
تم تصميم تصميم هذا المشروع للعمل مع الخدمات السحابية بحيث يمكن توسيع أعباء العمل لأعلى ولأسفل بشكل مناسب.
جزء من التصميم هو أن يكون في الذاكرة. أي يجب ألا يُطلب من خادم SIP الاستعلام عن قاعدة بيانات للحصول على معلومات الدليل. بعد البدء ، يجب دفع معلومات الدليل إلى خادم SIP (إما بواسطة خادم التحكم أو موقع الويب الخاص بك - مضيف ودود) - فكر في Memcache.
تم تصميم جميع المشاريع الثلاثة لتشغيلها على نفس الخادم المادي أو خوادم منفصلة. بهذه الطريقة يمكن تحقيق موازنة التحميل بين الخوادم. يمكن بعد ذلك تشغيل خوادم RTP المتعددة للتعامل مع كميات كبيرة من الترميز لكل خادم SIP والتحكم.
تتواصل جميع الخدمات مع بعضها البعض عبر HTTP. يحدد القسم التالي الواجهات. في هذا القسم ، تستخدم جميع الأمثلة Curl للحصول على البيانات أو نشرها.
مثل Project-SIP ، يحتوي التحكم على واجهة HTTP. تم تبسيط هذا بواسطة مكتبة التحكم ، تصبح كتابة البرامج النصية للتحكم في المكالمات بسيطة:
/* Indicate ringing to the caller - did we really need a comment! */
call . ring ( ) ;يمكن تضمين المكتبة مع
const projectcontrol = require ( "projectcontrol" )(لاحظ أن هذا سيتغير عند إصداره!).
يتطلب خادم SIP أن يتم تحميل معلومات المستخدم إليه.
projectcontrol . directory ( "bling.babblevoice.com" , [ { "username" : "1003" , "secret" : "1123654789" } ] )يمكننا التحكم في برامج الترميز التي نسمح بها. Suported: PCMA ، PCMU ، 722 ، ILBC@20 ، 2833. (ملاحظة ILBC و 2833 TODO).
projectcontrol . codecs = [ "722" , "pcma" , "pcmu" , "ilbc" , "2833" ]نود إبلاغ المكالمات الجديدة
projectcontrol . onnewcall = ( call ) =>
{
console . log ( "new call" )
}يحتوي كائن "الاتصال" الذي يتم تمريره في معلومات داخلية لتتبع المكالمة. المعلومات المتعلقة إذا كانت رنينًا أو إجابة أو معلقة وما إلى ذلك ، يمكنك أيضًا تعيين وظائف رد الاتصال على المكالمة
projectcontrol . onnewcall = ( call ) =>
{
console . log ( "new call" )
call . onhangup = ( ) =>
{
console . log ( "hung up" )
}
/* Indicate ringing to the caller - not needed as the second leg ringing signal will be passed back */
call . ring ( )
/* Make a call */
if ( "3" == call . destination )
{
call . newcall ( { to : { user : "1003" } } )
}
}بمجرد تكوين ProjectControl احتياجات التشغيل التي تضعها والتي تضع كل شيء في حلقة الحدث الخاصة به.
projectcontrol . run ( )قائمة المستقدين لظهور المكالمات في ProjectControl:
يمكن استدعاء هذه عدة مرات وسيتم تكديس عمليات الاسترجاعات ودعاها جميعًا.
getters
طُرق
على غرار SIP Server ، ستنشأ هذه المكالمة مكالمة جديدة - ولكنها ستمر عبر معالجة المكالمات أولاً (مقارنة بواجهة SIP التي ستستدعي بشكل أعمى نقطة نهاية SIP).
إخطار خادم التحكم بتسجيل SIP. تم إنشاؤه بواسطة خادم SIP وإرساله إلى خادم التحكم الذي تم تكوينه باستخدام واجهة الدليل.
ضع http://127.0.0.1:9001/reg/bling.babblevoice.com/1003
{
"host" : " 127.0.0.1 " ,
"port" : 45646 ,
"agent" : " Z 5.2.28 rv2.8.114 "
}المضيف والمنفذ هما شبكة العميل (حيث جاء الطلب) والوكيل هو سلسلة الوكيل التي أبلغ عنها عميل SIP.
مثال: curl -x post -data -raw '{"domain":
تم إنشاؤه بواسطة خادم SIP وإرساله إلى عنوان التحكم مقابل المجال الذي تم تكوينه باستخدام واجهة الدليل. إخطار خادم التحكم بتسجيل SIP.
حذف http://127.0.0.1:9001/reg/bling.babblevoice.com/1003
مثال باستخدام Curl: Curl -x delete -data -raw '{"domain": "bling.babblevoice.com" ، "user":
يتم استخدام هذه الواجهة لإضافة معلومات الدليل إلى خادم SIP.
ضع http://127.0.0.1:9000/dir/bling.babblevoice.com
{
"control" : " http://127.0.0.1:9001 " ,
"users" :
[
{
"username" : " 1003 " ,
"secret" : " 1123654789 "
}
]
}إرجاع 201 على النجاح.
مثال باستخدام Curl:
curl -X PUT --data-raw '{ "control": "http://127.0.0.1:9001", "users": [ { "username": "1003", "secret": "1123654789"}]}' -H "Content-Type:application/json" http://127.0.0.1/dir/bling.babblevoice.com
هذا مرادف للتصحيح.
هذا سيحل محل المستخدم فقط. عند وضع المجال ، هذا يحل محل كائن المجال بأكمله.
ضع http://127.0.0.1:9000/dir/bling.babblevoice.com/1003
{
"secret" : " 1123654789 "
}curl -x put -data -raw '{"secret": "1123654789"}' -H "content -type: application/json" http://127.0.0.1/dir/bling.babblevoice.com/1003
إرجاع json سرد هذا إدخال المجالات في الدليل.
إزالة الإدخال في الدليل. يمكن أيضًا تحديد المستخدم - /dir/bling.babblevoice.com/1003.
إرجاع عدد العملاء المسجلين.
المثال:
احصل على http://127.0.0.1:9000/reg/bling.babblevoice.com
أو لتصفية مستخدم معين
احصل على http://127.0.0.1:9000/reg/bling.babblevoice.com/1003
يعود 200 مع الجسم:
{
"domain" : " bling.babblevoice.com " ,
"count" : 3 ,
"registered" : 1 ,
"users" : {
"1000" : {
"registered" : false
},
"1001" : {
"registered" : false
},
"1003" : {
"registered" : true ,
"outstandingping" : 0 ,
"remote" : {
"host" : " 127.0.0.1 " ,
"port" : 42068 ,
"agent" : " Z 5.2.28 rv2.8.114 "
},
"epochs" : {
"registered" : 1552507958
}
}
}
}عندما يكون الطلب بالنسبة لمجال معين ، تكون الحقول:
احصل على http://127.0.0.1:9000/reg/
يعود 200 مع الجسم:
{
"count" : 1255
}هذا هو عدد كامل لجميع التسجيلات على خادم SIP هذا.
تنشئة مكالمة جديدة.
curl -x post -data -raw '[{"domain": "bling.babblevoice.com" ، "to:" ، "from": "،" maxforwards ": 70 ،" callerid ": {" number ":" 123 "،" name ": }}] '-H "نوع المحتوى: التطبيق/json" http://127.0.0.1/invite
خيار التحكم اختياري. إذا كان في هذا هو الخادم الذي سيتلقى تحديثات بخصوص تدفق المكالمات. إذا لم يكن الأمر كذلك ، فسيتم استخدام الحقل الافتراضي المدرج في حقل "إلى". إذا لم يكن هذا ، فلن يتم إرسال أي تحديثات.
مثال: curl -x post -data -raw '{"callid": "" ، "alertinfo": "omealertinfo"}' -H "type -type: application/json" http: // sip/dir
إذا لم تكن المكالمة في حالة رنين أو إجابة ، فسترسل 180 رنين مع معلومات التنبيه إذا تم إرسالها.
سيؤدي نشر مستند فارغ إلى إنشاء قناة جديدة.
مثال: curl -x post -data -raw '{}' -h "type: application/json" http: // rtp/
سيقوم الخادم بإرجاع مستند JSON. بما في ذلك الإحصائيات المتعلقة بعبء العمل في الخادم بحيث يمكن لخادم التحكم اتخاذ القرارات بناءً على عبء العمل وكذلك التوجيه.
ملاحظة ، لقد قمت بتضمين RFC 4028 هنا للعمل المستقبلي المحتمل.
يمكن تشغيل خادم SIP مع علامة الاختبار:
مشروع-اختبار-اختبار
في مجلد TestFiles ، هناك أيضًا ملفات اختبار أخرى.
المنافذ الافتراضية للخادم هي 9000 لخادم الويب و 5060 لخادم SIP.
بعض الملاحظات حول استخدام Valgrind لاختبار الذاكرة.
Valgrind-Tool = Massif Project-RTP-FG
بعد التشغيل ، سيؤدي ذلك إلى إنشاء ملف massif في الدليل الذي تقوم بتشغيله من Valgrind. أي massif.out.3823 يمكنك استخدام ms_print للتذكير بالبيئة في هذا الملف:
ms_print massif.out.3823
Valgrind-Leak-Check = Yes Project-RTP-FG
registerClient.xml & .csv.
وهي ملفات التكوين المراد استخدامها مع SIPP والتي يمكنها اختبار سيناريوهات مختلفة.
SIPP 127.0.0.1:9997 -SF registerClient.xml -inf registerClient.csv -M 1 -l 1 -trace_msg -trace_err
أو بدون ملفات التسجيل.
SIPP 127.0.0.1:9997 -SF registerClient.xml -inf registerClient.csv -M 1 -L 1
لتحميل بيانات الاختبار إلى استخدام خادم SIP
SIPP 127.0.0.1 -SF Uaclateoffer.xml -M 1 -L 1
DNF تثبيت ccache @tools g ++ Boost-devel ILBC-devel spandsp-devel openssl-devel nodejs