SIPプロバイダーの可用性の確認

この記事では、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パラメーターが便利です。



All Articles