이 프로젝트는 이제 중단되었습니다.
이것은 내가이 프로젝트에 대해 생각했던 것과 동일한 비전과 구조를 공유하는 Drachtio 프로젝트를 발견했기 때문입니다. Drachtio는이 프로젝트의 구성 요소 일뿐입니다. 따라서 이것은 다른 프로젝트로 변형되어 결국 소프트 PBX에 필요한 모든 구성 요소를 벗어납니다.
존재를 포함하여해야 할 일이 더 있습니다.
Project MediaSwitch는 확장 가능한 VoIP 스위치로 설계되었습니다. H323 또는 SIP로 오래된 ISDN 경로를 연결하는 20 개의 프로토콜을 지원하는 스위스-무아 나이프를 잊어 버리십시오. 이 프로젝트는 이벤트 중심의 비동기 아키텍처를 사용하여 슬림하고 효율적이며 빠르게 설계되었습니다. SIP, Call Control 및 RTP.
디자인은 3 개의 핵심 구성 요소로 분류됩니다. 각 구성 요소는 주로 네트워크 용 I/O 완료 포트가있는 단일 스레드 아키텍처입니다 (Apache를 통해 Nginx를 생각하십시오). 이것은 다음과 같습니다.
참고 녹색 실 - 그렇지 않으면 협력적인 멀티 스레딩으로 알려져 있습니다. 이 기술을 사용하는 한 가지 단점은 소프트웨어가 다른 스레드와 협력해야한다는 것입니다. 즉, 처리 시간을 포기합니다. SIP 구성 요소는 C ++ 부스트 ASIO를 사용하고 통화 제어는 노드 JS를 사용합니다.이 스타일에 매우 좋은 프레임 워크. 둘 다 고성능 프레임 워크입니다. RTP는 또한 C ++ 부스트 ASIO를 사용합니다.
대부분의 사용자의 경우, 이는 자신의 통화 제어 시나리오에 대한 노드 스크립트를 작성할 때 노드의 비동기 특성과 비동기 자바 스크립트를 올바르게 작성하는 방법을 이해해야합니다. 프로세서 시간을 포기하지 않음으로써 전체 제어 스레드를 잠글 수 있습니다. 그러나 올바르게 얻을 때 매우 효율적인 서버로 끝납니다.
3 가지 주요 구성 요소 :
각 구성 요소는 동일한 서버 또는 별도의 서버에서 실행될 수 있습니다. 예를 들어 서버 1 실행 SIP 및 호출 제어를 통해 RTP 서버 (여러 RTP 서버)의로드를 증가시킬 수있는 트랜스 코드가 발생할 수 있습니다.
이벤트는 HTTP 이벤트 메커니즘을 통해 전달됩니다. 즉, 클라이언트가 새 SIP 통화를 생성하는 경우 (SIP 초대를 보내는) Project-SIP는 HTTP 요청을 제어 서버로 다시 전달합니다. 그런 다음 Control Server는 SIP 서버와 RTP 서버에 다시 명령어를 통신합니다.
이 프로젝트의 디자인은 클라우드 서비스와 함께 작동하여 작업량을 적절하게 확장 및 다운 할 수 있도록 설계되었습니다.
디자인의 일부는 메모리 인 것입니다. 즉, SIP 서버는 디렉토리 정보를 얻기 위해 데이터베이스를 쿼리 할 필요가 없어야합니다. 시작 후 디렉토리 정보를 SIP 서버 (Control Server 또는 웹 사이트 - 친숙한 호스트)로 푸시해야합니다. Memcache를 생각하십시오.
세 프로젝트 모두 동일한 실제 서버 또는 별도의 서버에서 실행되도록 설계되었습니다. 이런 식으로 서버간에로드 밸런싱을 달성 할 수 있습니다. 그런 다음 모든 SIP 및 제어 서버에 대해 대량의 트랜스 코딩을 처리하기 위해 여러 RTP 서버를 실행할 수 있습니다.
모든 서비스는 HTTP를 통해 서로 통신합니다. 다음 섹션에서는 인터페이스를 정의합니다. 이 섹션에서 모든 예제는 CURL을 사용하여 데이터를 얻거나 게시합니다.
Project-SIP와 마찬가지로 Control에는 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이 구성되면 RUN 필요 호출을 호출하여 모든 이벤트 루프에 배치합니다.
projectcontrol . run ( )ProjectControl에서 콜백을위한 세터 목록 :
이것들은 여러 번 호출 될 수 있으며 콜백은 쌓여서 모두 호출됩니다.
getters
행동 양식
SIP 서버 초대와 마찬가지로이 호출은 새 통화가 시작되지만 먼저 통화 처리를 거치게됩니다 (SIP 엔드 포인트를 맹목적으로 호출하는 SIP 인터페이스와 비교할 때).
SIP 등록의 제어 서버에 알립니다. SIP 서버에서 생성하고 디렉토리 인터페이스를 사용하여 구성된 Control Server로 전송되었습니다.
http://127.0.0.1:9001/reg/blay.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-type : application/json"http : // control/reg
SIP 서버에서 생성하고 디렉토리 인터페이스를 사용하여 구성된 도메인에 대해 제어 주소로 전송됩니다. SIP DE-Registration의 제어 서버에 알리십시오.
http://127.0.0.1:9001/reg/blay.babblevoice.com/1003 삭제
Curl 사용 예 : Curl -X Delete -Data -Raw '{ "Domain": "Bling.babblevoice.com", "사용자": "1000"}'-H "Content -Type : Application/JSON"http : // control/reg
이 인터페이스는 SIP 서버에 디렉토리 정보를 추가하는 데 사용됩니다.
http://127.0.0.1:9000/dir/blay.babblevoice.com을 넣으십시오
{
"control" : " http://127.0.0.1:9001 " ,
"users" :
[
{
"username" : " 1003 " ,
"secret" : " 1123654789 "
}
]
}성공으로 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.1:9000/dir/blay.babblevoice.com/1003을 넣으십시오
{
"secret" : " 1123654789 "
}curl -x put -data -raw '{ "secret": "1123654789"}'-h "content-type : application/json"http://127.0.0.1/dir/blay.babblevoice.com/1003
이 도메인 항목을 디렉토리에 목록에 목록을 반환합니다.
디렉토리에서 항목을 제거하십시오. 사용자는 - /dir/blay.babblevoice.com/1003을 지정할 수도 있습니다.
등록 된 클라이언트 수를 반환합니다.
The example:
http://127.0.0.1:9000/reg/blay.babblevoice.com을 받으십시오
또는 특정 사용자를 필터링합니다
http://127.0.0.1:9000/reg/blay.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": "maxforwards": "hallerid": { "number": "123", "이름": "123", "private},": "host": "127.0.0.1" }] '-h "content -type : application/json"http://127.0.0.1/invite
제어 옵션은 선택 사항입니다. 그것이 있다면, 통화 흐름에 관한 업데이트를받는 서버가 있습니다. 그렇지 않은 경우 "to"필드에 나열된 기본값이 사용됩니다. 그렇지 않으면 업데이트가 전송되지 않습니다.
예 : curl -x post -data -raw '{ "callid": "", "alertinfo": "somalertinfo"}'-h "content -type : application/json"http : // sip/dir
통화가 울림 또는 답변 상태에 있지 않으면 전송 된 경우 Alert Info와 함께 180 벨소리를 보냅니다.
빈 문서를 게시하면 새 채널이 생성됩니다.
예 : curl -x post -data -raw '{}'-h "content -type : application/json"http : // rtp/
서버는 JSON 문서를 반환합니다. 제어 서버가 워크로드 및 라우팅을 기반으로 결정을 내릴 수 있도록 서버의 워크로드에 관한 통계를 포함합니다.
가능한 향후 작업을 위해 RFC 4028을 포함 시켰습니다.
SIP 서버는 테스트 플래그로 실행할 수 있습니다.
프로젝트-테스트
폴더 testfiles에는 다른 테스트 파일도 있습니다.
서버의 기본 포트는 웹 서버의 경우 9000, SIP 서버의 경우 5060입니다.
메모리 테스트를 위해 Valgrind 사용에 대한 몇 가지 메모.
valgrind --- Tool = Massif Project-rtp--fg
실행 한 후에는 Valgrind에서 실행되는 Directry에서 대규모 파일을 만듭니다. IE 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 -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