■前々から気になっていたことに、リビングで使うAVセンターにDMRの機能があるので、これを活用する方法はないかということがあった。mp3ファイルを蓄積したファイルサーバーは別の部屋にあるLinuxサーバー上にあって、これにWebアクセスさせることが可能なので、あとはDMRにその指示を送れればよい、という理屈は解っていた。解らないのはDLNAのコマンド送信のやり方で、どうにも資料が乏しい。ただ、調べていれば見えてくるもので、SONOSというワイヤレススピーカーのユーザーコミュニティでDLNA/SSDPを扱うチュートリアルの投稿が見つかった(Exploring the Sonos control API (was Developers diary))。この投稿はGNOMEプロジェクトに含まれるgUPnPのライブラリを使って説明している。これをマネして簡単なツールを作ってみようとしたら、前提になるライブラリやヘッダーがだいぶ必要になるらしく、コーディング以前のところで進めなくなってしまいました。ちょっと敷居が高い。
ただ、DLNAに関係するキーワードが幾つか解ったので、さらに手を広げてみるとupnp.orgの技術ドキュメントが出てきた(Spec. of AVtransportService)。これでだいぶ見通しが良くなりました。SSDPによるデバイス検索はともかく、デバイス検出後のコマンド送信(SOAPリクエスト)の要領が先のSONOSコミュニティ記事と併せて分かってきたのでgUPnPのライブラリを使わず、PHPのSOAPライブラリかcURLで直接送信した方がよさそうという感触がありました。。PHPのPECLライブラリにあるgUPnP拡張モジュールがバージョンが古く、セグメンテーションフォールトを起こして使えないこともあり、ほかに選択の余地もなかったということもあります。
幾つか試行錯誤したのですが、既存のDMC(Windows8/WindowMediaPlayerなど)からのリクエストをWiresharkで捕まえ、そのパケットをばらしてみてcURLでSOAPリクエストを送信することでDMRを動かすことができました。PHPのSOAPリクエストではDMRがWSDLを持たないため妥当なSOAPリクエストを生成できませんでした。DLNAのサービスで定義されている変数名をPHP-SOALの非WSDLモードでは生成されないのが致命的で、そのためcURLでSOAPリクエストを素組みしています。
サンプルとしてとりあえず1曲再生させてみました。
CurrentAVTransportURIサービスでリソースとメタデータ(インスタンスIDは0固定)を送信した後でPlayサービス(スピードは1で固定)にリクエスト送信すると再生が始まりました。
今作っているDMCの構成は下図のようになります。

mp3を蓄積しているファイルサーバーはLinuxで、その上でPHPが動きます。DMCはPHPで記述していますが、大きく2つの機能を持っています。1つはローカルにあるmp3ファイル群から特定のファイルをアーティスト、アルバム、トラック番号をキーにして取得する機能と、DMRへSOAPリクエストを送信する機能です。SOAPリクエスト経由で楽曲ファイルのアドレス(ResouceURI)を受け取ったDMRはhttp-getで普通のapacheサーバーにWebアクセスしてmp3を取得し、再生します。LinuxにはMediaTombやRygelなどのDMSが入っていますが、そのサービスは利用していません。先に挙げたキー3つを使ってDMSの外部からリソースアドレスを取得することができないので、利用できないのです。
ところでPHPが動くということはDMCをWebサービス化するのが簡単ということになりますが、それはまだ先の話。今はDMRが持つAVTransportサービスに含まれる各機能(Play, Stop, Next...など)を触って使い方を探っているところです。