PJSIP の pjsua ダイヤラー (pjsua_app.c、PJSIP 2.0.1 に基づく) を TCP トランスポートと SIP トランクと共に使用して、携帯電話に電話をかけています。ダイヤラーは TCP 経由で SIP サーバーに登録し、TCP 経由で INVITES も送信します。UDP トランスポートは使用されていません。
環境はこのようなものです -
PJSIP (NAT の背後)<--- SIP over TCP ---> SIP サーバー <--- SIP トランク --> SIP トランク プロバイダー <-- PSTN/モバイル ゲートウェイ-->携帯電話
すべての呼び出しは、PJSIP over TCP からモバイルに行われます。UDP トランスポートの作成を無効にするため"cfg->no_udp = true;"
に、関数の最後に行を挿入しました
"static void default_config(struct app_config *cfg)" in pjsua_app.c
ここに記載されている手順に従って、TCP 経由で呼び出しを行いました。
問題は、モバイル エンドから PJSIP ダイヤラに送信されたオーディオを受信できないことです。しかし、PJSIP ダイヤラからの RTP パケットはモバイル側に問題なく到達します。通話が確立されると、モバイルで音声が聞こえます。
パケット トレースから、PJSIP ダイヤラーでメディアを受信しない理由は、SIP サーバーが SIP トランク経由で受信した RTP パケットをプライベート IP アドレスに送信しているためであることがわかりました。
しかし、登録のために UDP に切り替え、TCP 経由で INVITES を送信すると、呼び出しは正常に機能します (両端でオーディオ)。
Wireshark パケット キャプチャは次を示します -
1. PJSIP registers with server over TCP.
2. Server sends 401 with PJ's public IP and port in VIA
3. PJ registers again but inserts its public ip and port in the
contact header in the next REGISTER message sequence.
So far so good. Same sequence of messages seen when UDP is used to REGISTER.
4. INVITE sent over TCP. Dialog establishment works fine.
But in the record-route header nat=yes is missing.
5. Server sends media to private IP. No media received at PJSIP.
これは PJSIP のバグですか? もしそうなら、どうすればこれを修正できますか。Wireshark パケット トレースは、リクエストに応じて利用できます。皆様のご協力とご意見をお待ちしております。