著作一覧 |
まだ、戯れるどころか翻弄されているだけだが、メモ。
(DLNAのプロトコルがわからないため、サーティフィケーションできないので、UPnPライブラリとしては正しい動作の可能性がある、というか動作しているはずだから難しい。オープンクラスで良かった)。
会話用のUDPSocketを239.255.255.250のメンバーシップにしているが、少なくともスピーカーはソースIPアドレスに対して応答を返している。したがって、IP_ADD_MEMBERSHIPを呼んではならない。
SSDPポートはWindowsでは他のサービスに食われている(ようだ)。スピーカーはSSDP M-SEARCHを送信したIPアドレスにレスポンスを返すので、ポート1440にバインドしないでエフェメラルポートを利用する。でも、これってM-SEARCHのHOST変数を無視しているってことなので、スピーカーの実装ミスなのかDLNAの仕様なのかは不明。
追記:UPnP-arch-DeviceArchitecure-v1.1の1.3.3では、
To be found by a network search, a device MUST send a unicast UDP response to the source IP address and port that sent the request to the multicast address.としている。したがって、ONKYOの実装は正しい。WinSockのIP_ADD_MEMBERSHIPがUnix Socketと異なるのかも知れない。
スピーカーはstateVariable要素のCurrentTrackDurationに対してdefaultValueとして00:00:00を返す。したがって、以下の行でエラーとなる。
if default then default = default.text.strip raise Error, "insecure default value #{default}" unless default =~ /\A\w*\z/ end
また、default.txtが空要素の場合があり、この時、text属性にはnilが入るため、無条件にstripを呼ぶと例外となる。以下のように修正する。
if default && default.text then default = default.text.strip raise Error, "insecure default value #{default}" unless default =~ /\A[\w:]*\z/ # :の追加だけでOKかは不明 end
REXML::ParseException: #<ArgumentError: invalid byte sequence in US-ASCII>l;
などのエラーになりまくり。default_externalをutf-8にしているのだが、REXMLは何を元にしているんだろう?(このあたりはまだ手をつけていない)。
追記:REXML::IOSourceに問題があり なのだが、この場合、Content-Typeにはutf-8がセットされていて、かつopen-uriを利用している場合もSOAP4Rを利用している場合も、それは正しく認識している。しかも特定のフラグメントの処理時にUS-ASCIIになる(それ以外はUTF-8)なのでわかりにくいことこの上ない。
1.9系では動かない。面倒なので、obj.driver.メソッド 形式で利用しているが、respond_to? の実装が1.8っぽい。
def respond_to?(message) @driver.methods(false).include? message.to_s || super end
多分、to_sが不要
ノートPCから制御ができないので、何がなにやら(WMPも動作しないわけでUPnPの問題ではなく、マカフィーのファイアウォールが設定を無視しているのか? とかいろいろ)だったが、こいつが、SetAVTransportURIの呼び出しでCurrentURIに、VirtualBoxのIPアドレスを設定してスピーカーに送り込んでいたことが判明。でも、WMPにはサーバーのIPアドレスを設定する項目が無い……。いちいちコントロールパネルから、ネットワークデバイスの無効化とかしてやるしかないのかな? というわけで、WMPの役立たずっぷりがわかった。っていうか、普通は仮想マシンのIPアドレスは内部IPアドレスに対するNATではなく、同じネットワークのIPアドレスを割り当てるものなのかな?
あわせてインストールしたい Wireshark。
あわせて読みたい ミニ実験でつかむパケット解析手法 ネットワーク原理の観察からトラブルシューティングまで(荒井 美千子)
ジェズイットを見習え |