- Đã lưu trữ một website chỉ bằng MCU 8-bit AVR64DD32, chạy trong môi trường nhỏ gọn với CPU 24MHz, RAM 8KB và Flash 64KB
- Để tự tạo tín hiệu Ethernet thì ngay cả 10BASE-T cũng vẫn quá nhanh, nên đã dùng SLIP được Linux hỗ trợ để biến liên kết USB-Serial thành một giao diện mạng
- SLIP là một cách đơn giản bọc gói tin bằng
0xC0 và escape các byte đặc biệt, nên phù hợp để kết nối MCU với Linux hiện đại
- IP được đơn giản hóa nhờ việc vô hiệu hóa phân mảnh, nhưng việc triển khai TCP cần trạng thái kết nối, truyền lại và xử lý ngoại lệ nên mất vài ngày, và vẫn còn lỗi
- Truy cập từ bên ngoài dùng một cấu trúc vòng qua với VPS, WireGuard và proxy chỉ chuyển các yêu cầu
/mcu, cho thấy chi phí IPv4 công khai và sự thiếu vắng IPv6 là các ràng buộc chính
Cấu hình lưu trữ website bằng AVR 8-bit
- AVR64DD32 là MCU 8-bit thuộc họ AVR tương tự Atmega328 nổi tiếng qua Arduino, nhưng rẻ hơn ở cùng mức bộ nhớ, đồng thời cung cấp một chân lập trình duy nhất và ngoại vi tốt hơn
- Lõi AVR 8-bit đơn tối đa 24MHz
- 8KB RAM tĩnh, 64KB Flash, 256 byte EEPROM
- Dải điện áp 1.8~5.5V, mức giá khoảng $1~$2
- Để kết nối trực tiếp Internet chỉ bằng MCU thì cần tạo tín hiệu Ethernet, nhưng ngay cả 10BASE-T chậm nhất cũng quá nhanh với môi trường này
- 10BASE-T hoạt động ở 10Mbit/s, và do mã hóa Manchester nên trên đường truyền thực tế thành 20Mbit
- CPU của AVR64DD32 có thể chạy tới 24MHz, nhưng ngoại vi và chân IO chỉ hỗ trợ xung tối đa 12MHz nên rất khó tự tạo tín hiệu trực tiếp
- Cách chuẩn là dùng chip Ethernet chuyên dụng, nhưng phải chờ vài tuần mới hoàn thành dự án
- Thay vào đó, dùng SLIP (Serial Line Internet Protocol, RFC 1055) để đưa mạng chạy trên liên kết nối tiếp
- Gói tin được bọc trước và sau bằng byte
0xC0
0xC0 bên trong gói tin được đổi thành 0xDB 0xDC, còn 0xDB có sẵn thì đổi thành 0xDB 0xDD để tránh mơ hồ
- Cách này nối tiếp với mô hình ngày trước khi modem quay số tạo liên kết nối tiếp trên đường dây điện thoại và máy tính xử lý mạng trên đó
- Linux hiện đại vẫn hỗ trợ SLIP, nên có thể biến bộ chuyển đổi USB-Serial thành giao diện mạng
- Ví dụ sử dụng là
stty -F /dev/ttyUSB0 115200 raw cs8, slattach -m -F -L -p slip /dev/ttyUSB0
- Phần cứng phía MCU khá đơn giản và có thể hoạt động ngay cả khi không có linh kiện ngoài
- www.c: mã nguồn
- www.elf: nhị phân dựng sẵn
- Đã thêm LED và diode chống cắm ngược nguồn
- Mức tiêu thụ điện chỉ vài mW, nên có thể chạy máy chủ chỉ bằng đường 5V của bộ chuyển đổi USB-Serial
Triển khai giao thức và xử lý truy cập công khai
- Việc triển khai IP trở nên đơn giản hơn nhờ các ràng buộc của môi trường hiện đại
- Để trang web đến được máy người dùng, gói tin phải đi qua nhiều mạng và mỗi gói cần một tiêu đề IP dài 40 byte chứa địa chỉ nguồn, đích cùng các thông tin khác
- IP trước đây cần nhiều bộ nhớ để xử lý đúng do có các tính năng như phân mảnh gói tin
- Hệ điều hành hiện đại vô hiệu hóa phân mảnh, còn IPv6 đã loại bỏ phân mảnh, nên không cần tự xử lý phần đó
- Có thể tạo tiêu đề phản hồi bằng cách đảo địa chỉ nguồn và đích của gói nhận được rồi đặt lại bộ đếm TTL
- Việc triển khai TCP khó hơn nhiều vì cần theo dõi trạng thái kết nối, truyền lại gói bị mất và xử lý nhiều tình huống ngoại lệ
- Phải mất vài ngày để phần triển khai TCP tùy chỉnh hoạt động đủ ổn, và hiện vẫn còn một số lỗi
- Không triển khai HTTP riêng; máy chủ luôn gửi một “phản hồi” được hard-code cho client
- Nếu website chỉ có một URL thì cách này hoạt động đủ tốt
- Có thể xem quá trình tải trong Video 3
- Truy cập từ bên ngoài cần địa chỉ IPv4 công khai có thể định tuyến, nhưng chi phí và chất lượng kết nối Internet tại nhà là trở ngại
- Máy có địa chỉ định tuyến công khai nằm trên một VPS trong trung tâm dữ liệu gần Helsinki
- Dùng WireGuard trên Linux để tạo liên kết mạng ảo qua Internet, vẫn hoạt động ngay cả khi một phía nằm sau CGNAT
- Kết quả là một hộp router Linux kết nối tới VPS để có được đường Internet phù hợp hơn
- MCU vẫn không có IP công khai riêng, nên nếu chuyển mọi yêu cầu tới địa chỉ VPS thì website hiện có sẽ bị hỏng
- Thay vào đó, máy chủ được cấu hình proxy chỉ chuyển các yêu cầu dưới
/mcu tới máy chủ MCU bằng một dải địa chỉ cục bộ
- Dù người truy cập không kết nối trực tiếp tới ngăn xếp TCP/IP của MCU, cách này tương tự Vape Server
- Việc phá bằng gói SYN trở nên khó hơn đôi chút, nhưng đây thực tế vẫn là một máy chủ trên kết nối gần giống dial-up nên dễ tổn thương trước DDoS
- Sự thiếu vắng IPv6 vẫn là nguyên nhân gốc rễ của toàn bộ cấu trúc vòng qua này
1 bình luận
Ý kiến trên Hacker News
Hơn 25 năm trước từng có một cuộc đua khoe mẽ xem ai làm được web server nhỏ nhất: https://web.archive.org/web/20000815063022/http://www-ccs.cs...
Người dùng vi điều khiển ACE1101 đã “thắng”, nhưng tôi không tìm lại được bài gốc, chỉ có cái này: https://conceptlab.com/fly/
Đó là một web server đặt trên con ruồi
Quá trình nhét gọn code thực sự rất vui, và khi bỏ ping đi thì có chỗ để thêm bit-banging I2C và tải UDP lên EEPROM mà vẫn còn dưới 1024 byte
Tôi thích các dòng AVR DD, EA, EB, nhưng các đợt ra chip gần đây của Microchip có vẻ hơi đáng lo cho fan AVR: https://www.microchip.com/en-us/products/microcontrollers/32...
PIC32 CM có hầu hết các tính năng của AVR DD như event system, MVIO, chạy 5V, nhưng lại cung cấp nhân ARM 32-bit M0+ lớn hơn và chuẩn hơn
Vì vậy tôi lo rằng AVR DD có vẻ đã hơi lỗi thời. AVR EA và AVR EB có ADC 12-bit với hệ số khuếch đại lập trình được x16, và dù hơi nhiễu nhưng vẫn nhạy tới khoảng 50 microvolt, nên có vẻ an toàn như những ADC/cảm biến dòng điện tốt một cách vô lý
Mặt khác, điều này cũng có thể khiến dòng AVR phổ biến hơn. Tôi tự hỏi việc có ARM32 Cortex M0+ tương thích chân sẽ làm tăng hay giảm khả năng xây dựng trên nền tảng AVR
Cá nhân tôi thấy ngoại vi mới là thứ quan trọng nhất. AVR DD có thể tiêu thụ điện thấp hơn, nhất là ở mức 1.8V, nhưng tôi không chắc như thế đã đủ chưa
Bản thân dự án này rất thú vị, và AVR DD dù sao cũng là một con chip tuyệt vời, nên thật vui khi thấy nó được dùng ngoài thực tế
10BASE-T chạy ở 10 megabit/giây, và vì mã hóa Manchester nên trên đường truyền thành 20 megabit; AVR EB có timer PLL x2 nên nếu kiên trì mày mò thì có lẽ sẽ xuất được mã hóa Manchester
Nếu kết hợp LUT, ngoại vi UART và mạch timer được tăng xung bằng PLL thì có vẻ có thể đẩy ra mã hóa Manchester tốc độ cao, nhưng liệu có lên được 20Mbit hay không thì tôi vẫn phải nghĩ thêm
Việc họ nghịch sang hướng Cortex-M0 có thể là dấu hiệu rằng họ không muốn tiếp tục phát triển thêm nhiều thế hệ nền tảng 8-bit sau Dx nữa. Nếu mang cùng các tính năng đó sang một CPU core khác thì tôi thấy cũng ổn
Tôi thích việc có thể thấy HTML được stream theo thời gian thực lên trang. Nó gợi lại cảm giác thời quay số, khi ảnh từ từ hiện ra từ trên xuống dưới
Ở đó, từ FTP rồi sau này là Napster, mỗi lần kết nối còn tải được nhiều bài hát cùng lúc
Khi đọc tiêu đề, ý nghĩ đầu tiên của tôi là “thiết bị nhúng/IoT làm kiểu này nhiều mà”
Đây là ví dụ về 8051 tích hợp 10/100 Ethernet: https://www.asix.com.tw/public/index.php/en/product/Microcon...
Có hai điều thú vị. Thứ nhất, có errata năm 2025 của RFC 1055 mà không có trong www.c ở đây. Errata đó giải thích khá thuyết phục việc thuật toán giải mã thay đổi ra sao, và trong trường hợp này đầu bên kia của liên kết thực sự là Linux
Thứ hai, đích đến tiếp theo có lẽ sẽ là RFC 1144
Tổ hợp ENC28J60 + PIC18 đúng là cấu hình mà các bản demo Microchip hay phát hành cách đây 20 năm dùng để làm chính việc này
Tôi thích việc proxy không ghi đè header server: của trang
Trước đây tôi từng làm một thứ tương tự bằng Arduino Mega. Điều gây ngạc nhiên là nó có thể trông khá ra gì nhờ client làm phần lớn công việc, còn controller thì chỉ việc chuyển nội dung từ thẻ uSD