UPnPのDeviceInformationの情報では不足なので2016年02月25日 12:34

Twonkyやfoobarにアクセスするのに、「KnownFolders.MediaServerDevices」プロパティが使えないとすると、DeviceInformationからアクセスせよ、とMSDNの説明にはある。

※MSDNのデバイスの列挙(Enumeration)の説明

twonky deviceinformation

DeviceInformationからUPnPデバイスの情報を取得する処理を書いてみると、確かに、IDや名称、カテゴリ、IPアドレスは取得できる。もっとも、実際のアクセスには、ポート番号やデバイスの詳細情報を示すXMLへのパスが必要。しかし、それを示すと思われるプロパティの値は、null。図中のIPアドレスは、ひょっとして使えるかと思ったが、違った。

RX-V2067 Container Info

デバイスの属するコンテナの情報も取得してみる。オーディオやビデオ、写真など、どういった種類のメディアをサポートするかの情報も得られる。ただし、不足は解消しない。

いろいろ探してみると、以下の記事に詳しい。名称が付与されておらずGUIDでのアクセスが必要な属性もある。いろいろ試してみるが、結局、必要な情報は得られず。欲しい情報は軒並みnull。

※Codeprojectの記事

また、実際に動かしてみると、情報の取得に時間がかかり(20秒強)、エクスプローラでTwonkyやfoobarがすぐに認識されるのと比べ、挙動が異なる。思うに、エクスプローラはDeviceInformationは使わず、独自の実装をしているのではないか。そのあたりで、デスクトップとmobileのコードの統合が未了のため、両者の実装が異なるのではないか、と想像してしまう。

SSDP responce

ここで止めるのも惜しい。先のCodeprojectの記事のつづきに、Datagram SocketでSSDPにマルチキャストで問い合わせするコード例があるので、参考に処理を書いてみる。

こちらは、1秒もかからずに答えが返ってくる。アクセスするためのパスは、"LOCATION:"のタグで得られる。名称などの追加の情報は、このパスにアクセスして入手する。上から順に、foobar、ヤマハのAVアンプ、Twonky。

※Codeprojectの記事

Twonky description

それではと、Twonkyのパスにhttpでアクセスした結果。HttpClientのクラスを使えば簡単。XMLで記述された情報が得られる。

RX-V2067 description

ヤマハのAVアンプのパスにhttpでアクセスした結果。改行コードが入っていないが、こちらもXMLの情報が得られる。

これでようやくスタートライン。この先は、UPnPの仕様書を紐解いていけば、なんとかなるはず。実に読みにくいんだけど。