Meng-host situs web dengan rokok elektrik sekali pakai
(bogdanthegeek.github.io)- Proyek eksperimental yang menjalankan web server dengan memanfaatkan mikrokontroler ARM Cortex-M0+ berdaya rendah yang tertanam di rokok elektrik sekali pakai
- Menganalisis chip PY32F002B dari PUYA yang memiliki 24KiB flash dan 3KiB RAM, lalu mengimplementasikan koneksi jaringan dengan metode SLIP
- Dengan memanfaatkan Semihosting, protokol SLIP, dan stack TCP/IP uIP, proyek ini mem-porting komunikasi TCP/IP serta fungsi server HTTP melalui tty virtual
- Awalnya sangat lambat, tetapi melalui optimasi buffer dan perbaikan pemrosesan data, kecepatan respons dan pemuatan halaman meningkat drastis
- Bahkan dalam lingkungan dengan memori kecil, berhasil menjalankan kode server dinamis dan menyediakan endpoint API
- Kode sudah dirilis, dan hosting sungguhan memang dimungkinkan, tetapi sangat dibatasi oleh sumber daya seperti memori
Pendahuluan
- Penulis terlebih dahulu menjelaskan bahwa tulisan ini tidak disajikan langsung dari web server yang berjalan di rokok elektrik sekali pakai tersebut, melainkan dari server terpisah yang menyajikan konten yang sama
- Contoh cara kerjanya yang sebenarnya dapat dilihat di http://ewaste.fka.wtf/
Latar belakang
- Selama beberapa tahun, penulis mengumpulkan rokok elektrik sekali pakai dari kenalan dengan tujuan mendaur ulang baterainya
- Belakangan ini, penulis tertarik pada perangkat rokok elektrik sekali pakai yang makin canggih dan mulai dilengkapi USB-C serta baterai isi ulang
- Saat membongkar perangkat, penulis menemukan mikrokontroler ARM Cortex-M0+ dengan flash internal bernama PUYA, chip yang dikenal luas sebagai mikrokontroler murah
- Penulis mengumpulkan mikrokontroler tersebut dari beberapa model, dan karena pin debug-nya diberi label, analisis menjadi lebih mudah
Perangkat keras yang digunakan
- Penandaan chip adalah
PUYA C642F15, tetapi diduga sebenarnya termasuk keluarga PY32F002B - Spesifikasi utama:
- Core Cortex-M0+ 24MHz
- 24KiB flash
- 3KiB RAM
- Ada berbagai periferal, tetapi tidak digunakan dalam proyek ini
- Dibandingkan smartphone biasa, performanya memang rendah, tetapi di lingkungan embedded, membangun web server sederhana tetap sangat mungkin dilakukan
Koneksi jaringan
- Ini bukan ide yang sepenuhnya baru, tetapi saat bereksperimen dengan konsep semihosting, penulis mendapat gagasan untuk menjalankan web server
- Semihosting adalah cara meniru syscall pada ARM embedded
- Ketika nilai/pointer dimasukkan ke register lalu breakpoint dipanggil, debugger menafsirkannya dan memproses tindakan yang diminta
- Biasanya digunakan untuk mengirim log, tetapi komunikasi data dua arah juga dimungkinkan
- Perangkat USB serial mendukung protokol SLIP (Serial Line Internet Protocol), dan ini dimanfaatkan sebagai antarmuka jaringan
- Di Linux (dan sebagian macOS), lingkungan jaringan SLIP melalui tty virtual dibangun dengan
slattach,socat, dan sebagainyapyocd 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 - Sebagai stack TCP/IP, penulis memilih uIP karena sangat kecil, tidak memerlukan RTOS, dan mudah di-porting
- Dengan memanfaatkan contoh server HTTP dari uIP, lalu mem-porting kode SLIP agar sesuai dengan metode semihosting, penulis berhasil menjalankan web server
- Karena ada masalah alignment 16-bit pada arsitektur ARM, penulis memodifikasi skrip pembuatan filesystem dan melakukan proses konversi dengan Perl
Optimasi kecepatan
- Pada kondisi awal, respons sangat lambat: ping 1,5 detik, packet loss 50%, dan pemuatan halaman lebih dari 20 detik
- Penyebabnya adalah overhead besar dari I/O per byte
- Dengan memanfaatkan RAM 3KiB secara agresif, penulis menambahkan ring buffer dan memperbaiki fungsi SLIP agar dapat memasok data secara batch
- Penulisan data juga dibagi dalam batch untuk proses pengiriman, sehingga pembersihan dapat dilakukan lebih cepat
- Hasil optimasi mencapai ping 20ms, tanpa packet loss, pemuatan halaman 160ms
- Total penggunaan RAM dan flash:
- Flash: 5.116B dari 24KB (20,82%)
- RAM: 1.380B dari 3KB (44,92%)
- Kapasitas ini juga cukup untuk menyajikan seluruh konten blog tanpa kendala, dan bahkan memungkinkan menjalankan kode C sisi server
Fitur lain dan penutup
- Penulis mengimplementasikan langsung endpoint API yang mengembalikan jumlah permintaan ke halaman utama dan unique ID mikrokontroler
- Ini adalah eksperimen yang berhasil mewujudkan web server dinamis dan API hanya dengan perangkat keras berkemampuan sangat rendah dan memori minimum
Belum ada komentar.