さて、前回
[家電][iOS][Android] ダイキンエアコンの無線Lanアダプタ(BRP051A41)が不安定・つながらない その1
つながらない原因をハード面から攻めてみたが、こんどはソフト面より検証する。
検証にあたって、無線LanアダプタにはDHCPを使わずにIPアドレスを固定することが出来る。まずは固定して接続する(192.168.10.150とした)。
同一LANに接続したパソコンのブラウザからhttp://192.168.10.150/を見てみると、なんにも表示されないが正常にレスポンスしているように見える。
このことから、HTTP(80ポート)による通信を疑い、今度はプロキシ経由でiphoneから純正アプリを使って見て、いろいろと通信ログを観察してみる
使ったアプリは
http://murapong.hatenablog.com/entry/2012/12/29/194128
で紹介されている「Charies」でhttpやhttpsのキャプチャが出来る。iphoneのプロキシ設定をして接続してみると・・・
http://daikinsmartdb.jp/ : 外部サーバー(外から操作するときに情報を取得・送信する)
https://daikinsmartdb.jp/
にちょくちょくアクセスしている。
外部サーバーの通信は内容も見れるが、今回は、ローカルでの検証が主であるし、サーバーサイドの問題であれは解決もできないし、サーバーに負荷をかけてはいけないので、今回は無視。
エアコンからの情報取得は
http://192.168.10.150/common/basic_info : エアコンの名前などの取得
http://192.168.10.150/common/get_notify : 通知の取得
http://192.168.10.150/aircon/get_model_info : よくわからない
http://192.168.10.150/aircon/get_sensor_info : 外気温・室内気温などの取得
http://192.168.10.150/aircon/get_control_info : エアコンの運転状態の取得
http://192.168.10.150/aircon/get_timer : たぶんタイマー関係?
http://192.168.10.150/aircon/get_program : 設定温度プログラム関係?
で、色々取得している。まだ料金の取得など色々ある。また、温度セットや運転開始関係は
http://192.168.10.150/aircon/set_control_info
これにGETリクエストの引数を与えると、ついたり、消せたり、運転モードを変更できる。
色々とあるので、興味ある人は調べてみるとすぐわかる。そんな難しくないので、自作でダイキンAPPと同等のものが作れると思う。
さて、ダイキンのアプリが反応しないとき(ローカルLAN内)、無線LANアダプタのレスポンスはどうなのか?
ちょうどよく反応しなくなったときに、Chariesでログを見てみた。どうやら、無線LANからの返事が返ってきていない時もあれば、返ってきてるのもある。
どういうことかというと、先のbasic_infoは正常に取得できているが、get_model_infoが取得できないなど、どれか一つでも取得できないと通信エラーとなってしまうらしい。
しかも、タイムアウトが短い気もする。タイムアウトが短いから取得しきれずにエラーとなってる気がする。タイムアウトが長いブラウザで、その取得を失敗したアドレスを直打ちしてアクセスすると、時間はかかるが、ちゃんと応答が返る
これを是正するには2つ方法が有効と、色々やってみてわかった。
- 無線LANアダプターのリセット
- なんらかの方法で直接HTTPリクエストを送りタイムアウトを延長する
まず、1の方法から、
これは簡単で、
http://192.168.10.150/common/reboot
上のリンクをLAN内からブラウザで踏めばリセットされる。しかし、WAN側からのリセットはWAN⇒LANでNAT変換をしてパケットを通過させる必要がある。それには、各社ルーター設定が必要となる。NECとバッファローのリンクを下に貼っておく
https://121ware.com/aterm/regist/qa/sanko/00020-2.html :NEC Aterm
http://faq.buffalo.jp/app/answers/detail/a_id/8346?bufqa : バッファロー
ルーターで80ポートを外部に向かって開放してNAT変換で無線LANアダプタに送ってやれば
http://<グローバルIP>/common/reboot
でリブートできる。できれば、ポート変換を併せて利用するなりして、80ポートではないポートからのほうがセキュリティー上いいかもしれない。NECの1800HP2は無理だった・・・。バッファローは確か、その機能はあったはず。
http://<グローバルIP>:1234/common/reboot :例1234ポート利用
DDNSサービスとか固定IPサービスを利用すれば、固定リンクでブラウザなどにブックマークしておくと、不調の時にブックマークを踏むと再起動するようにはできて便利と思う。余談だが、再起動するとサーバーへのアクセスもリセットされるため純正アプリの反応もよくなる傾向にあった。
2の方法は、ちょっとめんどくさいというか、アプリを作れる人向け。
これは1の方法の、リブートコマンド以外も、リクエストして、直接、無線LANアダプタに命令を送るという方法。
オンオフ、温度設定、運転モード(冷暖房・除湿・送風)を選べれば大体の人は十分な機能と思う。
しかし、この3つは先に書いたset_control_infoのリクエストのみで実現されている。そのため、現在の運転状態を取得(get_control_info)してから、送らなければならない。
ブックマークで登録するにもリクエストが固定化されていないため、プログラムでの処理が必要となる。細かく書くと長くなるので割愛する。httpリクエストの処理は、以前作ったHttp処理クラスをそのまま流用。単純なGETリクエストとレンポンスの処理であるので、そう難しくはないと思う。
デザインは全く考えてない。ダイキンの外部サーバーを使わずに直接WANからLANにNAT変換にてアダプタとパケット通信するようにしている。グローバルIPの固定化はDDNSは以前より利用しているので、この点も問題無し。
最低限のオンオフ、運転モード切替、温度変更、消費電力推移ぐらいの機能を付けた。良い点が、温度設定プログラム(ある時間になると指定した設定温度にする)機能がオンのままでも温度変更が出来るようになったのはよかった。純正アプリだといったん温度設定プログラムを切らないと変更できない。あと、ログインやら、接続機器をさがしに行かないので、操作のレスポンスが大幅に改善されたこと。アダプタ再起動が遠隔から出来る機能をつけた。この、リセットを付けたのは次の理由による。
理由とは、これで観察した結果、無線LANアダプタがLAN接続して時間が経つ(48時間程度?幅あり)と、どうも反応が鈍くなったり返さなくなったりしている様子(15秒ほど待たされることもあり、最悪タイムアウト)。でも、全く反応しないわけではない。繰り返してると取得できたりもする。そのときにはアダプターリセットすると反応が復活する。
この原因は無線LANアダプタなのかルーターなのかは、ちょっとかわからない。
しかし、これが原因で「外から接続」で「ネットワーク機器がみつからない」とか運転開始したのにされてないとかが、発生しているのは間違いないと思う。
1日毎にでも再起動するようにファームでできないものなのか・・・。
ちなみに、エラーの検証用のアプリなので審査に出す予定も改善する予定もないのであしからず・・・。
アダプタの固定IP化、ルーターのポート開放、NAT変換、DDNS又は固定IPをクリアすれば遠隔からのアダプタリセットは1の方法で可能なので、できる人はやってみるといいかもしれない。
追記[2015-11-20]
いまところ、切断やリセットすることなく順調に接続を維持している。やはり、たまにアダプタに接続してやると調子よいみたい。NECのルーターだと「ホームIPロケーション機能」ってのがあるらしく、固定IP風に使えるみたい。これを利用してもいいかも。
また、アダプタの定期リセットについて、レンタルサーバーを借りている人はcronというスクリプト定期実行というのがある。これを用いて、phpやperlで固定ipあてのアドレスにリセットを1日毎(毎日深夜0時とかに)送ってやると手間暇かけず安定すると思う。実際は、phpで15分毎に電力や温度変化をデータベースに記録していくというスクリプトを実行しているけど3日ちゃんと記録できているみたい。というか、ここまでくると何をしたいのかわからないww
でも、北海道(といっても暖かい方)での寒冷地エアコンの使用レビューのデータを集めるにはいいとおもう。