博多南ウェブサービスのblog

博多南ウェブサービスのサービス紹介

メモ:IRKit のサービス終了に伴う、ファームウェアの書換

IRKit のサービスが終了したので、 サーバーに接続せずにローカルのみで使うよう、 Adrian さんの fork settings-led-cloud を、IRKit に書き込んでWifi のセットアップ、リモコン信号をIRKit から送信まで確認したときのメモです。

なお、この記事は私の環境では上手くいったということを参考までにお知らせするものです。

この記事を参考に、ご自分でファームウェアのアップデートされる方に生じた何らかの損失、損害等について、 私は一切責任も負うものではありません。

以下、目次

手順

  1. Adrian さんの step-by-step guide を参考に IRKit に settings-led-cloud バージョンのファームウェアを書き込み
  2. IRKit の ssid に接続し、wifi セットアップ用の Post リクエストを送信
  3. リモコン信号がIRKit から送信されていることを確認

手順を進めるうえではまったところ

Adrian さんの step-by-step guide を参考に IRKit に settings-led-cloud バージョンのファームウェアを書き込み

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'

参考リンク