このプロジェクトは現在廃止されています。
これは、このプロジェクトを念頭に置いていたのと同じビジョンと構造を共有するDrachtioプロジェクトに出会ったからです。 Drachtioはこのプロジェクトの1つのコンポーネントにすぎません。そのため、この予測されたプロジェクトは、最終的にソフトPBXに必要なすべてのコンポーネントを外します。
存在を含め、やるべきことがもっとあります。
Project MediaSwitchは、スケーラブルなVoIPスイッチとして設計されています。 H323またはSIPで古いISDNルートを橋渡しする20個のプロトコルをサポートするスイスアミーナイフを忘れてください。このプロジェクトは、イベント駆動型の非同期アーキテクチャを使用して、スリムで効率的かつ高速になるように設計されています。 SIP、コールコントロール、RTP。
設計は3つのコアコンポーネントに分類されます。各コンポーネントは、主にネットワーク用のI/O完了ポートを備えた単一のスレッドアーキテクチャです(Apache上のNginxを考えてください)。これは次のとおりです。
注Reグリーンスレッド - 協同的マルチスレッドとも呼ばれます。この手法を使用することの1つの欠点は、ソフトウェアが他のスレッドと協力しなければならないことです。つまり、処理時間を放棄します。 SIPコンポーネントはC ++ブーストASIOを使用し、コールコントロールはノードJSを使用します。どちらもこのスタイルに非常に優れたフレームワークです。どちらも高性能フレームワークです。 RTPはC ++ Boost ASIOも使用します。
ほとんどのユーザーにとって、これは、独自のコールコントロールシナリオのノードスクリプトを作成している場合、ノードの非同期性と非同期JavaScriptを適切に記述する方法を理解する必要があります。プロセッサ時間をあきらめないことにより、コントロールスレッド全体をロックすることができます。ただし、正しいことになったら、非常に効率的なサーバーになります。
3つの主要なコンポーネント:
各コンポーネントは、同じサーバーまたは個別のサーバーで実行できます。これにより、たとえば、SIPとコールコントロールを実行しているサーバー1が可能になり、RTPサーバーの負荷を増やす複数のRTPサーバーを大幅にトランスコードする場合があります。
イベントは、HTTPイベントメカニズムを介して伝達されます。 IEクライアントによって新しいSIPコールが生成された場合(SIP Inviteを送信)、Project-SIPはHTTPリクエストを制御サーバーに渡します。 Control Serverは、SIPサーバーとRTPサーバーの両方に命令を通知します。
このプロジェクトの設計は、ワークロードを適切に上下に拡大できるように、クラウドサービスと連携するように設計されています。
デザインの一部は、メモリ内になることです。 IE SIPサーバーは、ディレクトリ情報を取得するためにデータベースを照会する必要がない必要がありません。開始後、ディレクトリ情報はSIPサーバーに(Control ServerまたはWebサイト - フレンドリーなホストのいずれか)にプッシュする必要があります。Memcacheを考えてください。
3つのプロジェクトはすべて、同じ物理サーバーまたは個別のサーバーで実行されるように設計されています。これにより、サーバー間のロードバランスを実現できます。その後、複数のRTPサーバーを実行して、SIPおよび制御サーバーごとに大量のトランスコーディングを処理できます。
すべてのサービスは、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" } ] )許可するコーデックを制御できます。 suart: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"、 "user": "1000"}' -h "content -type: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"、 "user": "1000"}' -H "content -type:application/json" http:// control/control/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 -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.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", "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.1/invite
制御オプションはオプションです。これにある場合、コールフローに関する更新を受信するサーバーです。そうでない場合は、「To」フィールドにリストされているデフォルトのものが使用されます。そうでない場合は、更新は送信されません。
例:curl -x post - data -raw '{"callid": "" "、" alertinfo ":" 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 - テスト
フォルダーTestFilesには、他のテストファイルもあります。
サーバーのデフォルトのポートは、Webサーバーで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 - leak-check = yes project-rtp - fg
RegisterClient.xml&.csv。
さまざまなシナリオをテストできるSIPPで使用する構成ファイルです。
SIPP 127.0.0.1:9997 -SF RegisterClient.xml -Inf RegisterClient.csv -l -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