トップ «前の日記(2012-03-17) 最新 次の日記(2012-03-21)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2012-03-18

_ DLNAスピーカーと戯れる

まだ、戯れるどころか翻弄されているだけだが、メモ。

  • UPnPライブラリで変更が必要な点

    (DLNAのプロトコルがわからないため、サーティフィケーションできないので、UPnPライブラリとしては正しい動作の可能性がある、というか動作しているはずだから難しい。オープンクラスで良かった)。

    1. UPnP::SSDP

      会話用の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と異なるのかも知れない。

    2. UPnP::Control::Service#parse_service_state_table

      スピーカーは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
      
    3. AVTransport.GetPositionInfoなど
      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)なのでわかりにくいことこの上ない。

    4. UPnP::Control::Service#method_missing

      1.9系では動かない。面倒なので、obj.driver.メソッド 形式で利用しているが、respond_to? の実装が1.8っぽい。

        def respond_to?(message)
          @driver.methods(false).include? message.to_s || super
        end
      

      多分、to_sが不要

  • Windows Media Player 12の問題

    ノートPCから制御ができないので、何がなにやら(WMPも動作しないわけでUPnPの問題ではなく、マカフィーのファイアウォールが設定を無視しているのか? とかいろいろ)だったが、こいつが、SetAVTransportURIの呼び出しでCurrentURIに、VirtualBoxのIPアドレスを設定してスピーカーに送り込んでいたことが判明。でも、WMPにはサーバーのIPアドレスを設定する項目が無い……。いちいちコントロールパネルから、ネットワークデバイスの無効化とかしてやるしかないのかな? というわけで、WMPの役立たずっぷりがわかった。っていうか、普通は仮想マシンのIPアドレスは内部IPアドレスに対するNATではなく、同じネットワークのIPアドレスを割り当てるものなのかな?

ONKYO WAVIO ワイヤレススピーカーシステム DLNA対応 15W+15W ブラック GX-W70HV(B)

あわせてインストールしたい Wireshark

あわせて読みたい ミニ実験でつかむパケット解析手法 ネットワーク原理の観察からトラブルシューティングまで(荒井 美千子)


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|

ジェズイットを見習え