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

8ビットマイクロコントローラーでのウェブサイトホスティング

概要

  • AVR64DD32 マイコンを使い、 シリアル通信のみ でWebサーバを構築した実験記録
  • Ethernet ではなく、SLIPプロトコルを利用してインターネット接続を実現
  • TCP/IPスタック やHTTPレスポンスも自作で実装
  • 公開アクセス にはプロキシやWireGuardなどの工夫を活用
  • IPv6普及の遅れ や、現代Linuxの柔軟性にも言及

AVRマイコンでWebサーバを作る愚行

  • AVR64DD32 をターゲットに選定、Arduinoで有名な Atmega328 と似た構成
  • CPU: 8ビット/24MHz、RAM: 8kB、Flash: 64kB、EEPROM: 256バイト、電圧: 1.8-5.5V、価格: $1
  • Ethernet は10BASE-Tでも10Mbps必要、AVRのI/Oでは対応困難
    • Manchester符号化 で実質20Mbps、I/Oピンは12MHzまで
  • 専用Ethernetチップ 導入は納期が長く断念

SLIP(Serial Line Internet Protocol)の活用

  • SLIP(RFC 1055) はシリアル通信でネットワークを実現する古い規格
    • パケットの前後に 0xC0 を挿入、特殊バイトはエスケープ処理
    • Linux では標準でサポート
      • USBシリアルアダプタで sttyslattach コマンドを使用
  • AVR側のハードウェア はシンプル、外部部品不要
    • ブリンケンライト や逆接防止ダイオードを追加
    • シリアルアダプタの 5V電源 で駆動可能、ケーブル一本で完結

TCP/IPスタックとHTTPレスポンスの自作

  • IPヘッダ :40バイト、送信時は送受信アドレスの入れ替えとTTLリセットのみ
    • パケット分割 等の複雑な機能は現代OSが無効化済み
  • TCP実装 は難易度が高い
    • コネクション管理、再送制御、各種例外処理に数日を要した
    • バグ も残存
  • HTTPは未実装、常に固定レスポンスのみ返却
    • 単一URL のみ対応

公開アクセスとネットワーク経路の工夫

  • グローバルIPv4アドレス が高価・入手困難、自宅回線も非対応
  • HelsinkiのVPS にグローバルIPがあるが、物理的に距離が遠い
  • WireGuard で仮想ネットワークを構築
    • NAT越えや複雑なネットワーク構成にも対応
  • プロキシ設定 でVPSの/mcu配下リクエストをMCUへ転送
    • MCUのTCP/IPスタックを直接晒さず、安定運用
    • DDoS耐性は低いが、Vape Serverと同様の構成

IPv6の普及と現代Linuxの柔軟性

  • IPv6 が30年経っても普及していない現状への嘆き
  • Linux のSLIPやWireGuardサポートによる自由度の高さを評価

関連リンク

  • /mcu: マイコンがホストするページ
  • http://ewaste.fka.wtf/: 32ビットMCU製Vape Server
  • https://lcamtuf.substack.com/p/psa-if-youre-a-fan-of-atmega-try: lcamtufによるAVR Dx解説

Hackerたちの意見

昔のダイヤルアップの頃みたいに、HTMLがリアルタイムでページにストリーミングされるのが好き。画像が上から下に徐々に表示されていく感じ、懐かしいなぁ。

ちょっと時間かかったけど、やっとロードできた。十分見たから、これを本番に進めるよ。

AVR DD、EA、EBシリーズが大好きなんだけど、Microchipの最新チップリリースはAVRファンにとってちょっと心配。 https://www.microchip.com/en-us/products/microcontrollers/32... PIC32 CMは、イベントシステムやMVIO、5V動作などAVR DDのほとんどの機能を持ってるし、標準のARM 32ビットM0+コアも搭載してる。これでAVR DDが少し時代遅れになっちゃうんじゃないかと心配してる。AVR EAとAVR EB、そしてその12ビットADC(x16プログラム可能なゲイン、50マイクロボルトぐらいに敏感だけど、ノイズも結構ある)には安心感があるけど、あれは本当に優れたADC/電流センサーだからね。もしかしたら、これでAVRやその仲間たちがもっと人気になるかも?ピン互換(??!?)のARM32 Cortex M0+を知って、AVRプラットフォームの上に何か作る気が増える、それとも減る?個人的には、周辺機器が一番大事だと思う。AVR DDは低消費電力(特に1.8V動作)を提供してるけど、それだけで足りるのかな?--------- それ以外は、とても興味深いプロジェクトだね。AVR DDはどんな場合でも優れたチップだし、実際に使ってる人を見るのは嬉しいな。 > 明らかな選択肢はイーサネットだけど、一番遅いバージョン(10BASE-T)でも10メガビット/秒で動くからね。さらに悪いことに、マンチェスター符号化を使ってる。ゼロは「10」として送られ、1は「01」として送られるから、10メガビットのデータは実際には20メガビットになる。AVR EBにはx2 PLLタイマーがあって、長い時間いじってればマンチェスター符号化を出力できるかも?うーん、LUTやUART周辺機器、PLLブーストタイマー回路を使えば、高速マンチェスター符号化を出力するのは可能かもしれない。でも20Mbitは無理かもな。考えてみる必要があるね。

Microchipは、他のメーカーよりも長くチップをサポートすることで知られてる。需要がある限り、基本的に作り続けるんだよね。そしてDxシリーズはかなり最近のもの。Cortex-M0の道を模索してるってことは、Dxシリーズの後に別の世代の8ビットプラットフォームを開発したくないってことだろうね。同じ機能を別のCPUコアに持っていくなら、それはそれでいいと思う。

2つの考えが面白かった。まず1つ目:RFC 1055には2025年(!)の訂正があるけど、www.cには載ってない。訂正(q.v.)は、デコーディングアルゴリズムがどう変わるかをうまく説明してるし、実際にはこの場合リンクの向こう側はLinuxなんだよね。2つ目:次はRFC 1144かな。

かっこいい!

タイトルを見たときの最初の考えは「多くの組み込み/IoTデバイスがそれをやってる」だった。これが10/100イーサネットを内蔵した8051だよ: https://www.asix.com.tw/public/index.php/en/product/Microcon...

25年以上前に、最小のウェブサーバーを作るコンテストがあったんだよね: https://web.archive.org/web/20000815063022/http://www-ccs.cs... ACE1101マイクロコントローラーを使った誰かが「勝った」んだ。元の記事は見つからないけど、これもあるよ: https://conceptlab.com/fly/ フライ上のウェブサーバー...

あはは、こないだその小さなウェブサーバーのこと考えてたんだよね。ここにも投稿したけど、全然反応なかった。あの頃も今も、すごく印象的だと思ってるよ!

ACE1101バージョンをやって、サスカトゥーンのアーティストにプリプログラムされたチップを郵送したんだ。Archive.orgに元の説明があるよ: https://web.archive.org/web/20020605032321/http://d116.com/a... コードをダウンロードするのがすごく楽しかった。pingを排除したおかげで、bit-banged I2CとUDPでeepromにアップロードするスペースができたし、まだ1024バイト未満だったよ。