SONY BRAVIAをコマンドラインから制御したい
最新のBRAVIAで検証したところ、一部下の通りだとうまくいかないケースがありました。
続・SONY BRAVIAをコマンドラインで制御したい - shimobepapaの日記
こちらの記事もあわせて確認ください。
自宅ではSONYのBRAVIAを使用しているのですが、さすがSonyだけあってスマホ用アプリも充実をしていて、スマホをテレビのリモコンがわりに操作できたりします。
ただ、例えばhomebridgeと組み合わせてSiriからテレビを操作したかったり、バッチファイルの中に組み込んでテレビを操作したかったりすると、コマンドラインからテレビを制御したいなと思うことがままあります。そのための方法を調べてみました。
調べ方
SONY製アプリ(TVSideView)のパケットをキャプチャしてWiresharkで解析する
結果
以下、BRAVIA KD-65X8500Bで検証した結果です。
まず、電源オン操作は、Wake on Lanの仕組みを使用しているようです。テレビのmacアドレスを調べたうえで、linux環境ならば、ether-wake(etherwake)コマンドを使用するとテレビをつけることができます。
電源オン以外の操作は、パケットを解析すると、httpプロトコルでBRAVIAと通信していることがわかります。
まず命令を送る前に認証のためのアクセスをして、認証コードみたいなものをクッキーに読み込んでいるようです。
その上で認証コードをクッキーにいれた状態で、HTTPのPUTで命令を送っています。
またはじめて認証コードを取得する際には、テレビ側に四桁の数字が表示されるので、その値をアプリで入力してテレビにアプリを登録する作業が入ります。4桁の数字はBasic認証のパスワードとして送っているようです。(こうすることで、テレビにClientIDが保存されているようです)
コマンドラインから操作するということで、今回はcurlコマンドでBraviaを操作できるようにすることをめざします。
テレビのIPアドレスを固定にしておき、curlをインストールした状態で、以下のようなコマンドを打っていきます。
認証用クッキー保存
curl -d '{"method":"actRegister","params":[{"clientid":"任意のID(例 nas:20161217)","nickname":"テレビ側に登録するニックネーム(例:nas)"},[{"function":"WOL","value":"no"}]],"id":任意の数字,"version":"1.0"}' -c cookie.txt http://(BraviaのIPアドレス)/sony/accessControl
上記コマンドをいれると、はじめて指定したclientidでアクセスする場合は、テレビ側にニックネームと4桁の数字が表示されると思います。(このとき通信結果としては401が返ってきているようです)
この場合は、テレビに表示されている数字をBasic認証のパスワードにして、上記コマンドを再度送ります。curlコマンドでは以下のようになります
curl -d '{"method":"actRegister","params":[{"clientid":"任意のID","nickname":"テレビ側に登録するニックネーム"},[{"function":"WOL","value":"no"}]],"id":任意の数字,"version":"1.0"}' -u :四桁の数字 -c cookie.txt http://(BraviaのIPアドレス)/sony/accessControl
例:
curl -d '{"method":"actRegister","params":[{"clientid":"nas:20161216","nickname":"nas"},[{"function":"WOL","value":"no"}]],"id":8,"version":"1.0"}' -u :1234 -c cookie.txt http://192.168.0.100/sony/accessControl
その上で、以下のコマンドを実行することで、テレビを操作できます
通常のリモコンでできる操作
curl -d '<?xml version=\"1.0\"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:X_SendIRCC xmlns:u="urn:schemas-sony-com:service:IRCC:1"><IRCCCode>(コマンド)</IRCCCode></u:X_SendIRCC></s:Body></s:Envelope>' -b cookie.txt http://(BRAVIAのIPアドレス)/sony/IRCC
その他操作
curl -d '{"method":"setPlayContent","params":[{"uri":"(別表のリスト)"}],"id":10,"version":"1.0"}' -b cookie.txt http://(BRAVIAのIPアドレス)/sony/avContent
なにかxmlだったりjsonだったり不思議な感じですが、コマンド、uriに入るものは以下を参照してください
通常のリモコンでできるコマンドの例
電源オフ | AAAAAQAAAAEAAAAvAw== |
Volume up | AAAAAQAAAAEAAAASAw== |
Volume Down | AAAAAQAAAAEAAAATAw== |
チャンネル+ | AAAAAQAAAAEAAAAQAw== |
チャンネルー | AAAAAQAAAAEAAAARAw== |
1 | AAAAAQAAAAEAAAAAAw== |
2 | AAAAAQAAAAEAAAABAw== |
3 | AAAAAQAAAAEAAAACAw== |
... | ... |
12 | AAAAAQAAAAEAAAALAw== |
その他操作のuriの例
uri | 説明 |
---|---|
extInput:hdmi?port=1 | HDMI1に入力切り替え |
extInput:hdmi?port=2 | HDMI2に入力切り替え |
extInput:hdmi?port=3 | HDMI3に入力切り替え |
extInput:hdmi?port=4 | HDMI4に入力切り替え |
tv: | tvに入力切り替え |
extInput:widi?port=1 | スクリーンミラーリング |