Microsoft Wireless Keyboard 800 listenner 〜李下に冠を正さず〜


                                                      2019/4/1 7M4MON




KeySweeper (by Samy Kamkar)というMicrosoft Wireless Keyboard 800から無線で送信される
キーコードデータを解析してゴニョゴニョする、ぁゃιぃ オープンソース・ハードウェアがあるのですが、
別件でnRF24L01を使用する予定がありましたので、私も Microsoft Wireless Keyboard 800 を入手して試してみました。




ワイヤレス技術をアタックで検証 by 堀合啓一 によると、英語版と日本語版ではデバイスIDの5バイト目が違うらしいです。
上記資料では p[4] = 0xCD を 0xCE にすれば良いとされていましたが、その変更では動作しませんでした。
調査したところ、私の手元の Microsoft Wireless Keyboard 800 は、p[4] = 0xCF となっていました。
というわけで、キーボード検出の条件式を "(p[4] == 0xCD) || (p[4] == 0xCE) ||(p[4] == 0xCF)" としておきました。

私は盗聴したキーコードを用いてゴニョゴニョしたい訳ではなく、純粋な技術的興味で作成しましたので
ゴニョゴニョ部は無効(Flash記録もshout送信もSMS発信もしない)として、大型の16セグメントLED
受信したキーコードを表示するようにしました。


表示器はI2Cの 16bit IOエキスパンダ MCP23017 + トランジスタアレイ に接続されています。
16セグメントで小文字を含めたアルファベット+数字+半角記号を表示可能です。
日本語のキーコードは英語と異なる(例:英語のキーコードはShift+2が@になる)ので
hidcodes.hに手を入れて正しい記号が表示されるようにしました。
ドットの部分は16ビットからあぶれてしまいますので、マイコンのGPIOから直接制御します。
DPはフォントに準拠し、 ! と ? と . のときだけ点灯させます。


フォントはMITライセンスのこれを使用しました。
ピン配置が全然違いますので、これを使って並び替えました。
並び替えは下記のとおりです。

/* maps segments to actual bits in chip */
uint16_t chip_bits[16] = {
    0,    // A
    1,    // B
    3,    // C
    6,    // D
    7,    // E
    8,    // F
    9,    // G
    13,    // H
    14,    // K
    15,    // M
    2,    // N
    4,    // R
    5,    // P
    11,    // S
    10,    // T
    12,    // U
};


コードは github に上げましたのでご自由にどうぞ。

かかった費用

1800円くらい。


感想