世界を動かす技術を、日本語で。

使い捨て vape でウェブサイトをホスティングする

概要

  • 使い捨てVape から Webサーバー を構築した技術的な記録
  • PUYA製マイコン (PY32シリーズ)を活用した詳細な分解と解析
  • SLIPプロトコルsemihosting を利用したネットワーク接続方法の解説
  • uIPスタック の移植と最適化による速度向上の工夫
  • プロジェクトリソース や参考情報も紹介

使い捨てVapeでWebサーバー

  • 数年間、 使い捨てVape を収集し、主に バッテリーの再利用 を目的とした活動
  • 最近のVapeは USB-C充電再充電可能バッテリー を搭載し、単なる使い捨てとは言い難い進化
  • 分解中に発見した PUYA製IC(PY32シリーズ) の存在
    • PUYAは フラッシュメモリ で有名だが、 安価なARM Cortex-M0+マイコン も製造
  • 複数モデルのVapeから同一メーカーの PY32ベース基板 を入手
  • デバッグピンの明示 に感謝

搭載マイコンの特徴

  • IC型番は PUYA C642F15、実際は PY32F002B と推定
  • 主な仕様
    • 24MHz Cortex M0+
    • 24KiBフラッシュ
    • 3KiB RAM
    • 最低限の周辺機能
  • スペックは控えめだが、 Webサーバー運用は可能 と判断

ネットワーク接続の手法

  • semihosting を活用し、 syscall的にデータ転送 を実現
    • デバッグ接続経由で 双方向通信 を可能に
  • USBシリアルデバイス は実質的に昔のモデムをエミュレート
    • SLIP(Serial Line Internet Protocol) でIPパケット通信
  • LinuxやmacOS でのSLIPサポート
    • slattach コマンドで仮想ttyデバイス経由のIP通信
    • pyOCDsocat を組み合わせ、semihosting出力を仮想ttyへ転送
  • コマンド例:
    • pyocd gdb -S -O semihost_console_type=telnet -T $(PORT) $(PYOCDFLAGS) &
    • socat PTY,link=$(TTY),raw,echo=0 TCP:localhost:$(PORT),nodelay &
    • sudo slattach -L -p slip -s 115200 $(TTY) &
    • sudo ip addr add 192.168.190.1 peer 192.168.190.2/24 dev sl0
    • sudo ip link set mtu 1500 up dev sl0

uIPスタックの移植と最適化

  • uIP小型IPスタック で、 RTOS不要 かつ移植が容易
    • 最小限のHTTPサーバーサンプル も付属
  • SLIPコードをsemihostingに合わせて修正
  • ARMアーキテクチャ特有のアライメント制約 で例外発生
    • ファイルシステム構造をPerlで修正 し、移植性向上

サーバーの速度改善

  • 初期状態では Ping応答1.5秒、パケットロス50%、ページロード20秒超
  • 1バイト単位の逐次通信 がボトルネック
  • リングバッファを導入 し、まとめてデータ処理
    • バッチ送信 でパフォーマンス向上
  • 改善後は Ping応答20ms、パケットロス0%、ページロード160ms
  • RAM使用量レイテンシ のバランス調整
    • 例: FLASH 20.82%使用、RAM 44.92%使用

実用性と拡張性

  • 20KiBの空き容量 でブログ記事程度の静的ページは十分配信可能
  • サーバーサイド処理 もC言語で実装可能
  • JSON APIエンドポイント を追加し、リクエスト数やMCU IDを取得可能

参考リソース

  • プロジェクトのコード は公開リポジトリで参照可能
  • 関連情報や同様のMCU識別プロジェクトも紹介

本記事は、 使い捨てVapeのマイコン を活用した 極小Webサーバー構築 の実践記録。 エンジニアリングの工夫組み込み技術の応用例 として参考になる内容。