IRKitのファームウェアアップデート
ファームウェアVer.3.0.0へのアップデートが出てますが・・・
気付くのが遅くて若干古い話になってしまいましたが、IRKitの脆弱性とファームウェアアップデートのお願いで、ファームウェアVer.3.0.0アップデートがリリースになっていました。脆弱性の内容はJSONP (JSON with padding)に関するものでしょうか?(良く知らない^^;)早速ワタシも自分のIRKitに適用しようとしたのですが、何故かアップデートに失敗してしまいます。
開発元に問い合わせたところ、環境によっては失敗することがあるとの事で、IRKitを開発元に送付すればアップデートして送り返してくれるという大変ありがたい返事をいただいたのですが、このような面白い事を自分でやらなくてどうしますか(^^;)。送付してアップデートしてもらうのは最後の手段として、とにかく色々試してみてみようと思いました。また、失敗した際にリトライする処理を追加した新しいアップデータVer.1.1.0まで作っていただけたので(上はアップデータVer.1.1.0でのスナップショットです)、俄然面白くなってきました。
環境によるとの話でしたので、以下を試してみました。
- MacOS X 10.9(Mavericks), 10.10(Yosemite) の異なるMacOS Xで試す
- "~/Library/Preferences/jp.maaash.irkitupdater.plist"をゴミ箱に捨てて再実行
- IRKit Updaterを起動ディスクのデスクトップやアプリケーションフォルダ配下に移動する
- MacPro(Early 2008)でなく、他の機種(iMac late 2009)で試す
- 百均で買ったマイクロUSBケーブル(充電/通信対応)でなく、某国産メーカーのマイクロUSBケーブルに変えてみる
- IRKit背面のリセットボタンを押して、初期(LEDが赤点滅している)状態にしてアップデートする
結果はいずれもダメでした。だんだん手詰まりになってきたのですが、今朝、毎日cronで動かしているPythonで作ったIRKit操作プログラムでエラーが発生して実行に失敗していることに気付きました。原因を調べてみたら、ファームウェアの修正によるHTTP APIの非互換でした。非互換の内容はHTTPリクエストに "X-Requested-With" ヘッダが必要になるというもので、このヘッダが無いと "HTTP/1.0 400 Bad Request" エラーになってしまうのでした。
この非互換が発生したと言うことは、実際にはファームウェアのアップデートは成功しているように思えます(*1)。でも、iPhoneアプリのIRKitシンプルリモコンで見ると、バージョン番号は以前のままなのですけどね。(*2)
そのような訳で、ワタシが作っているPythonのIRKit操作プログラムも非互換に対応した修正が必要になります。取りあえず簡単に以下のように修正してみました。変更箇所はIRKitクラスの赤字の部分だけです。
class IRKit:
'''Irkit class'''
def __init__(self, host, port):
url = 'http://' + host + ':' + port + '/messages'
self.request = urllib.request.Request(url, headers={'X-Requested-With': 'XMLHttpRequest'})
def get(self):
'''最も新しい受信した赤外線信号を返す。'''
with urllib.request.urlopen(url=self.request) as self.f:
return self.f.read().decode('utf-8')
def post(self, json_data):
'''赤外線信号を送信する。'''
with urllib.request.urlopen(url=self.request, data=json_data.encode('utf-8')):
pass
|
"X-Requested-With"ヘッダを付加するため、URLリクエストを使用するようにしました。このヘッダは付いていれば良いようなので、実は値は適当です(^^;)。"X-Requested-With"をググッてみて見つかった値を設定しています。更にPOSTするJSONデータに"password"を付加する処理が必要なのかもしれませんが、その処理がなくても、上記修正だけで何とか動いているようです。
因に、iOS, Androidのアプリは既に最新ファームウェアVer.3.0.0に対応済みですが、Mac用のアプリIRLauncher(現時点での最新版はVer.0.2.2)はまだ対応できていないようで、ファームウェアアップデートを適用すると赤外線信号の取得、送信ができなくなります。
- *1:
- 開発元の見解では、ファームウェアアップデート後に再度読み込んで正常に書き込みできているか確認しているとのことで、その確認中に失敗すると、正常に書き込みできているのに失敗したと表示する場合があるそうです。
- *2:
- これは単にアプリの表示が更新されていないだけでした。表示を更新するには、IRKitシンプルリモコンを起動して、「設定(左上の青い三本線)」>IRKitデバイスをタップ>「名前を変更」>「完了」とすると更新されます。
更新後にはバージョン番号が3.0.0.0.g85190b1と表示され、ファームウェアがアップデートされている事が確認できました。
|