今回は自室にあるエアコンを操作するリモコンの信号を丸裸にしていきます!なんでそんなことするの?自分で赤外線信号つくって操作したいからです!おうちハックしたいからです!!!我が家のエアコンを紹介するぜ!今回リバースエンジニアリングの犠牲対象になるのはこちらのリモコンでございます。2004年製造のダイキン製AN22EDS-Wに対応したリモコンです。モジュールの組み立てで製作したモジュールを使って実際に信号を解析していきます。赤外線を用いたリモコンでは、制御信号を0と1のパルスに変換してこれを高周波の搬送波で変調したものを送信しています。詳しくはChaN氏による赤外線リモコンの通信フォーマットが大変参考になります。この文献によれば、エアコンのリモコン信号は大きくNECフォーマット家製協(AEHA)フォーマットSONYフォーマットの3つに分けられます。AEHAフォーマットでは各ビットのデータは以下の図に示すようなフォーマットになっています。赤外線リモコンの通信フォーマットより引用パルスが立っている間は無駄な電力消費を抑えるため変調された信号が出力されていることがわかります。以下はAEHAフォーマットの信号定義ですが、開始を示すLeaderに続いて各種データが定義されています。実際に信号を解析する信号を可視化するまずは、irrp.pyで学習した信号を可視化してみます。このスクリプトが出力するファイルには信号がON(Mark)の時間とOFF(Space)の時間が交互に記録されているので、ひとまずこれを波形として表示させます。最初に以下のコマンドでデータ用の一時ファイルを生成します。/tmp/plot続いて生成したファイルからgnuplotを使ってグラフを作ります。"pulse"以上のスクリプトを実行すると以下のような結果が得られます。この結果より、このリモコンは1回の操作につき3つのフレームを送っていることがわかります。拡大してみると、フレームの先頭にはきちんとLeaderが存在していることも確認できます。なんか頭にも信号あるんじゃない?そこなんだけど、すっ飛ばした信号を送っても動いたから大丈夫みたいなんだよね大丈夫なんだ......先頭にはフレームではないパルスが出力されていますが、信号を実際にエミュレートしたところこの部分を省いてフレーム部分から送信しても動作したので必ずしも必要な信号ではないっぽいです。フォーマットを調べるそれでは信号の詳細な解析を進めていきたいと思いますが、まずはこのリモコンが先の3つのフォーマットのうちどれに対応しているものか調べる必要があります。以下のようにしてMarkの時間の出現頻度を調べてみると、Markの時間の最頻値として483の値が得られます。483これが引用した図における単位周期Tであると仮定すると、LeaderのMark部分は3583であることよりおよそTの8倍にあたることがわかります。8意外とぴったり8倍じゃないんだねずれが大きめに出てるけど、NECフォーマットとAEHAフォーマットを区別できるから問題ないかな以上でこのリモコンはAEHAフォーマットに基づいた信号を送っていることが判明しました。単位周期ですが、Spaceのヒストグラムを調べると最頻値として386の値が得られます。386検出の誤差を埋めるため、ここでは1回のMarkとSpaceの時間の平均を単位周期Tとします。435送っているデータを調べるフォーマットが分かればあとはどんなデータがどこに埋め込まれているのかを調べていく作業になります。データビットの仕様は参考リンクで示した通りなので、まずはこれをデコードするスクリプトを以下のように作成しました。時間のシーケンスを単位周期Tで割ったものを順次見ていく形のスクリプトです。これを使って標準入力から受け取った信号のON/OFFの時間データをデコードするスクリプトがこちらです。ここからは地道に状態を変化させた信号のバイナリとのにらめっこになります。適当にやってもらちが明かないので、ざっくりと分かりやすいところからこんな順番であたりをつけていきます。風向風量フラグ以下の結果は電源のON/OFFを示す制御信号をデコードした結果を並べたものです。Frame2のData3において、下位4ビットが電源OFF時は1000、電源ON時は1001へ変化していることがわかります。11110100このような形で最低限制御に必要な部分だけ抽出していくと以下のようになりました。チェックサムチェックサムを調べるさて、最後にチェックサムがどのように算出されているかを調べてフィニッシュです。ここは規格で決まっているわけではないので完全に実装依存なのが憎たらしいですが仕方ないですね。結論から言うと今回のリモコンではLeaderに続くデータを8bitごとに分割したものの総和の下位8ビットがチェックサムになっていました。以下のコードを上記のaehadump.pyの末尾に追記して実行することで確認を行いました。8))[:-1]]))}")総和を算出するところまではよかったんですが、途中でチェックサムも総和に加えてしまったおかげで「チェックサム全然わからなくない??」と言いながらすっかりハマってしまいましたが......。まとめエアコンのリモコン信号をリバースエンジニアリングしました。ここで解析した結果から信号を組み立てていけば、自身でエアコンのリモコンのような振る舞いをさせるものを作れますね。以上の解析結果に基づいて実際にエアコンを制御するAPIを作成しました。作成したAPIはこちらの記事で紹介していますのでご覧ください。コメントをキャンセルメールアドレスが公開されることはありません。付いている欄は必須項目です次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。高専プロコンサイトコンテンツイチ押し記事このサイトについてプライバシーポリシーpaltee.net。