マイコン工作実験日記

Microcontroller を用いての工作、実験記録

RTPを両方向にする

2008-08-26 00:37:26 | VoIP
今度は、呼を接続状態までもっていき、RTPを両方向に流すことにします。想定するフローは次のとおりです。SIP的には一般的な発呼/切断シーケンスですが、PHS電話網とつなぐ場合にはALERTよりもPROGRが返ってきて、網からのRBTを聞く動作が多く、180 Ringingではなくて183 Session Progressになるようです。今回の実験ではX-Liteに呼び出し音を鳴らしてもらうために、180を使うことにしました。

180に続いて、200 OKにSDPを付けて返すことにより、呼が接続されます。X-LiteからもRTPが送られてきますので、これを受信して読み捨てるだけのRTP受信タスクも用意しました。切断手順も、今度はCANCELではなくてBYEのリクエストが来るようになるので、これを受けられるように機能追加です。RTPの送受信タスクはBYEを受けた時に終了させます。これらの変更でどうにか接続/切断できるようになりました。接続時のX-Lite画面はこんな感じです。



じつは200 OKを返してもACKがX-Liteから返ってこないという問題が発生して、ハマッテしまいました。X-LiteはRTPを送ってきたので、200 OKが届いることは確かなのにACKが返ってこないという症状でした。X-Lite側で動作のデバックログを採る機能があり、そのログを調べたところ、X-Liteでは確かにACKを作成して それを送信しようとしていたのですが、その送り先が自分自身になっていることが判明しました。200 OKの内容をよくよく調べてみたら、Contactヘッダで設定しているアドレスが間違ってX-Lite側のアドレスになってしまっているのが原因でした。

動作確認のため、WireSharkでパケットをキャプチャしてみました。WireSharkではVoIP関連機能が充実しているので、以下で簡単に紹介しておこうと思います。まず、VoIP解析してグラフを描かせてみると、バッチリRTPの流れた時間まで表示してくれます。良くできてますねぇ。



RTPの再生機能も用意されています。下図の例では上側がVoIP GWからの音声でいつもの"Hello World"を繰り返し流しています。下側はX-Liteからの音声ですが、マイクつなげていない状態なので何も載っていません。単なる再生だけなら、それほどたいした機能でもありませんが、Jitter Bufferサイズの変更ができるようになっているところがシャレています。バッファサイズを小さくすると、どのていどパケットを落としてしまうかがシュミレーションできるようです。



RTPの解析機能も用意されています。上りと下りそれぞれの方向でのパケット送出間隔のゆらぎ(ジッタ)の変化を調べられ、それをグラフ化することもできるようになっています。



上の表示はVoIP GWが送出しているRTPです。パケットの間隔がほぼ20ms間隔で安定しており、ジッタが小さく抑えられていることが確認できます。一方、下の表示はX-Liteが送出しているRTPです。3ms程度のジッタがあることがわかります。わたしのPCの処理速度が遅いのか、Windows XPのタスクのスケジューリングの都合なのか、それともX-Liteの実装の都合なのかはわかりませんが、3ms程度であれば何の問題もないでしょう。