IRKit のサービスが終了したので、 サーバーに接続せずにローカルのみで使うよう、 Adrian さんの fork settings-led-cloud を、IRKit に書き込んでWifi のセットアップ、リモコン信号をIRKit から送信まで確認したときのメモです。
なお、この記事は私の環境では上手くいったということを参考までにお知らせするものです。
この記事を参考に、ご自分でファームウェアのアップデートされる方に生じた何らかの損失、損害等について、 私は一切責任も負うものではありません。
以下、目次
手順
- Adrian さんの step-by-step guide を参考に IRKit に settings-led-cloud バージョンのファームウェアを書き込み
- IRKit の ssid に接続し、wifi セットアップ用の Post リクエストを送信
- リモコン信号がIRKit から送信されていることを確認
手順を進めるうえではまったところ
Adrian さんの step-by-step guide を参考に IRKit に settings-led-cloud バージョンのファームウェアを書き込み
- twitter 上では、settings-led-cloud バージョンのソースコードを変更したほうがいいかもみたいな書き込みもあったが、今回はしていない
- pull request でのコメントにあったとおり、Arduino IDE 1.0.6 を利用する
- 本家のファームウェアアップデート方法 にあるとおり、Arduino IDEのメニューから ツール -> マイコンボード -> "Arduino Leonardo" を選ぶ
IRKit の ssid に接続し、wifi セットアップ用の Post リクエストを送信
wifi 情報を serialized したものを Post する必要があるが、javascript でどうやってするのかはリンク切れのよう
なので、bouzuya さんのnode-irkit を参考にさせてもらった。
javascript で serialized wifi 情報を出力するコードは以下のとおり。
"use strict"; // Original Source Code: http://jsdo.it/mash/keyserializer-test // MIT License // This Source Code is transpiled from https://github.com/bouzuya/node-irkit/blob/master/src/irkit-device-key-serializer.ts typescript // to javascript, and add a little change. // CRC-8-Dallas/Maxim function crc8n(u8, crcinit) { if (u8 < 0x00 || u8 > 0xFF) { throw new Error('only input less than 1byte as number'); } var crc = crcinit ^ u8; for (var i = 0; i < 8; i++) { var poly = (crc & 0x80) === 0x80; crc = (crc << 1) ^ (poly ? 0x31 : 0x00); // 0x31 = X^8+X^5+X^4+X^0 } return crc & 0xFF; } // tslint:enable function crc8s(data, size, crcinit) { var crc = crcinit; for (var i = 0; i < size; i++) { var u8 = i < data.length ? data.charCodeAt(i) : 0x00; // 0 filled crc = crc8n(u8, crc); } return crc; } function hex(s) { var ret = ''; for (var i = 0; i < s.length; i++) { ret += s.charCodeAt(i).toString(16).toUpperCase(); } return ret; } function serializeSecurity(security) { return security.toString(); } function serializeSSID(ssid) { return hex(ssid); } function serializePassword(password) { return hex(password); } function serializeWEPPassword(password) { return serializePassword(hex(password)); } function serializeDevicekey(devicekey) { return devicekey; } var Security; (function (Security) { Security[Security["NONE"] = 0] = "NONE"; Security[Security["WEP"] = 2] = "WEP"; Security[Security["WPA_WPA2"] = 8] = "WPA_WPA2"; })(Security || (Security = {})); function serializeCRC(obj) { var crc = 0x00; crc = crc8n(obj.security, crc); crc = crc8s(obj.ssid, 33, crc); crc = crc8s(obj.password, 64, crc); crc = crc8n(1, crc); // wifi_is_set crc = crc8n(0, crc); // wifi_was_valid crc = crc8s(obj.devicekey, 33, crc); return crc.toString(16).toUpperCase(); } function serialize(_a) { var devicekey = _a.devicekey, password = _a.password, security = _a.security, ssid = _a.ssid; return [ serializeSecurity(security), serializeSSID(ssid), security === Security.WEP ? serializeWEPPassword(password) : serializePassword(password), serializeDevicekey(devicekey), '2', '', '', '', '', '', serializeCRC({ devicekey: devicekey, password: password, security: security, ssid: ssid }) ].join('/'); } // ここに自分のwifi 設定を入力する let obj = { devicekey: "", // ブランクでOK password: "", // home wifi passward (not IRKit wifi password) security: 8, // WPA_WPA2:8, WEP: 2 ssid: "" // wifi ssid (not IRKit wifi ssid) } // let serializedObj = serialize(obj); console.log({ serializedObj });
例えば、ssid: test_ssid, password: test_password, security: WPA_WPA2 の場合、 以下のようなPost リクエストになるはず。
curl -X POST -i "http://192.168.1.1/wifi" -H "X-Requested-With: curl" -d '8/746573745F73736964/746573745F70617373776F7264//2//////F9'