该项目现已停产。
这是因为我遇到了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