該項目現已停產。
這是因為我遇到了Drachtio項目,該項目與我對該項目的願景和結構相同。 Drachtio只是該項目的一個組成部分 - 因此,這預計已經變成了其他項目,這些項目最終將擺脫軟pbx所需的所有組件。
還有更多工作要做,包括存在。
Project MediaSwitch設計為可擴展的VoIP開關。忘記一把支撐20個協議的瑞士軍刀,將舊的ISDN路線與H323或SIP架起。該項目旨在使用事件驅動的異步體系結構苗條,高效且快速。 sip,呼叫控制和RTP。
該設計分為3個核心組件。每個組件主要是一個螺紋架構,具有網絡的I/O完成端口(APACHE上的Nginx)。這是:
注意綠色線程 - 也稱為合作多線程。使用此技術的一個缺點是您的軟件必須與其他線程合作 - 即放棄處理時間。 SIP組件使用C ++ Boost ASIO,CALL CONTRAL使用節點JS-這兩種框架都非常好。兩者都是高性能框架。 RTP還使用C ++ Boost ASIO。
對於大多數用戶,這意味著,當您為自己的呼叫控制場景編寫節點腳本時,您必須了解節點的異步性質以及如何正確編寫異步JavaScript。您可以通過不放棄處理器時間來鎖定整個控制線程。但是,當您正確處理時,您最終會獲得非常有效的服務器。
三個主要組成部分:
每個組件可以在同一服務器上或單獨的服務器上運行。例如,這允許服務器1運行SIP和CALL CONTROR,那麼如果您重大轉碼,則增加了RTP服務器的負載,請使用多個RTP服務器。
事件通過HTTP事件機制傳達。即,如果客戶端生成新的SIP調用(發送SIP邀請),則Project-SIP將將HTTP請求傳遞回控制服務器。然後,Control Server將向SIP服務器和RTP服務器(s)傳達後續指令。
該項目的設計旨在使用雲服務,以便可以適當地上下縮放工作負載。
設計的一部分是內存。即不需要SIP服務器查詢數據庫以獲取目錄信息。啟動後,應將目錄信息推向SIP服務器(由Control Server或您的網站(友好的主機))想想Memcache。
這三個項目旨在在同一物理服務器或單獨的服務器上運行。這樣可以實現服務器之間的負載平衡。然後可以運行多個RTP服務器,以處理每個SIP和控制服務器的大量轉碼。
所有服務通過HTTP相互通信。以下一節定義了接口。在本節中,所有示例使用捲曲來獲取或發布數據。
與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服務器邀請類似,此呼叫將啟動一個新調用 - 但它將首先通過呼叫處理(與將盲目調用SIP端點的SIP接口相比)。
將SIP註冊通知控制服務器。由SIP服務器生成,並發送到使用目錄接口配置的控制服務器。
放置http://127.0.0.1:9001/reg/bling.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”,“ user”:“ 1000”}'-h” content -type:application/json“ http:// control/control/reg
由SIP服務器生成,並針對使用目錄接口配置的域發送到控制地址。將SIP De-Registration通知控制服務器。
刪除http://127.0.0.1:9001/reg/bling.bling.babblevoice.com/1003
示例使用curl:curl -x delete -data -raw'{“ domain”:“ bling.babblevoice.com”,“ user”:“ 1000”}'}'-h“ content -type:application/json” http:// control/control/reg
該接口用於將目錄信息添加到SIP服務器。
放置http://127.0.0.0.1:9000/dir/bling.bhabblevoice.com
{
"control" : " http://127.0.0.1:9001 " ,
"users" :
[
{
"username" : " 1003 " ,
"secret" : " 1123654789 "
}
]
}返回201上的201。
示例使用捲髮:
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.0.1:9000/dir/bling.babblevoice.com/1003
{
"secret" : " 1123654789 "
}curl -x put -data -raw'{“秘密”:“ 1123654789”}'}'-h“ content -type:application/json” http://127.0.0.0.1/dir/dir/bling.bling.babblevoice.bling.babblevoice.com/10033
返回JSON在目錄中列出此域條目。
刪除目錄中的條目。也可以指定用戶 - /dir/bling.babblevoice.com/1003。
返回註冊客戶端的數量。
示例:
獲取http://127.0.0.0.1:9000/reg/bling.bhabblevoice.com
或為特定用戶過濾
獲取http://127.0.0.0.1:9000/reg/bling.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": "123", "private": false }, "control": { "host": "127.0.0.1", "port": 9001 }}]'-h“ content -type:application/json” http://127.0.0.0.1/invite
控制選項是可選的。如果是,則是服務器,該服務器將接收有關呼叫流的更新。如果沒有,將使用“到”字段中列出的默認一個。如果不是這樣,則不會發送更新。
示例:curl -x post -data -raw'{“ callId”:“”,“ arperinfo”:“ somealertInfo”}'} -h“ content -type:application/json” http:// sip/dir
如果呼叫不在響鈴狀態或接聽狀態,它將發送180響鈴,如果發送了警報信息。
發布空白文檔將創建一個新頻道。
示例:curl -x post -data -raw'{}'-h“ content -type:application/json” http:// rtp/
服務器將返回JSON文檔。包括有關服務器工作量的統計數據,以便控制服務器可以根據工作量和路由做出決策。
請注意,我在此處包括了RFC 4028,以進行未來的工作。
SIP服務器可以使用測試標誌運行:
項目sip-測試
在文件夾測試文件中,還有其他測試文件。
服務器服務器的默認端口為9000,SIP服務器的默認端口為5060。
一些關於使用Valgrind進行內存測試的註釋。
valgrind-tool = massif project-rtp -fg
運行後,這將在您運行Valgrind的Directry中創建一個massif文件。 ie massif.out.3823您可以使用MS_PRINT預示該文件的第三個問題:
ms_print massif.out.3823
valgrind-lileak-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 -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