Proyek ini sekarang dihentikan.
Ini karena saya menemukan proyek Drachtio yang berbagi visi dan struktur yang sama dengan yang saya pikirkan untuk proyek ini. Drachtio hanyalah satu komponen dari proyek ini - jadi proyeksi ini telah berubah menjadi proyek lain yang pada akhirnya akan dari semua komponen yang diperlukan untuk PBX lunak.
Ada lebih banyak yang harus dilakukan, termasuk kehadiran.
Project MediasWitch dirancang untuk menjadi sakelar VoIP yang dapat diskalakan. Lupakan pisau Swiss-Army yang mendukung 20 protokol yang menjembatani rute ISDN lama dengan H323 atau SIP. Proyek ini dirancang untuk menjadi ramping, efisien dan cepat menggunakan arsitektur asinkron yang digerakkan oleh peristiwa. SIP, Call Control dan RTP.
Desainnya dipecah menjadi 3 komponen inti. Setiap komponen terutama merupakan arsitektur berulir tunggal dengan port penyelesaian I/O untuk jaringan (pikirkan nginx over apache). Ini untuk:
CATATAN RE Green Threads - atau dikenal sebagai koperasi multi -threading. Satu -satunya kelemahan dengan menggunakan teknik ini adalah perangkat lunak Anda harus bekerja sama dengan utas lain - yaitu menyerah waktu pemrosesan. Komponen SIP menggunakan C ++ Boost ASIO dan Call Control menggunakan Node JS - keduanya kerangka kerja yang sangat bagus untuk gaya ini. Keduanya adalah kerangka kerja kinerja tinggi. RTP juga menggunakan C ++ Boost ASIO.
Bagi sebagian besar pengguna ini berarti ketika Anda menulis skrip simpul untuk skenario kontrol panggilan Anda sendiri, Anda harus memahami sifat node yang tidak sinkron dan bagaimana menulis javascript asinkron dengan benar. Anda dapat mengunci seluruh utas kontrol dengan tidak menyerah waktu prosesor. Namun, ketika Anda melakukannya dengan benar, Anda berakhir dengan server yang sangat efisien.
3 komponen utama:
Setiap komponen dapat berjalan di server yang sama atau di server terpisah. Ini memungkinkan, misalnya, server 1 menjalankan kontrol SIP dan panggilan, maka jika Anda sangat mentranskode yang meningkatkan beban server RTP, beberapa server RTP.
Acara dikomunikasikan melalui mekanisme acara HTTP. yaitu jika panggilan SIP baru dihasilkan oleh klien (yang mengirimkan undangan SIP) maka proyek-SIP akan meneruskan permintaan HTTP kembali ke server kontrol. Server kontrol kemudian akan mengkomunikasikan instruksi kembali ke server SIP dan server RTP.
Desain proyek ini dirancang untuk bekerja dengan layanan cloud sehingga beban kerja dapat ditingkatkan dengan tepat.
Bagian dari desainnya adalah dalam memori. yaitu server SIP seharusnya tidak diminta untuk menanyakan database untuk mendapatkan informasi direktori. Setelah memulai, informasi direktori harus didorong ke server SIP (baik oleh server kontrol atau situs web Anda - host yang ramah) - pikirkan memcache.
Ketiga proyek ini dirancang untuk berjalan di server fisik yang sama atau server terpisah. Dengan cara ini menyeimbangkan beban di antara server dapat dicapai. Beberapa server RTP kemudian dapat dijalankan untuk menangani volume transkode yang besar untuk setiap server SIP dan kontrol.
Semua layanan berkomunikasi satu sama lain melalui HTTP. Bagian berikut mendefinisikan antarmuka. Di bagian ini semua contoh menggunakan curl untuk mendapatkan atau memposting data.
Seperti Project-SIP, Control memiliki antarmuka HTTP. Ini disederhanakan oleh pustaka kontrol, menulis skrip kontrol panggilan menjadi sederhana:
/* Indicate ringing to the caller - did we really need a comment! */
call . ring ( ) ;Perpustakaan dapat disertakan
const projectcontrol = require ( "projectcontrol" )(Perhatikan ini akan berubah saat dirilis!).
Server SIP membutuhkan informasi pengguna untuk diunggah ke sana.
projectcontrol . directory ( "bling.babblevoice.com" , [ { "username" : "1003" , "secret" : "1123654789" } ] )Kami dapat mengontrol codec mana yang kami izinkan. Supported: PCMA, PCMU, 722, ILBC@20, 2833. (Catatan ILBC dan 2833 TODO).
projectcontrol . codecs = [ "722" , "pcma" , "pcmu" , "ilbc" , "2833" ]Kami ingin diberi tahu tentang panggilan baru
projectcontrol . onnewcall = ( call ) =>
{
console . log ( "new call" )
}Objek 'Panggilan' yang dilewati berisi informasi internal untuk melacak panggilan. Informasi Mengenai Jika Dering, Dijawab, Hungup dll. Anda juga dapat menetapkan fungsi panggilan balik pada panggilan
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" } } )
}
}Setelah ProjectControl telah dikonfigurasi Run membutuhkan menelepon mana yang menempatkan semuanya di loop acaranya.
projectcontrol . run ( )Daftar setter untuk panggilan balik di ProjectControl:
Ini dapat dipanggil beberapa kali dan panggilan balik akan ditumpuk dan semua dipanggil.
Getters
Metode
Mirip dengan undangan server SIP ini akan berasal dari panggilan baru - tetapi akan melalui pemrosesan panggilan terlebih dahulu (dibandingkan dengan antarmuka SIP yang secara membabi buta akan memanggil titik akhir SIP).
Beri tahu server kontrol pendaftaran SIP. Dihasilkan oleh server SIP dan dikirim ke server kontrol yang dikonfigurasi menggunakan antarmuka direktori.
Letakkan 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 "
}Host dan port adalah jaringan klien (dari mana permintaan berasal) dan agen adalah string agen yang dilaporkan oleh klien SIP.
Contoh: CURL -X POST --Data-RAW '{"DOMAIN": "bling.babblevoice.com", "user": "1000"}' -h "tipe konten: aplikasi/json" http: // control/reg
Dihasilkan oleh server SIP dan dikirim ke alamat kontrol terhadap domain yang dikonfigurasi menggunakan antarmuka direktori. Beri tahu server kontrol de-registrasi SIP.
Hapus http://127.0.0.1:9001/reg/bling.babblevoice.com/1003
Contoh Menggunakan Curl: Curl -x Delete --Data-Raw '{"Domain": "bling.babblevoice.com", "user": "1000"}' -h "tipe konten: aplikasi/json" http: // control/reg "
Antarmuka ini digunakan untuk menambahkan informasi direktori ke server SIP.
Letakkan http://127.0.0.1:9000/dir/bling.babblevoice.com
{
"control" : " http://127.0.0.1:9001 " ,
"users" :
[
{
"username" : " 1003 " ,
"secret" : " 1123654789 "
}
]
}Mengembalikan 201 saat sukses.
Contoh Menggunakan 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
Ini identik dengan tambalan.
Ini hanya akan menggantikan pengguna. Saat letakkan domain, ini menggantikan seluruh objek domain.
Letakkan http://127.0.0.1:9000/dir/bling.babblevoice.com/1003
{
"secret" : " 1123654789 "
}Curl -x put ---data -raw '{"Secret": "1123654789"}' -h "konten -tipe: aplikasi/json" http://127.0.0.1/dir/bling.babblevoice.com/1003
Mengembalikan JSON mencantumkan entri domain ini di direktori.
Hapus entri di direktori. Pengguna juga dapat ditentukan - /dir/bling.babblevoice.com/1003.
Mengembalikan jumlah klien terdaftar.
Contohnya:
Dapatkan http://127.0.0.1:9000/reg/bling.babblevoice.com
atau untuk memfilter untuk pengguna tertentu
Dapatkan http://127.0.0.1:9000/reg/bling.babblevoice.com/1003
Mengembalikan 200 dengan tubuh:
{
"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
}
}
}
}Ketika permintaan untuk domain tertentu, bidangnya adalah:
Dapatkan http://127.0.0.1:9000/reg/
Mengembalikan 200 dengan tubuh:
{
"count" : 1255
}Ini adalah hitungan lengkap dari semua pendaftaran di server SIP ini.
Berasal panggilan baru.
CURL -X POST --Data -raw '[{"Domain": "bling.babblevoice.com", "to:" "," from ":" "," maxforwards ": 70," Callerid ": {" Number ":" 123 "," Name ":" 123 "," Private ": FALSE}," "": "" "" "" 27. }}] '-H " -Type: Application/JSON" http://127.0.0.1/invite
Opsi kontrol adalah opsional. Jika ada di dalam ini adalah server yang akan menerima pembaruan mengenai aliran panggilan. Jika tidak, yang default yang tercantum di bidang "ke" akan digunakan. Jika tidak, maka tidak ada pembaruan yang akan dikirim.
Contoh: CURL -X POST --Data -raw '{"callId": "", "alertInfo": "somealertInfo"}' -h "tipe konten: application/json" http: // sip/dir
Jika panggilan tidak dalam keadaan berdering atau dijawab, itu akan mengirim 180 dering bersama dengan info peringatan jika dikirim.
Posting dokumen kosong akan membuat saluran baru.
Contoh: CURL -X POST --Data -raw '{}' -h " -Type: Application/JSON" http: // rtp/
Server akan mengembalikan dokumen JSON. Termasuk statistik mengenai beban kerja server sehingga server kontrol dapat membuat keputusan berdasarkan beban kerja serta perutean.
Catatan, saya telah memasukkan RFC 4028 di sini untuk kemungkinan pekerjaan di masa depan.
Server SIP dapat dijalankan dengan bendera uji:
Proyek-SIP --Test
Di folder testfiles ada juga file uji lainnya.
Port default untuk server adalah 9000 untuk server web dan 5060 untuk server SIP.
Beberapa catatan tentang menggunakan Valgrind untuk pengujian memori.
valgrind ---tool = Massif Project-rtp --fg
Setelah berjalan, ini akan membuat file Massif di Directry yang Anda jalankan dari Valgrind. IE Massif.out.3823 Anda dapat menggunakan MS_PRINT untuk pretifikasi econtents dari file ini:
MS_PRINT Massif.out.3823
valgrind --leak-check = ya proyek-rtp --fg
Registerclient.xml & .csv.
Yang merupakan file konfigurasi yang akan digunakan dengan SIPP yang dapat menguji berbagai skenario.
SIPP 127.0.0.1:9997 -sf Registerclient.xml -inf registerclient.csv -m 1 -l 1 -trace_msg -trace_err
atau tanpa file logging.
SIPP 127.0.0.1:9997 -sf Registerclient.xml -inf registerclient.csv -m 1 -l 1
Untuk mengunggah data uji ke penggunaan server SIP
SIPP 127.0.0.1 -Sf UACLATEFER.XML -M 1 -L 1
DNF Instal CCACHE @Tool Pengembangan G ++ Boost-Devel-Devel-Devel-Devel SPANDSP-Devel OpenSSL-Devel NodeJS