【前編】ルーターのrootfsを拡張してPythonをビルドしてみる

本記事はルーターハックAdvent Calendar 9日目の記事です。

これは、遅れを取り戻す物語。(コピー風)(このリズム感どっかで聞いたことあると思ったらFGOでした。FGO1ミリもしらんけど。)

8日目の記事では、USB ポートのないルーターに USB を生やして使えるようにするまでを書いた。こいつを使えば、USB メモリでルーターの rootfs(Windows でいう C ドライブ)の容量を拡張して好き勝手やることができる。今回は、GCCをインストールして Python をビルドしてみよう。

なぜ遅れを取り戻さなければならないのに時間がかかるネタをやろうとするのかは筆者自身でも不明である。

おことわり

技適 に関する筆者の配慮や考えについてはカレンダー1日目「技適とルーターハック」をご覧ください。本記事で紹介する内容は、法を遵守するための慎重な注意をもって書かれています。

www.zopfco.de

SDカードを準備

やろうと思えば opkg を使ってルーターに fdisk や mkfs.ext4 も入れられるのだが、面倒なのでPC側でフォーマットしてしまった。

f:id:puhitaku:20181216011450p:plain

前半 7000 MiB を ext4 でフォーマットし、残る容量を swap とした。WHR-HP-GN のメインメモリは32 MiB と大変少ないので、swap がなければまず GCC の動作は無理だろう。

f:id:puhitaku:20181216125056j:plain
接続!

SD カードを rootfs の拡張領域にする

OpenWrt は何もせずとも overlayfs を用いてメインストレージ(多くの場合 SPI Flash)の固定された rootfs と書き換え可能な領域を分割して提供する。これを pivot_root (2) で置き換える形で、外部ストレージもまた rootfs の overlay として使うことができる。

これからの作業は公式のマニュアルにも記載されている。ぜひ参照されたい。

まず必要な道具として以下を make で追加しビルド。

  • Utilities -> Filesystem -> swap-utils
  • Global build settings -> Kernel build options -> Support for paging of anonymous memory (swap)
  • Base system -> block-mount
  • Base system -> busybox -> Linux System Utilities -> swapon swapoff
    • Customize busybox options にチェックを入れると出現

生成されたら ssh で転送して sysupgrade しよう。

ここで SD カードリーダーを挿入し、 block detect を実行すると以下のようにファイルシステムが認識される。 これは /etc/config/fstab として置く設定ファイルを自動生成するコマンドだ(実行するだけでは書き換えられない)。

root@OpenWrt:~# block detect
config 'global'
        option  anon_swap       '0'
        option  anon_mount      '0'
        option  auto_swap       '1'
        option  auto_mount      '1'
        option  delay_root      '5'
        option  check_fs        '0'

config 'mount'
        option  target  '/mnt/sda1'
        option  uuid    '31407de4-3283-4dfd-b391-375cc78c9a04'
        option  enabled '0'

config 'swap'
        option  uuid    '49c9c539-29d9-4f56-b775-691b1fcdff86'
        option  enabled '0'

認識していることが確認できたら、現在の overlayfs に置いてあるファイルを SD カードにコピーする。公式ドキュメントでは tar を使ってちょっとテクいことをしているが、普通にコピーすれば OK だ。

root@OpenWrt:~# mount /dev/sda1 /mnt
[ 3669.913854] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
root@OpenWrt:~# cp -r /overlay/
.fs_state  upper/     work/
root@OpenWrt:~# cp -r /overlay/* /mnt/

最後に /etc/config/fstab を生成し、全エントリを有効にする。ext4 なパーティションの mount point は /overlay に変更する。

root@OpenWrt:~# block detect > /etc/config/fstab
root@OpenWrt:~# vi /etc/config/fstab
...
root@OpenWrt:~# cat /etc/config/fstab
config 'global'
        option  anon_swap       '0'
        option  anon_mount      '0'
        option  auto_swap       '1'
        option  auto_mount      '1'
        option  delay_root      '5'
        option  check_fs        '0'

config 'mount'
        option  target  '/mnt/sda1'
        option  uuid    '31407de4-3283-4dfd-b391-375cc78c9a04'
        option  enabled '1'

config 'swap'
        option  uuid    '49c9c539-29d9-4f56-b775-691b1fcdff86'
        option  enabled '1'

完了したらリブート!

リブート後…

以下のようなログが出て、df を見て容量が半端ないことになっていれば成功だ。

[   12.135475] block: attempting to load /tmp/jffs_cfg/upper/etc/config/fstab
[   12.276824] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts:
[   12.452555] mount_root: switched to extroot
root@OpenWrt:/# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 2.0M      2.0M         0 100% /rom
tmpfs                    13.6M     64.0K     13.5M   0% /tmp
/dev/sda1                 6.7G     16.1M      6.3G   0% /overlay
overlayfs:/overlay        6.7G     16.1M      6.3G   0% /
tmpfs                   512.0K         0    512.0K   0% /dev

あれ?swap が有効になってない。anon_swap を1にしたりしても効かないので、今回はとりあえず手動swaponすることにした。

root@OpenWrt:/# swapon /dev/sda2
[   65.211586] Adding 698364k swap on /dev/sda2.  Priority:-2 extents:1 across:698364k
root@OpenWrt:/# free
             total       used       free     shared    buffers     cached
Mem:         27840      18440       9400         60       1804       4920
-/+ buffers/cache:      11716      16124
Swap:       698364          0     698364

うん、OK。

ビルド環境を整え動作確認

ここからは楽しい冒険の始まりだ。

GCC を入れる

opkg でちゃちゃっと。と思いきや。

root@OpenWrt:/# opkg install gcc
Installing gcc (5.4.0-3) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/packages/gcc_5.4.0-3_mips_24kc.ipk
Collected errors:
 * opkg_download: Failed to download http://downloads.openwrt.org/snapshots/packages/mips_24kc/packages/gcc_5.4.
 * opkg_download: Check your network settings and connectivity.

 * opkg_install_pkg: Failed to download gcc. Perhaps you need to run 'opkg update'?
 * opkg_install_cmd: Cannot install package gcc.

んんん???ダウンロードに失敗??PCで試すとダウンロードできるのに。

と、ここで opkg の tmpdir は /tmp なのを思い出す。そうか… gcc のパッケージがメモリに入り切らないんだな!

tmpdir を普通のディレクトリに切り替えて回避。USB 2.0 にも対応してないのでめちゃくそ遅いけど。

root@OpenWrt:~# mkdir cache
root@OpenWrt:~# opkg --tmp-dir /root/cache install gcc
Installing gcc (5.4.0-3) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/packages/gcc_5.4.0-3_mips_24kc.ipk
Installing zlib (1.2.11-2) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/base/zlib_1.2.11-2_mips_24kc.ipk
Installing libbfd (2.27-1) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/base/libbfd_2.27-1_mips_24kc.ipk
Installing libopcodes (2.27-1) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/base/libopcodes_2.27-1_mips_24kc.ipk
Installing objdump (2.27-1) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/base/objdump_2.27-1_mips_24kc.ipk
Installing ar (2.27-1) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/base/ar_2.27-1_mips_24kc.ipk
Installing binutils (2.27-1) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/base/binutils_2.27-1_mips_24kc.ipk
Installing libstdcpp (7.3.0-1) to root...
Downloading http://downloads.openwrt.org/snapshots/targets/ar71xx/tiny/packages/libstdcpp_7.3.0-1_mips_24kc.ipk
Configuring zlib.
Configuring libbfd.
Configuring libopcodes.
Configuring objdump.
Configuring ar.
Configuring binutils.
Configuring libstdcpp.
Configuring gcc.

よし入った!

make を入れる

実は make はパッケージで入れなくてもソースコードから bootstrap build ができる。以前はそこまでやっていたが、今回はそれほど M なプレイをしたいわけではないので普通に入れる。

root@OpenWrt:~# opkg install make
Installing make (4.2.1-2) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/packages/make_4.2.1-2_mips_24kc.ipk
Configuring make.

sl を落としてビルドしてみる

ここで、ほんとに make できるのか往年の sl で試してみる。GitHub から clone するために git-http をインストールする。

root@OpenWrt:~# opkg install git-http
Installing git-http (2.20.0-1) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/packages/git-http_2.20.0-1_mips_24kc.ipk
Installing libopenssl (1.0.2p-1) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/base/libopenssl_1.0.2p-1_mips_24kc.ipk
Installing git (2.20.0-1) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/packages/git_2.20.0-1_mips_24kc.ipk
Installing libmbedtls (2.13.0-1) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/base/libmbedtls_2.13.0-1_mips_24kc.ipk
Installing ca-bundle (20180409-3) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/base/ca-bundle_20180409-3_all.ipk
Installing libcurl (7.62.0-1) to root...
Downloading http://downloads.openwrt.org/snapshots/packages/mips_24kc/base/libcurl_7.62.0-1_mips_24kc.ipk
Configuring libmbedtls.
Configuring ca-bundle.
Configuring libcurl.
Configuring libopenssl.
Configuring git.
Configuring git-http.

clone そして make。

github.com

root@OpenWrt:~# git clone https://github.com/mtoyoda/sl.git
Cloning into 'sl'...
remote: Enumerating objects: 97, done.
remote: Total 97 (delta 0), reused 0 (delta 0), pack-reused 97
Unpacking objects: 100% (97/97), done.
root@OpenWrt:~# cd sl
root@OpenWrt:~/sl# make
gcc -O -Wall -o sl sl.c -lncurses
sl.c:41:20: fatal error: curses.h: No such file or directory
compilation terminated.
make: *** [Makefile:15: sl] Error 1

んんっ。ncurses がない。Python でも ncurses はあったほうがいいので入れておくか。

ncurses がないので入れる

パッケージでは ncurses は用意されていない。GNU から落としてくる。

Index of /pub/gnu/ncurses

root@OpenWrt:~# wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.1.tar.gz
wget: SSL support not available, please install one of the libustream-.*[ssl|tls] packages as well as

んんんっw ヤクの毛を刈る感じがしてきたぞw

httpsに必要なあれこれを入れる。

root@OpenWrt:~# opkg install libustream-openssl ca-certificates 
...
root@OpenWrt:~# wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.1.tar.gz
Downloading 'https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.1.tar.gz'
Connecting to 208.118.235.20:443
Writing to 'ncurses-6.1.tar.gz'
ncurses-6.1.tar.gz   100% |*******************************|  3286k  0:00:00 ETA
Download completed (3365395 bytes)

よし、ビルドだ!

root@OpenWrt:~# tar zxf ncurses-6.1.tar.gz
root@OpenWrt:~# cd ncurses-6.1
root@OpenWrt:~/ncurses-6.1# ./configure

もう configure だけで意味わからんぐらい遅くて最高w USB 1.1 は厳しいな…。

configure だけで40分かかった。このあと走らせた make は実に6時間ぐらいかかってしまった。かなり絶望的なスピードである。

気を取り直して sl

「sl のビルドなんかやろうと思わなきゃよかった」と若干の後悔の念はありつつ、気を取り直してビルド。

root@OpenWrt:~/sl# make
gcc -O -Wall -o sl sl.c -lncurses
root@OpenWrt:~/sl#

おお?

f:id:puhitaku:20181216102958p:plain

おおお!!!やったー!

一旦切ります

…さて。ここまでで結構な時間を使ったためちょっと疲れてしまった。この記事は前編として、後編にて Python のビルドに入りたいと思う。

ルーターに USB を生やせ!

本記事はルーターハックAdvent Calendar 8日目の記事です。

わやくそ遅れていて申し訳ない。

さて。今日は もともと USB ポートのないルーターに USB を生やす 回である。SoC に USB PHY があるのに使わないというのはもったいない。ハードオフの青いかごで眠っていた324円のルーターと一緒に、次なる高みを目指そうじゃないか。

おことわり

技適 に関する筆者の配慮や考えについてはカレンダー1日目「技適とルーターハック」をご覧ください。本記事で紹介する内容は、法を遵守するための慎重な注意をもって書かれています。

www.zopfco.de

ひとまずはんだ付け

先日からハックの犠牲になってもらっている Buffalo WHR-G301N を改造する予定だったのだが、ミスってリアルに犠牲になってしまったので(苦笑)、スペックの近い代用品として改造済み WHR-HP-GN を利用する。利用できる遺産は利用していこう。

WHR-G301N にも WHR-HP-GN にも USB ポートはないが、SoC には USB PHY が搭載されている。

f:id:puhitaku:20181210231711p:plain
データシート。

USB は差動通信するので DP と逆相の DN がある。この2本を接続すれば原理的には通信できそうだ。というわけで接続したのが以下。

f:id:puhitaku:20181216001514j:plain

ファーム側でUSB有効化…のはずが

WHR-HP-GN や WHR-G301N を含む Atheros のチップを搭載した機種(アーキテクチャ名 ar71xx)は、OpenWrt において大きな転換点を迎えている。というのも、もともとはハードウェアの初期化のために機種ごとに異なるCのコードが用意されていたのだが、新しいアーキテクチャ名 ath79 として Device Tree による実装に置き換えられつつあるのだ。(情報をくださったmusashino_205さんに感謝

この流れに乗ろうと WHR-HP-GN も DTS 化を目指した。幸運にもハード的には WHR-HP-G300N とほぼ同じなので、実質的にそれの DTS を使えば WHR-HP-GN も初期化できる。もともとの初期化コードにも WHR-HP-G300N の隣に WHR-HP-GN の記述がなされていることが確認できる

各種記述を追加して早速やってみたのだが、USB を有効化してもprobeがうまくいかない。正確には probe というか、物理層が何かしらうまく行っていない感じだ。

[  431.775895] usb 1-1: new full-speed USB device number 2 using ohci-platform
[  432.065887] ohci-platform 1b000000.usb: frame counter not updating; disabled
[  432.072990] ohci-platform 1b000000.usb: HC died; cleaning up
[  436.836023] usb usb1-port1: attempt power cycle

USB は何かと闇が深いスタックで本業でも泣かされてきたので、今回はひとまず深堀りはやめて DTS ベースの初期化は諦めた。実を言うと ar71xx ベースでの USB 追加は以前やって発表したものと全く同じになるので避けたかったのだが。

初期化コードを加工する

openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-whr-hp-g300n.c に以下のような加工を加える。見た目通りって感じ。

diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-whr-hp-g300n.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-whr-hp-g300n.c
index 48f49ad0f7..84ee3c8a4c 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/mach-whr-hp-g300n.c
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-whr-hp-g300n.c
@@ -21,6 +21,7 @@
 #include "dev-gpio-buttons.h"
 #include "dev-leds-gpio.h"
 #include "dev-m25p80.h"
+#include "dev-usb.h"
 #include "machtypes.h"

 #define WHRHPG300N_GPIO_LED_SECURITY           0
@@ -123,6 +124,8 @@ static void __init whrhpg300n_setup(void)
                                    AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN |
                                    AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN);

+       ath79_register_usb();
+
        ath79_register_leds_gpio(-1, ARRAY_SIZE(whrhpg300n_leds_gpio),
                                 whrhpg300n_leds_gpio);

カーネルモジュールを追加する

USB という物理層自体のドライバに加え、それ以上のレイヤーのドライバ、例えば USB storage を扱うドライバなどを追加しなければデバイスは利用できない。以前紹介した make menuconfig で追加していく。USB メモリを使うとして、主に必要なのは

  • Target System -> Atheros AR7xxx/AR9xxx
  • Kernel Modules -> USB Support -> kmod-usb-core
  • Kernel Modules -> USB Support -> kmod-usb-ohci
  • Kernel Modules -> USB Support -> kmod-usb-storage
  • Kernel Modules -> Filesystems -> kmod-fs-ext4
  • Kernel Modules -> Native Language Support -> kmod-nls-iso8859-1

といったところ。

挿してみる

手元にあった適当なUSBメモリを挿してみる。

[   86.223642] usb 1-1: new full-speed USB device number 3 using ohci-platform
[   87.638134] usb-storage 1-1:1.0: USB Mass Storage device detected
[   87.647383] scsi host0: usb-storage 1-1:1.0
[   88.680846] scsi 0:0:0:0: Direct-Access     UFD 3.0  Silicon-Power8G  PMAP PQ: 0 ANSI: 6
[   89.588758] sd 0:0:0:0: [sda] 15306752 512-byte logical blocks: (7.84 GB/7.30 GiB)
[   89.601729] sd 0:0:0:0: [sda] Write Protect is off
[   89.611736] sd 0:0:0:0: [sda] No Caching mode page found
[   89.617179] sd 0:0:0:0: [sda] Assuming drive cache: write through
[   89.680778] random: crng init done
[   89.690053]  sda: sda1
[   89.723805] sd 0:0:0:0: [sda] Attached SCSI removable disk

うん、いい感じ。見慣れたログが出る。マウントはどうか?中身のファイルシステムが何かも忘れてるけど。

root@OpenWrt:~# cd
root@OpenWrt:~# pwd
/root
root@OpenWrt:~# mkdir mnt
root@OpenWrt:~# mount /dev/sda1 mnt/
[  170.459769] FAT-fs (sda1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
root@OpenWrt:~# ls mnt/
System Volume Information  efi
boot                       keymap.pro
bootmgr                    reagent.xml
bootmgr.efi                sources

マウント成功。どうやら Windows のリカバリ USB のようだ。関係ないが keymap.pro は NiZ Plum のキーマップファイルだ。

USBは無限大

USBが挿さるということは、健康なギーク男子が想像するようなあんなものやこんなものが挿さってしまうということだ。さりとて、USB Storage こそ USB 機器の基本ともいえる。実際こいつが使えると rootfs の拡張がいとも簡単に成し遂げられてしまうし、ハックの幅を広げる第一歩ともいえるだろう。

次回は、USB メモリを実際に rootfs を広げる道具として使い、GCC を入れたりルーターの上で make をビルドしたりしてみたいと思う。なんだかLFSチックな話で胸が踊る。

蚊取りルーター・スマートノーマット

本記事はルーターハックAdvent Calendar 7日目の記事です。

さて、前回までに OpenWrt のインストールやカスタマイズまで軽く紹介したところで、7日目の今回は「イベントとかで発表したけど記事にしてなかった過去作」の紹介企画、【過去作供養】コーナー第1弾である。

第1弾のハックは、その名も「蚊取りルーター・スマートノーマット」だ!

おことわり

技適 に関する筆者の配慮や考えについてはカレンダー1日目「技適とルーターハック」をご覧ください。本記事で紹介する内容は、法を遵守するための慎重な注意をもって書かれています。

www.zopfco.de

当時

2016年は5月、まだ春の気温が続く頃、こんなツイートがバズっていた。

『Wi-Fi繋がりそうな勢い』…!!? ルーターにしちゃえばいいじゃん!!!

ツイート主にちゃんとDMで許可を取り、実際に小さなルーターを中に入れてマジのルーターにしてしまうことにした。

ノーマットの解剖

写真の商品は、蚊取り装置の代表とも言えるアース・ノーマットの電池式だった。薬液がしみこんでいるカートリッジに風を当て、まわりに蚊を忌避する成分を拡散させる仕組みだ。

www.earth.jp

買った。

f:id:puhitaku:20160523185257j:plain

即バラした。

f:id:puhitaku:20160523191313j:plain

部品を並べたのが以下。羽根の間からドライバーを差し込んでグリッとやらないと外れないパーツがあったりと案外複雑だった。

f:id:puhitaku:20160523191117j:plain

f:id:puhitaku:20160627222331j:plain

基板部を拡大してみると、TSOP8 と思われるパッケージの IC と、モーターが回るだけにしては案外複雑な周辺回路が見える。カートリッジ残量が減るとLEDで知らせる 仕組みがある(カートリッジにボタン電池がついていて、おそらくこれの電圧をADCしている)ことや、モーターの回転数を一定量に保つ必要もあるであろうことから、それなりに複雑になるのかもしれない。

…いやそれにしてももっと簡素になりそうなものだが。

ルーター選定

当時、上海問屋で売ってるやたら安くてコンパクトなルーターとして NEXX WT1520 が話題になっていた。見た感じだとノーマットに入りそうということで、早速買ってみた。

f:id:puhitaku:20160522233327j:plain

そしてバラす。

f:id:puhitaku:20160522231512j:plain
グリッと。

f:id:puhitaku:20160522231648j:plain

CPU に Ralink RT5350 @ 360MHz、Flash 8 MiB、RAM 32 MiB の構成。USBポートも元からあるのでコンパクトさに対してずいぶん遊びやすいルーターだ。

基板を取り出しノーマットの電池ボックスにあてがうと、これまたサイズがピッタリ。ノーマットに入れてくれと言わんばかりのピッタリさだ。

ノーマットの加工

そうと分かればあとはノーマットを加工してルーターを繋ぎこむだけだ。配線途中の画像がこちら。

f:id:puhitaku:20160628001432j:plain
LEDを交換し、ファン・LED・電源スイッチを配線。

f:id:puhitaku:20160628005451j:plain
ICはもう要らないので、ひっぺがしてランドにはんだ付け。

f:id:puhitaku:20160628005546j:plain
雑に配線。

今見てもかなり雑な配線である。モーターの消費電力がもともと小さくできているので、3.3V な GPIO の出力を 直接モーターに接続しても いい感じに回るのでこうした記憶がある。GPIO 番号と実際のテストポイントの対応については下記画像が参考になった。

f:id:puhitaku:20181208203358j:plain
from: https://tuxotronic.org/post/clone-wt1520/

そしてそして、電池ボックスのフタを削って組み付けたのが以下の画像である。

f:id:puhitaku:20160628221714j:plain

f:id:puhitaku:20181208205045j:plain

f:id:puhitaku:20181208205134j:plain
フタの固定はとりあえずマスキングテープw

うーんピッタリ!!

OpenWrt のインストールによって無線が使えないうえ、内蔵フラッシュが 8 MiB と遊ぶ幅がないので、rootfs を拡張するための USB メモリと、Wi-Fi ドングル(単体で技適認証を受けたもの)も配置した。

USB ハブは秋葉原で適当に買った小さいものだが、USBポートが横向きでそのままでは取り出せないので、USBハブも分解して体積を減らして詰め込んだ。

f:id:puhitaku:20181208204949j:plain
今思えば、ハブのコネクタは残す必要がなかったし直に繋げばよかったかも。

スマホから制御できるようにする

これだけではモーターは回らない。せめてスマホから操作できなければ「スマート」ノーマットとは呼べない。そこで API サーバーとフロントエンドを実装した。コードは GitHub に上げていた記憶があるのだが、実際に見てみると初手のコミットしかなくそのままになっている。めっちゃ頑張ってフロント書いたのに!過去の自分を呪いたい。

github.com

バックエンドは GPIO を書き換えるほかは静的ファイルをサーブするだけなので Flask でパパッと記述した。フロントエンドに関しては、当時社内ツールで React を使ったのでノリで React + JSX で書いた。

f:id:puhitaku:20181208205922p:plain
実際のスクショ。

上の画像では残量表示とか AUTOMATIC SWITCH なる項目が未実装で適当だが、実機にChromeでアクセスして得たスクショである。ボタンを押すと裏で XHR が走り、GPIO がスイッチされる。

ちなみに、ON にするときの API へのリクエストは DELETE 192.168.1.1/api/mosquitoes である。

当時公開しなかった理由

AUTOMATIC SWITCH が示唆するように、当時は窓を開けるとスイッチオンとか、GPS で自動でノーマットの電源を入れるみたいな機能を構想していた。だが、その自動制御を手前にしてやる気の灯火が消えてしまい、明治大学で開催された ABPro 2016 で発表した程度でお蔵入りになってしまった。結局長い不作の期間と共に夏も終わり、完全に発表するチャンスを逃してしまったのだ。

まあネタとしては面白かったし、今でもルーターハックの語り草としてよく登場させる印象的なハックだった。Advent Calendar として成仏させられてよかったと思う。

次回

さて、1日遅れで展開しているルーターハック Advent Calendar の次回は、ルーターのブートシークエンスについて書こうと思う。どっちかというと、U-Boot 〜 Login shell までの流れについて、個人の理解のために書く感じだ。乞うご期待。