読者です 読者をやめる 読者になる 読者になる

SONY BRAVIAをコマンドラインから制御したい

自宅ではSONYBRAVIAを使用しているのですが、さすが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://(BraviaIPアドレス)/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://(BraviaIPアドレス)/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://(BRAVIAIPアドレス)/sony/IRCC
その他操作
curl -d '{"method":"setPlayContent","params":[{"uri":"(別表のリスト)"}],"id":10,"version":"1.0"}' -b cookie.txt http://(BRAVIAIPアドレス)/sony/avContent

なにかxmlだったりjsonだったり不思議な感じですが、コマンド、uriに入るものは以下を参照してください

通常のリモコンでできるコマンドの例
電源オフ AAAAAQAAAAEAAAAvAw==
Volume up AAAAAQAAAAEAAAASAw==
Volume Down AAAAAQAAAAEAAAATAw==
チャンネル+ AAAAAQAAAAEAAAAQAw==
チャンネルー AAAAAQAAAAEAAAARAw==
AAAAAQAAAAEAAAAAAw==
AAAAAQAAAAEAAAABAw==
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 スクリーンミラーリング