この記事では、SIPプロバイダーまたは他のデバイスの可用性を確認するのが面白いと思う1つの方法を共有したいと思います。何らかの理由でリクエストのicmp側をチェックすることができず、SIPプロトコルのOPTIONSリクエストに基づいている場合に特に関連します。 私はこのトピックに興味があります、私は猫の下で尋ねます。
そのため、RFC 3261に記載されているSIPプロトコルには素晴らしいOPTIONSリクエストタイプがあり、このタイプのリクエストはパーティの互換性を確認するために使用され、クライアントはリモート側がサポートするメソッドに関する情報を取得でき、最も重要なことには、呼び出しを行う必要がありませんリモート側(INVITE要求を送信する必要はありません)。 RFCからのOPTIONSリクエストの例:
オプションsip:carol@chicago.com SIP / 2.0
経由:SIP / 2.0 / UDP pc33.atlanta.com; branch = z9hG4bKhjhs8ass877
最大転送:70
宛先:<sip:carol@chicago.com>
From:Alice <sip:alice@atlanta.com>; tag = 1928301774
呼び出しID:a84b4c76e66710
CSeq:63104オプション
連絡先:<sip:alice@pc33.atlanta.com>
承諾:application / sdp
コンテンツの長さ:0
このようなリクエストに対する答えは、INVITEリクエストを送信した場合と同じである必要があります。たとえば、200(OK)の場合、リモート側はコールを受信する準備ができていることを意味します。実際の部分では、IPパケットを準備する必要があることになります関連するデータを使用してリモート側に送信し、回答を取得します。 これを行うには、たとえばPerlで簡単なスクリプトを作成します。
#!/ usr / bin / perl
IOを使用する::ソケット。
POSIX 'strftime'を使用します。
sub SipPing {
my($ msg、$ remotehost、$ callid、$ socket、$ date、$ branch、$ localip、$ dest);
$ remotehost = shift;
$ localip = shift;
$ socket = IO :: Socket :: INET-> new(
PeerAddr => $ remotehost、
PeerPort => 5060、
LocalPort => 5060、
LocalAddr => $ localip、
再利用=> 1
プロトタイプ=> 'udp'、
);
$ callid。=( '0' .. '9'、 "a" .. "f")[int(rand(16))] for 1 .. 32;
$ date = strftime( '%a、%e%B%Y%I:%M:%S%Z'、localtime());
$ branch = "z9hG4bk"。 時間();
私の$パケット= qq(
オプションsip:$ remotehost SIP / 2.0
Via:SIP / 2.0 / UDP $ localip:5060; branch = z9hG4bK39aaa111; rport
最大転送:70
From: "UA" <sip:ua \ @ $ localip>; tag = as54192a85
宛先:<sip:$ remotehost>
連絡先:<sip:アスタリスク\ @ $ localip:5060>
Call-ID:7706430b46622c057aeaa5ec057a0b59 \ @ $ localip:5060
CSeq:102オプション
ユーザーエージェント:UA
日付:2013年12月21日水曜日00:00:01 GMT
許可:INVITE、ACK、CANCEL、OPTIONS、BYE、REFER、SUBSCRIBE、NOTIFY、INFO、PUBLISH
サポート:置換、タイマー
コンテンツの長さ:0
);
$ socket $パケットを出力します;
eval {
ローカル$ SIG {ALRM} = sub {die};
アラーム1。
my $ sock_addr = recv($ socket、$ msg、190.0);
アラーム0;
1;
}または「失敗」で死ぬ。
if($ msg){
print "Response:$ msg \ n";
} else {
「失敗」を印刷します。
}
閉じる($ソケット);
}
$ remoteHost = '192.168.0.3';
$ localIp = '192.168.0.2';
&SipPing($ remoteHost、$ localIp);
この単純なスクリプトを使用すると、登録や呼び出しを必要とせずに、SIPエージェントの可用性を確認できます。 一部のプロバイダーは、ポート5060からポート5060までのみOPTIONSリクエストの受信を許可します。これは、ローカルポートを示すためです。たとえば、アスタリスクなどでポートがビジーの場合は、Reuse => 1パラメーターが便利です。