2013-10-21 14 views
11

モバイルネットワークプロバイダが作成したWindowsデスクトップアプリケーションを使用して、SIPを使用して電話をかけたり、メッセージを送信したりすることができます:MESSAGE最後の4行): WiresharkSIP経由でインスタントメッセージを送信する方法

MESSAGE要求、デスクトップアプリケーションからは、(後ろから4行目)として送信される。

MESSAGE sip:[email protected] SIP/2.0 
Via: SIP/2.0/UDP LOCALIP:2112;branch=z9hG4bK-d8754z-905183245f478c76-1---d8754z-;rport 
Max-Forwards: 70 
To: "TO"<sip:[email protected]> 
From: "FROM"<sip:[email protected]>;tag=63088d09 
Call-ID: NGVhMDJhYzQwNmExOTQyNThmNjc5OGNmOTViNDUyYWM. 
CSeq: 2 MESSAGE 
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO 
Content-Type: text/plain 
Content-Length: 4 

test 

及びそのための成功し応答することである:

SIP/2.0 407 Proxy Authentication Required 
Via: SIP/2.0/UDP LOCALIP:2112;received=EXTERNALIP;branch=z9hG4bK-d8754z-905183245f478c76-1---d8754z-;rport=2112 
To: "TO"<sip:[email protected]>;tag=c005f0e30133ec730add76fc91f4bea 
From: "FROM"<sip:[email protected]>;tag=63088d09 
Call-ID: NGVhMDJhYzQwNmExOTQyNThmNjc5OGNmOTViNDUyYWM. 
CSeq: 2 MESSAGE 
Content-Length: 0 
Proxy-Authenticate: Digest nonce="3F178051B97E1F5200A3C53D4B",realm="DOMAIN",algorithm=MD5,qop="auth" 

その後、私は同じ(とn-バリエーション)を送信しようとPHPからの要求が、私はいつもSIP/2.0 403 Forbidden代わりのSIP/2.0 407 Proxy Authentication Required受け取る:

SIP/2.0 403 Forbidden 
Via: SIP/2.0/UDP LOCALIP;received=EXTERNALIP 
To: "TO"<sip:[email protected]>;tag=aprqngfrt-f7ccjj0000020 
From: "FROM"<sip:[email protected]>;tag=8f7be81d 
Call-ID: [email protected] 
CSeq: 1 MESSAGE 
Reason: Q.850;cause=55;text="Call Terminated" 
Content-Length: 0 

を面白い部分は、私はREGISTERリクエストを送信する場合、それが動作すること、ですSIP/2.0 401 UnauthorizedヘッダーをWWW-Authenticateと打ちました。私は認可を再計算し、それを再送します。それから私はSIP/2.0 200 OKを受け取る。どのようにそれがMESSAGEで動作するはずです。

何が間違っている可能性がありますか?私は何を取りこぼしたか? MESSAGEリクエストの前に他のリクエストが必要ですか(私はすでにREGISTERを試しました)?
私はRFC 3428を上下に読み、可能なすべての例を試しましたが、成功しませんでした。

+0

私は 'SIP'エキスパートではありません。あなたは何をしているのか知っているようです。私が言うことができるのは、ロックなしで他のソフトウェア(動作する)とまったく同じように行動していると信じるならば、あなたは違うことをしていると言います。おそらく制御文字の不一致が '\ n'と' \ n \ r'のような良いスタートになるかもしれません。 – Mehran

+0

@Mehran: 'REGISTER'メソッドが動作しているので、異なるタイプの" new-lines "が違いを生むとは思いません。たとえば、 'CSeq'ヘッダをリクエストから削除すると、SIPサーバは' SIP/2.0 400 Missing CSeq Header'を返します。これは通信がOKであることを示しています。私は 'MESSAGE'メソッドが正しく送信されたと思います。それは他のものでなければなりません;( –

答えて

5

受信した403応答を調べると、Reasonヘッダーが表示されます。最初のQ.850文字列は、これがITU-T Recomendationで定義された原因コードであることを示しています。

具体的には、原因コード55はISDNに関連しており、文章では「クローズドユーザーグループ内で禁止されている着信コール」(RFC 3398でチェックできます)ということです。通常、メンバーのグループ内では、制限された。

一方、原因55は、特にユーザー(送信者または受信者)に関連する要求内の問題を示します。SIPユーザ間の通常のメッセージ交換が図を示し、以下:

 A    Server    B 
     | REGISTER |    | 
     |--------------->|    | 
     |  200 OK  |    | 
     |<---------------|    | 
     |    | REGISTER | 
     |    |<--------------|   
     |    |  200 OK | 
     |    |-------------->| 
     | MESSAGE  |    | 
     |--------------->| MESSAGE | 
     |    |-------------->| 
     |    |  200 OK | 
     |    |<--------------| 
     |  200 OK  |    | 
     |<---------------|    | 

ユーザAが必要なく、(IMSのような)ほとんどのシステムは、認証メカニズムとして使用していないから、実際には、厳密され、REGISTER。その後、REGISTERリクエストに、特別なヘッダは以下のとおりです。

Contact: <sip:[email protected]_IP:LOCAL_PORT> 
Expires: REGISTRATION_DURATION 

がREGISTERに200のOKの回答は、Expires:ヘッダーまたは有効期限を受け入れ示しContact:ヘッダ内のexpiresパラメータを含めることができ、心に留めておいてください。例:

SIP/2.0 200 OK 
... 
Contact: <sip:[email protected]_IP:LOCAL_PORT>; expires=60 
... 

この状況では、この有効期限(例では60秒)前に再登録する必要があります。

携帯電話にSMSを送信しようとしている場合、受信ポイントはネットワークプロバイダのMGCFによって直接管理されるため、送信者の登録またはMESSAGEリクエストが残されます。あなたのオリジナルメッセージ案について

は、URI(メッセージの最初の行)を要求、次のようになります。

MESSAGE sip:[email protected] SIP/2.0 

それがメッセージ受信エンティティを参照するので。

これが役に立ちます。

+0

@GlavićQ.850コードとSIPの関係については、[RFC 3398](https://)で知ることができます。 www.ietf.org/rfc/rfc3398.txt)MESSAGEリクエストURIについては、あなたのユーザに関する情報(my_phone_numまたはusernameは除く)を指定するのではなく、_destination_についての値を 'TO'値としてください。メッセージ転送のための要求URI、実際には、それはあなたの問題にマッチするでしょう、あなたはあなたにメッセージを送信しようとしています。 – jcm

+0

@GlavićあなたがSMSを送信しようとしている場合は、sip:TO @ DOMAINの代わりにTel URI形式を試してみましたか:tel:+ ? – jcm

+0

@Glavić原因コード55は、最初は、提供された作業グループ(管理ユニット)のこのユーザに対する何らかの制限を意味しますが、ユーザの非互換性の要求<-->も参照できます。前のメッセージから、メッセージを送信する前に発信者と呼び出し先のユーザーを既に登録していると思いますが、間違っていますか? – jcm

2

私がコメントしたように、私はSIPの専門家ではありませんが、私の友人はです。

SIPプロトコルは、各通信が固有のダイアログID(HTTPのセッションIDなど)を持つダイアログであることを意味するダイアログプロトコルです。 SIPとHTTPの違いは、セッションIDは異なるTPC/IP接続(HTTP要求)間で使用され、ダイアログIDは同じTPC/IP接続内ではあるが異なるメッセージ間で使用されるということです。

ここでやろうとしていることは、HTTPでのセッションハイジャックのようなものです。 HTTPでセッションIDをハイジャックして別のクライアントから送信することは可能ですが、SIPでは同じではありません。私の友人によると、SIPサーバーには内部メモリがあり、その内部メモリにはダイアログIDがどの接続に属しているのか、ダイアログIDを知るだけで他のユーザーのメッセージにメッセージを伝えることはできません。

実際にあなたがしようとしているのかどうかはあなたの質問では言いませんが、そうであれば、あなたはできないと言わなければなりません。 REGISTERコマンドを送信できるということは、SIPサーバーとの通信が行われていることを示しています。あなたがする必要があるのは、あなた自身の対話を開始し、そこから取り出すことだけです。

+0

PHPでSIPスタックを実装しようとしているのであれば、利用可能なライブラリを使用していないのはなぜですか?/p/php-sip /。このようなプロジェクトをインターネット上でたくさん見つけることができます。 – Mehran

+0

残念ながら、しかし、すでに成功していないSIPサーバと通信しているライブラリをいくつか試してみたら、 – Mehran

関連する問題