โครงการนี้หยุดลงแล้ว
นี่เป็นเพราะฉันเจอโครงการ Drachtio ซึ่งมีวิสัยทัศน์และโครงสร้างเดียวกันกับที่ฉันคิดไว้สำหรับโครงการนี้ Drachtio เป็นเพียงองค์ประกอบเดียวของโครงการนี้ - ดังนั้นสิ่งนี้ที่คาดการณ์ไว้ได้ปรับเปลี่ยนเป็นโครงการอื่น ๆ ซึ่งในที่สุดจะปิดส่วนประกอบทั้งหมดที่จำเป็นสำหรับ PBX ที่อ่อนนุ่ม
มีอะไรให้ทำอีกรวมถึงการปรากฏตัว
Project MediaSwitch ได้รับการออกแบบให้เป็นสวิตช์ VoIP ที่ปรับขนาดได้ ลืมมีด Swiss-Army ที่รองรับ 20 โปรโตคอลที่เชื่อมเส้นทาง ISDN เก่าด้วย H323 หรือ SIP โครงการนี้ได้รับการออกแบบให้มีความบางมีประสิทธิภาพและรวดเร็วโดยใช้สถาปัตยกรรมแบบอะซิงโครนัสที่ขับเคลื่อนด้วยเหตุการณ์ SIP, การควบคุมการโทรและ RTP
การออกแบบแบ่งออกเป็น 3 องค์ประกอบหลัก แต่ละองค์ประกอบส่วนใหญ่เป็นสถาปัตยกรรมเกลียวเดียวที่มีพอร์ต I/O เสร็จสมบูรณ์สำหรับเครือข่าย (คิดว่า Nginx ผ่าน Apache) นี่คือ:
หมายเหตุ Re Green Threads - หรือที่รู้จักกันในชื่อ Cooperative Multi -Threading ข้อเสียเปรียบอย่างหนึ่งของการใช้เทคนิคนี้คือซอฟต์แวร์ของคุณจะต้องร่วมมือกับเธรดอื่น ๆ - เช่นให้เวลาในการประมวลผล ส่วนประกอบ SIP ใช้ C ++ Boost ASIO และการควบคุมการโทรใช้โหนด JS - ทั้งกรอบที่ดีมากสำหรับสไตล์นี้ ทั้งสองเป็นเฟรมเวิร์กประสิทธิภาพสูง RTP ยังใช้ C ++ Boost ASIO
สำหรับผู้ใช้ส่วนใหญ่สิ่งนี้หมายความว่าเมื่อคุณเขียนสคริปต์โหนดสำหรับสถานการณ์ควบคุมการโทรของคุณเองคุณต้องเข้าใจธรรมชาติของโหนดแบบอะซิงโครนัสและวิธีการเขียน JavaScript แบบอะซิงโครนัสอย่างถูกต้อง คุณสามารถล็อคเธรดการควบคุมทั้งหมดโดยไม่ยอมแพ้เวลาโปรเซสเซอร์ อย่างไรก็ตามเมื่อคุณทำให้ถูกต้องคุณจะได้รับเซิร์ฟเวอร์ที่มีประสิทธิภาพมาก
3 องค์ประกอบหลัก:
แต่ละส่วนประกอบสามารถเรียกใช้บนเซิร์ฟเวอร์เดียวกันหรือบนเซิร์ฟเวอร์แยกต่างหาก สิ่งนี้อนุญาตให้ตัวอย่างเช่นเซิร์ฟเวอร์ 1 ที่เรียกใช้ SIP และการควบคุมการโทรจากนั้นถ้าคุณ transcode อย่างหนักซึ่งเพิ่มโหลดของเซิร์ฟเวอร์ RTP, เซิร์ฟเวอร์ RTP หลายตัว
เหตุการณ์ได้รับการสื่อสารผ่านกลไกเหตุการณ์ HTTP IE หากไคลเอนต์ SIP ใหม่ถูกสร้างขึ้น (ซึ่งส่งคำเชิญ SIP) จากนั้น Project-SIP จะส่งคำขอ HTTP กลับไปยังเซิร์ฟเวอร์ควบคุม เซิร์ฟเวอร์ควบคุมจะสื่อสารคำแนะนำกลับไปยังทั้งเซิร์ฟเวอร์ SIP และเซิร์ฟเวอร์ RTP
การออกแบบโครงการนี้ได้รับการออกแบบมาเพื่อทำงานกับบริการคลาวด์เพื่อให้สามารถปรับขนาดปริมาณงานได้อย่างเหมาะสม
ส่วนหนึ่งของการออกแบบจะต้องอยู่ในหน่วยความจำ เช่นเซิร์ฟเวอร์ 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:
สิ่งเหล่านี้สามารถเรียกได้หลายครั้งและการเรียกกลับจะถูกซ้อนกันและเรียกทั้งหมด
ผู้ลี้ภัย
วิธีการ
คล้ายกับเซิร์ฟเวอร์ SIP เชิญการโทรนี้จะเกิดการโทรใหม่ - แต่จะต้องผ่านการประมวลผลการโทรก่อน (เมื่อเทียบกับอินเตอร์เฟส 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": "bling.babblevoice.com", "ผู้ใช้": "1000"}' -h "content-ype: application/json" http: // control/reg
สร้างโดยเซิร์ฟเวอร์ SIP และส่งไปยังที่อยู่ควบคุมกับโดเมนที่กำหนดค่าโดยใช้ส่วนต่อประสานไดเรกทอรี แจ้งเซิร์ฟเวอร์ควบคุมของการลงทะเบียน SIP
ลบ http://127.0.0.1:9001/reg/bling.babblevoice.com/1003
ตัวอย่างการใช้ Curl: Curl -x DELETE -DATA -RAW '{"DOMAIN": "bling.babblevoice.com", "ผู้ใช้": "1,000"}' -h "ประเภทเนื้อหา: แอปพลิเคชัน/json" http: // ควบคุม/reg
อินเทอร์เฟซนี้ใช้เพื่อเพิ่มข้อมูลไดเรกทอรีลงในเซิร์ฟเวอร์ 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", "ถึง:" "," จาก ":" "," maxforwards ": 70," callerid ": {" number ":" 123 ",": "123", "ส่วนตัว" }}] '-h "เนื้อหาประเภท: แอปพลิเคชัน/json" http://127.0.0.1/invite
ตัวเลือกการควบคุมเป็นทางเลือก หากอยู่ในนี้คือเซิร์ฟเวอร์ที่จะได้รับการอัปเดตเกี่ยวกับโฟลว์การโทร หากไม่ได้ค่าเริ่มต้นที่ระบุไว้ในฟิลด์ "ถึง" จะถูกใช้ หากไม่เป็นเช่นนี้จะไม่มีการอัปเดตการอัปเดต
ตัวอย่าง: Curl -x Post -Data -Raw '{"Callid": "", "AlertInfo": "somealerTinfo"}' -h "content -type: แอปพลิเคชัน/json" http: // sip/dir
หากการโทรไม่ได้อยู่ในสถานะเสียงเรียกเข้าหรือตอบรับมันจะส่งเสียงเรียกเข้า 180 พร้อมกับข้อมูลการแจ้งเตือนหากส่ง
การโพสต์เอกสารว่างจะสร้างช่องใหม่
ตัวอย่าง: Curl -x Post -Data -Raw '{}' -h "เนื้อหาประเภท: แอปพลิเคชัน/json" http: // rtp //
เซิร์ฟเวอร์จะส่งคืนเอกสาร JSON รวมถึงสถิติเกี่ยวกับภาระงานของเซิร์ฟเวอร์เพื่อให้เซิร์ฟเวอร์ควบคุมสามารถตัดสินใจได้ตามเวิร์กโหลดและการกำหนดเส้นทาง
หมายเหตุฉันได้รวม RFC 4028 ไว้ที่นี่สำหรับการทำงานในอนาคตที่เป็นไปได้
เซิร์ฟเวอร์ SIP สามารถทำงานได้ด้วยธงทดสอบ:
Project-SIP-ทดสอบ
ใน Folder TestFiles มีไฟล์ทดสอบอื่น ๆ
พอร์ตเริ่มต้นสำหรับเซิร์ฟเวอร์คือ 9000 สำหรับเว็บเซิร์ฟเวอร์และ 5060 สำหรับเซิร์ฟเวอร์ SIP
บันทึกบางอย่างเกี่ยวกับการใช้ valgrind สำหรับการทดสอบหน่วยความจำ
Valgrind-Tool = Massif Project-RTP-FG
หลังจากทำงานแล้วสิ่งนี้จะสร้างไฟล์ Massif ใน Directry ที่คุณเรียกใช้ Valgrind จาก IE Massif.out.3823 คุณสามารถใช้ MS_PRINT เพื่อ pretify th econtents ของไฟล์นี้:
ms_print massif.out.3823
valgrind--leak-check = ใช่ 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 @development-tools g ++ boost-devel ilbc-devel spandsp-devel openssl-devel nodejs