PHPでDMC

■前々から気になっていたことに、リビングで使う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の構成は下図のようになります。

DMC with PHP(cURL)

 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...など)を触って使い方を探っているところです。

Copyright (C) 2008-2015 Satosh Saitou. All rights reserved.
戻る
■キーワード
日記::一覧展開
2016.06
2016.05
2015.12
2015.11
2015.08
2015.07
2015.06
2015.05
NTPを整備する (2015.05.02)
2015.04
2015.03
2015.02
2015.01
2014.12
PHPでDMC (2014.12.13)
jouornald (2014.12.07)
2014.11
2014.10
2014.09
RaspberryPi B+ (2014.09.06)
2014.08
2014.07
2014.06
2014.05
2014.04
2014.03
2014.02
2014.01
ISCP (2014.01.11)
2013.12
2013.11
2013.10
2013.09
2013.08
2013.07
Fedora19 (2013.07.20)
2013.06
Google Cloud Print (2013.06.30)
wiringPi (2013.06.01)
2013.05
2013.04
2013.03
Fedora18 (2013.03.09)
2013.02
Backupその後 (2013.02.24)
Backup (2013.02.17)
2013.01
2012.12
2012.11
2012.10
2012.09
2012.08
2012.07
2012.06
2012.05
2012.04
2012.03
2012.02
2012.01
2011.12
2011.11
2011.10
2011.09
2011.08
2011.07
2011.06
2011.05
2011.04
2011.03
2011.02
2011.01
2010.12
2010.11
2010.10
2010.09
2010.08
2010.07
2010.06
2010.05
2010.04
2010.03
2010.02
2010.01
2009.12
2009.11
2009.10
2009.09
2009.08
2009.07
2009.06
2009.05
2009.03
2009.02
2009.01
2008.12
2008.11
2008.10
2008.09
2008.08
2008.07
2008.06
2008.05
2008.04
2008.03
音が小さい (2008.03.30)
2008.02
1998.11
作成:2014.12.07
公開:2014.12.13

Valid XHTML 1.1

loading image reserved place