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

2026-05-17 1 阅读 zdw
在 8 位微控制器上托管网站。 2026-05-11 — 2026-05-14 ( 电子 ) ( 编程 ) 在今天的“用 AVR 微控制器做的蠢事”中:你们的服务器是实木的吗? MCU 网站演示(如果发布到 HN 可能会下架) 我的受害者是 AVR64DD32,它与 Arduino 著名的 Atmega328 非常相似。与旧的 Atmega 相比,这些 AVR DD 系列在相同内存下更便宜,使用单个编程引脚并具有更好的外设: CPU:单个 8 位 AVR 内核 @ 24 MHz(最大) RAM:8 kB(静态 RAM) 闪存: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 : 源代码。 www.elf:预构建的二进制文件它不需要外部组件即可工作,但我想要一些闪烁灯,以及一个防白二极管,以便在我不可避免地向后连接电源时使用。因为它只消耗几毫瓦,所以它可以运行串行适配器的 5 伏电源轨的服务器:只需一根电缆即可处理,这真是太好了。现在它有了互联网连接,但这几乎不是服务器。为了让我的网页到达您的计算机,它需要经过数十个不同的网络。为此,每个数据包都有一个 IP 标头:40 个字节,其中包含源计算机和目标计算机的地址,以及一些我并不真正关心的其他内容。该协议过去要复杂得多,具有数据包碎片等功能,需要大量内存才能正确处理,但我不必这样做:每个现代操作系统都禁用碎片,而 IPv6 完全删除了它。这使得实现变得非常容易:只需交换接收到的数据包的源和目标即可生成响应的标头。 (并重置 TTL 计数器)另一种协议 TCP 则要困难得多:实现它需要微控制器跟踪连接状态、定期重新传输丢失的数据包并处理大量边缘情况。我花了几天时间才让我的自定义实现运行良好,但仍然存在一些错误。至于实现 HTTP,我没有:服务器总是将硬编码的“响应”发送回客户端。只要网站上只有一个 URL,这种方法就可以正常工作。 [页面加载视频。请参阅网页或文件目录:loading.mp4] 很好,但是如果我想与朋友分享怎么办?不幸的是,为了让他们的请求到达它,它需要一个公共可路由的 IPv4 地址。这些不仅价格昂贵,而且在我的地方不可能获得良好的互联网连接。 (不,星链不好)我确实有一台具有公共可路由地址的机器,但它位于赫尔辛基附近的一个数据中心:我需要一根很长的串行电缆......Linux支持的另一个很酷的东西是wireguard,它通过互联网创建虚拟网络链接。即使其中一台机器位于 (CG)NAT 后面或存在其他问题,此方法也能正常工作。问题已解决:Linux 路由器盒是否已连接到 VPS 以获得正确的互联网连接? ...除了 MCU 仍然没有自己的 IP 地址:我可以将 VPS 地址中的所有内容转发到它,但这会破坏我的正常网站。相反,我将服务器设置为使用本地地址块将 /mcu 下的任何请求代理到服务器。这意味着访问者不会直接连接到 MCU 的 TCP/IP 堆栈……但是,嘿,这与 Vape 服务器使用的设置相同,而且没有人抱怨。 (这也使它变得苗条