録画したよね DLNAを調べてUDPでハマる

録画して溜めてしまう。

レコーダーに空きが無くなって、レコーダーを追加する。

そんなこんなで、5台のHDDレコーダーが稼働しています。
すると、どこに録画したのか判らなくなりますね。
各社独自に連携するプロトコルがあって、まとめて一覧する様な機能があるのだけれど、メーカーが違うと連携してくれない。

そこで、DLNA でタイトルを収集して管理できないかと考えました。
Windows 上では、DIXIM Play など DLNA に対応したソフトはあるのだけれど、レコーダーをまとめて検索したりする機能はなさそう。
捜せば見るかるのかもしれないけれど、作った方が自分の好みに調整できそう。

さて、DLNA という単語は知っていても、具体的なプロトコルとか調べたことはなかったので、そこから始めます。
DLNA.org を確認します。ざっくりとしたまとめとしては、UPnP でレコーダーを探して、HTTPで情報を得るというところまで見つかりました。

まずは、UPnP の SSDP(Simple Service Discovery Protocol)です。
LAN 内で一斉送信して、応答があれば DLNA サーバーの機器が見つかるという訳です。
SSDP は、UDP でマルチキャスト送信して、応答を UDP で待ちます。
送受信の内容は HTTP と同じです。
TCP では、相手と接続を確立して、送受信して、切断という手順を踏みますが、UDP は接続の手順が無いので送りっぱなしです。
つまり、UDP は送信と受信がバラバラという事になります。

まずは、機器を捜す M-SEARCH メッセージを送ります。
ここでハマりました。
ネットワークモニタで監視していましたが、何も送信されませんでした。
シンプルに、Socket で送信しているつもりでしたが、なぜ送信されないのか判りませんでした。
何日も悩みました。ハマると、もう何もかも疑うのですが原因が見つかりません。

やっと見つけた原因は、送信元の Bind でした。

いつものように、IPEndPoint(IPAddress.Any, 0) としていたのが原因でした。
開発環境には、IPv6 が3つ、IPv4 が1つ、Network I/F として定義されていました。
IPAddress.Any では 、マルチキャストの 239.255.255.250 宛てが LAN 上に送信されなかったのです。
Network I/F から IPv4 のアドレスを特定して、IPEndPoint(localNetwork, 0) としたら無事送信されました。


レコーダーからの応答も受信できて、やっと次へ進めます。

コメント