- Situs web ini di-host hanya dengan MCU 8-bit AVR64DD32, dan berjalan dalam lingkungan kecil dengan CPU 24MHz, RAM 8KB, dan Flash 64KB
- Karena membuat sinyal Ethernet secara langsung terlalu berat—bahkan 10BASE-T pun terlalu cepat—tautan USB-Serial digunakan seperti antarmuka jaringan melalui SLIP yang didukung Linux
- SLIP adalah metode sederhana yang membungkus paket dengan
0xC0 dan melakukan escape pada byte khusus, sehingga cocok untuk menghubungkan MCU dengan Linux modern
- IP menjadi lebih sederhana berkat fragmentasi yang dinonaktifkan, tetapi implementasi TCP memerlukan status koneksi, retransmisi, dan penanganan kasus pengecualian, sehingga memakan waktu beberapa hari dan masih menyisakan bug
- Untuk akses dari luar digunakan struktur workaround dengan VPS, WireGuard, dan proxy yang hanya meneruskan permintaan
/mcu, sementara biaya IPv4 publik dan ketiadaan IPv6 muncul sebagai kendala utama
Konfigurasi untuk meng-host situs web dengan AVR 8-bit
- AVR64DD32 adalah MCU keluarga AVR 8-bit yang mirip dengan Atmega328 yang dikenal lewat Arduino; dengan kapasitas memori yang sama, chip ini lebih murah serta menawarkan satu pin pemrograman dan periferal yang lebih baik
- Satu inti AVR 8-bit hingga 24MHz
- RAM statis 8KB, Flash 64KB, EEPROM 256 byte
- Rentang tegangan 1.8~5.5V, kisaran harga $1~$2
- Untuk terhubung langsung ke internet hanya dengan MCU, perlu membuat sinyal Ethernet, tetapi bahkan 10BASE-T yang paling lambat pun terlalu cepat untuk lingkungan ini
- 10BASE-T berjalan pada 10Mbit/s, dan karena encoding Manchester, pada jalur fisik menjadi 20Mbit
- CPU AVR64DD32 bisa berjalan hingga 24MHz, tetapi periferal dan pin IO hanya mendukung clock maksimum 12MHz, sehingga sulit membuat sinyal secara langsung
- Menggunakan chip Ethernet khusus adalah cara yang lazim, tetapi harus menunggu beberapa minggu untuk menyelesaikan proyek
- Sebagai alternatif, digunakan SLIP (Serial Line Internet Protocol, RFC 1055) untuk menjalankan jaringan di atas tautan serial
- Awal dan akhir paket dibungkus dengan byte
0xC0
0xC0 di dalam paket diubah menjadi 0xDB 0xDC, dan 0xDB yang sudah ada diubah menjadi 0xDB 0xDD untuk menghindari ambiguitas
- Ini berlanjut dari cara modem dial-up lama membuat tautan serial di atas saluran telepon dan komputer menangani jaringan di atasnya
- Linux modern juga mendukung SLIP, sehingga adaptor USB-Serial bisa dijadikan antarmuka jaringan
- Contoh penggunaan berbentuk
stty -F /dev/ttyUSB0 115200 raw cs8, slattach -m -F -L -p slip /dev/ttyUSB0
- Perangkat keras di sisi MCU sederhana dan dapat berjalan tanpa komponen eksternal
- www.c: kode sumber
- www.elf: biner yang sudah dibangun
- Ditambahkan LED dan dioda untuk melindungi dari pemasangan daya terbalik
- Konsumsi dayanya hanya beberapa mW, sehingga server bisa dijalankan hanya dari rel 5V adaptor USB-Serial
Implementasi protokol dan penanganan akses publik
- Implementasi IP menjadi lebih sederhana berkat batasan lingkungan modern
- Agar halaman web sampai ke komputer pengguna, paket harus melewati beberapa jaringan, dan setiap paket memerlukan header IP 40 byte yang berisi alamat sumber dan tujuan
- IP lama memerlukan banyak memori agar bisa menangani fitur seperti fragmentasi paket dengan benar
- Sistem operasi modern menonaktifkan fragmentasi, dan IPv6 menghapus fragmentasi, sehingga tidak perlu ditangani secara langsung
- Header respons dapat dibuat dengan menukar sumber dan tujuan dari paket yang diterima lalu mengatur ulang penghitung TTL
- Implementasi TCP jauh lebih sulit karena memerlukan pelacakan status koneksi, retransmisi paket yang hilang, dan penanganan berbagai kondisi pengecualian
- Perlu beberapa hari sampai implementasi TCP kustom cukup berfungsi, dan masih ada beberapa bug yang tersisa
- HTTP tidak diimplementasikan secara terpisah; server selalu mengirim “respons” yang sudah di-hardcode ke klien
- Jika situs hanya memiliki satu URL, pendekatan ini sudah cukup
- Proses pemuatannya bisa dilihat di Video 3
- Untuk akses dari luar diperlukan alamat IPv4 publik yang dapat dirutekan, tetapi biaya dan kualitas koneksi internet rumah menjadi hambatan
- Mesin yang memiliki alamat publik yang dapat dirutekan berada di VPS di pusat data dekat Helsinki
- WireGuard di Linux digunakan untuk membuat tautan jaringan virtual di atas internet, sehingga tetap bekerja meski salah satu sisi berada di belakang CGNAT
- Hasilnya, kotak router Linux terhubung ke VPS untuk mendapatkan koneksi internet yang lebih sesuai
- MCU tetap tidak memiliki IP publik sendiri, sehingga jika semua permintaan ke alamat VPS diteruskan, situs web yang ada akan rusak
- Sebagai gantinya, server dikonfigurasi untuk mem-proxy hanya permintaan di bawah
/mcu ke server MCU menggunakan blok alamat lokal
- Pengunjung memang tidak terhubung langsung ke stack TCP/IP milik MCU, tetapi caranya serupa dengan Vape Server
- Ini membuat perusakan dengan paket SYN sedikit lebih sulit, tetapi pada dasarnya server ini berjalan di atas koneksi yang nyaris seperti dial-up, sehingga rentan terhadap DDoS
- Ketiadaan IPv6 tetap menjadi penyebab mendasar dari seluruh susunan workaround ini
1 komentar
Komentar Hacker News
Lebih dari 25 tahun lalu pernah ada ajang pamer untuk membuat web server terkecil: https://web.archive.org/web/20000815063022/http://www-ccs.cs...
Orang yang memakai mikrokontroler ACE1101 "menang", tetapi saya tidak bisa menemukan artikel aslinya, dan ada juga ini: https://conceptlab.com/fly/
Itu adalah web server di atas seekor lalat
Proses memeras ukuran kode itu sangat menyenangkan, dan setelah menghapus ping, jadi ada ruang untuk menambahkan bit-banged I2C serta upload UDP ke EEPROM, dan itu pun tetap di bawah 1024 byte
Saya suka seri AVR DD, EA, dan EB, tetapi rilis chip terbaru Microchip terlihat agak mengkhawatirkan bagi penggemar AVR: https://www.microchip.com/en-us/products/microcontrollers/32...
PIC32 CM punya sebagian besar fitur AVR DD seperti event system, MVIO, operasi 5V, dan lain-lain, tetapi juga menawarkan core ARM 32-bit M0+ yang lebih besar dan lebih standar
Karena itu, saya khawatir AVR DD jadi terlihat agak usang. AVR EA dan AVR EB tampak aman karena punya ADC 12-bit dengan gain terprogram 16x, dan meski agak berisik, sensitif hingga sekitar 50 mikrovolt, jadi ADC/sensor arusnya terasa kelewat bagus
Sebaliknya, ini juga bisa membuat keluarga AVR jadi lebih populer. Saya penasaran apakah fakta bahwa ada ARM32 Cortex M0+ yang pin-compatible membuat orang lebih atau kurang mungkin membangun di atas platform AVR
Secara pribadi saya menganggap periferal sebagai hal yang paling penting. AVR DD mungkin punya konsumsi daya lebih rendah, terutama operasi 1,8V, tetapi saya tidak tahu apakah itu cukup
Proyeknya sendiri sangat menarik, dan AVR DD tetap chip yang hebat, jadi senang melihatnya benar-benar dipakai
10BASE-T berjalan pada 10 megabit/detik, dan karena Manchester encoding maka di jalur menjadi 20 megabit, sementara AVR EB punya timer x2 PLL, jadi kalau cukup lama diutak-atik mungkin bisa mengeluarkan Manchester encoding
Dengan menggabungkan LUT, periferal UART, dan rangkaian timer yang dinaikkan dengan PLL, tampaknya mungkin untuk mendorong Manchester encoding berkecepatan tinggi, tetapi apakah bisa sampai 20Mbit masih perlu dipikirkan lagi
Mengutak-atik jalur Cortex-M0 mungkin menandakan mereka tidak terlalu ingin terus mengembangkan generasi platform 8-bit setelah Dx. Jika mereka membawa fungsi yang sama ke core CPU lain, menurut saya itu tidak masalah
Saya suka karena bisa terlihat bahwa HTML di halaman itu di-stream secara real-time saat dimuat. Rasanya seperti masa dial-up dulu ketika gambar digambar perlahan dari atas ke bawah
Di sana, dari FTP, dan kemudian dari Napster, dalam satu sesi koneksi kami bahkan bisa mengunduh beberapa lagu
Saat membaca judulnya, pikiran pertama saya adalah "banyak perangkat embedded/IoT yang melakukan hal seperti itu"
Ada contoh 8051 dengan Ethernet 10/100 bawaan: https://www.asix.com.tw/public/index.php/en/product/Microcon...
Ada dua hal yang menarik. Pertama, ada errata RFC 1055 tahun 2025 yang tidak ada di www.c di sini. Errata itu cukup meyakinkan dalam menunjukkan bagaimana algoritme decoding seharusnya diubah, dan dalam kasus ini ujung lain dari link tersebut memang Linux
Kedua, tujuan berikutnya mungkin adalah RFC 1144
Kombinasi ENC28J60 + PIC18 adalah konfigurasi yang persis melakukan hal seperti ini dalam demo yang biasa dibagikan Microchip sekitar 20 tahun lalu
Saya suka bahwa proxy-nya tidak menimpa header server: pada halaman
Dulu saya pernah membuat hal serupa dengan Arduino Mega. Yang mengejutkan adalah hasilnya bisa terlihat cukup meyakinkan karena klien melakukan banyak pekerjaan, sementara kontrolernya hanya mengirimkan konten dari kartu uSD