在8位微控制器上托管网站

Hacker News Top 新闻

摘要

一个爱好者项目演示了在8位AVR微控制器上托管简单网站,通过串口连接使用SLIP协议与Linux PC通信,避免了以太网硬件需求。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/05/17 03:44

# 在8位微控制器上托管网站 (Maurycy's blog) 来源:https://maurycyz.com/projects/mcusite/ **2026\-05\-11**—**2026\-05\-14**\(电子 (https://maurycyz.com/tags/electronics/)\) \(编程 (https://maurycyz.com/tags/programming/)\) 今天"用AVR微控制器做蠢事"系列节目: 一块小型洞洞板,拧在倒角的木块上。板上有一颗SMD IC(装在转接板上)、几个排针和两个LED。 你的服务器配有实木外壳吗? MCU网站演示 (https://maurycyz.com/mcu/)\(如果被发到HN可能会宕机\) 我的受害者是AVR64DD32,与著名的Arduino所用的Atmega328非常相似。相比老款Atmega,这些AVR DD系列在相同内存下更便宜,使用单编程引脚,并拥有更漂亮的外设: CPU:单核8位AVR内核 @ 24 MHz(最大) RAM:8 kB(静态RAM) Flash:64 kB EEPROM:256字节 电压:1.8 - 5.5 伏 成本:1美元 所以这是一台计算机(还算宽裕),但要托管网站,还需要互联网连接。 *显而易见的选择是以太网*,但即使是最慢的版本(10BASE-T)也运行在10兆比特/秒。更糟的是,它使用曼彻斯特编码:0发送为"10",1发送为"01",所以10兆比特的数据实际上在线上是20兆比特。 这对AVR来说太快了,无法生成。虽然其处理器可运行在24 MHz,但所有外设和IO引脚最高只有12 MHz时钟(尽管某些其他8位芯片应该能做)。 正确的解决方案是从DigiKey购买专用以太网芯片,但那样我就得等上几周才能完成这个项目。 ……而且以太网远非唯一选项: *串行线路网际协议*\(RFC 1055\)是一种非常古老且简单的用于在串行线路上运行网络的标准: 发送数据包前,用0xC0字节包裹。如果数据包包含任何0xC0字节,将其替换为0xDB 0xDC。为避免歧义,任何已存在的0xDB字节替换为0xDB 0xDD。 这种方案在古代被广泛用于连接互联网:拨号调制解调器通过电话线建立串行链路,剩下的由计算机处理。(这也意味着它们不限于网络:同样的调制解调器可以连接到终端进行远程访问) ……这就是为什么现代Linux仍然支持SLIP: ``` # 只是一个普通的 USB 转串口适配器 stty -F /dev/ttyUSB0 115200 raw cs8 slattach -m -F -L -p slip /dev/ttyUSB0 # ... 现在它成了一个网络接口 ``` 微控制器端的硬件很简单: www.c (https://maurycyz.com/projects/mcusite/www.c):源代码。 www.elf (https://maurycyz.com/projects/mcusite/www.elf):预编译二进制。 它确实可以在没有外部组件的情况下工作,但我想加一些闪烁的灯,以及一个防呆二极管,以防我最终反接电源。 因为它只消耗几毫瓦,所以可以从串口适配器的5伏轨上运行服务器:只需一根电缆真的很不错。 *现在它有了互联网连接*,但这算不上服务器。 为了让我的网页到达你的电脑,它需要经过数十个不同的网络。为此,每个数据包都有一个IP头:40字节,包含源和目标计算机的地址,以及其他我不太关心的东西。 这个协议曾经要复杂得多,像数据包分片等功能需要大量内存才能正确处理,但我没必要这么做:所有现代操作系统都禁用了分片,IPv6完全移除了它。 这使得实现变得非常容易:只需交换收到的数据包的源和目标地址,即可生成响应的头。(并重置TTL计数器) *另一个协议,TCP则难得多*:实现它需要微控制器跟踪连接状态,定期重传丢失的数据包,并处理大量边缘情况。 花了几天时间才让我的自定义实现足够好用,而且仍然有一些小bug。 至于实现HTTP,我没有做:服务器总是将硬编码的"响应"发送回客户端。只要网站上只有一个URL,这就没问题。 \[页面加载的视频。请查看网页或文件目录:loading.mp4\] *好了,*但我想与朋友分享呢?不幸的是,要让他们的请求到达它,需要有一个公网可路由的IPv4地址。这不仅昂贵,而且在我这个地方不可能获得好的互联网连接。 (不,Starlink并不好) 我确实有一台具有公网可路由地址的机器,但它位于赫尔辛基附近的数据中心:我需要一根很长的串行电缆…… Linux支持的另一个很酷的东西是WireGuard,它通过互联网创建一个虚拟网络链接。即使其中一台机器位于(CG)NAT或其他烦人情况之后,它也能工作。 问题解决了: 让Linux路由器盒连接到VPS以获得合适的互联网连接? ……只不过MCU仍然没有自己的IP地址:我可以将所有来自VPS地址的请求转发给它,但这会破坏我的普通网站。 相反,我设置服务器代理所有发送到`/mcu`的请求到使用本地地址块的服务器。这意味着访问者不会直接连接到MCU的TCP/IP栈……但嘿,这和Vape服务器使用的设置一样,没人抱怨过。 (这也稍微增加了通过发送SYN数据包来攻击的难度,但通过实际上相当于拨号连接的服务器进行DDoS攻击并不难) 如果我们能齐心协力,这个问题本就不存在:IPv6已经存在三十年,但大多数人仍然无法使用。 ## *相关*: - /mcu (https://maurycyz.com/mcu):微控制器托管的页面。 - http://ewaste.fka.wtf/:Vape服务器,一个托管在从垃圾中捡来的32位MCU上的网站。 - https://lcamtuf.substack.com/p/psa-if-youre-a-fan-of-atmega-try:lcamtuf 关于 AVR Dx 系列的文章。

相似文章

在树莓派 Zero 上完全运行于 RAM 中提供网站服务

Lobsters Hottest

本教程介绍如何在树莓派 Zero v1.3 上使用 Alpine Linux 搭建无磁盘网站,系统完全启动至其 512MB RAM 中。详细说明了所需硬件、操作系统配置、轻量级 Web 服务器以及将 TLS 终止卸载到外部 VPS 的方法。

在树莓派上托管网站

Hacker News Top

技术教程,介绍如何在树莓派上自托管网站,涵盖端口转发、DNS 配置、使用 Caddy 作为反向代理、PM2 进行 Node.js 进程管理,以及使用 GitHub Actions 实现 CI/CD 自动化。