文章摘要
文章探讨了如何在一次性电子烟上托管网站,作者通过收集并拆解这些设备,发现其内部集成了名为“PUYA”的芯片,激发了将其用于网络服务器的兴趣。尽管文章本身并非由电子烟服务器托管,但展示了这一技术的可能性。
文章总结
标题:在一次性电子烟上搭建网站
前言
本文并非通过运行在一次性电子烟上的网络服务器提供服务。如果你想查看真实案例,请点击这里。其他内容完全相同。
背景
几年来,我一直从朋友和家人那里收集一次性电子烟。最初,我只是为了“未来”项目回收电池(我保证这不是囤积)。然而,最近的一次性电子烟变得更加先进。我无法想象未来的律师如何为带有USB-C接口和可充电电池的设备被归类为“一次性”而辩护。幸运的是,我近期没有从事法律工作的计划。
去年,我在拆解这些更高级的“成人安抚奶嘴”时,发现了一个让我眼前一亮的东西:不是预期的黑色胶状物包裹的ASIC(专用集成电路),而是一个标有“PUYA”的小型集成电路。如果你对这个名字不感兴趣,我并不怪你,因为大多数人从未听说过它。PUYA以其闪存芯片闻名,而我第一次接触它是在阅读Jay Carlson关于最便宜的闪存微控制器的博客文章时。这些芯片实际上是相当强大的ARM Cortex-M0+微控制器。
过去一年,我收集了不少基于PY32的电子烟,它们都来自同一制造商的不同型号。我不会为烟草公司做免费广告,所以不会提及具体品牌,但如果设计这些电子烟的人读到这篇文章,感谢你们标注了调试引脚!
我们使用的硬件
芯片上标有PUYA C642F15,这并没有提供太多信息。我原本以为它是PY32F002A,但使用pyOCD进行调试后,我发现闪存容量为24KB,RAM为3KB。额外的闪存意味着它更可能是PY32F002B,这是一个完全不同的芯片。
以下是这个几乎“一次性”的微控制器的规格: - 24MHz Cortex-M0+ - 24KB闪存 - 3KB静态RAM - 一些外设,但我们不会使用它们。
你可能会觉得这些规格并不足以完成什么任务。我不怪你,毕竟10年前的手机都难以加载谷歌,而这个设备的速度还要慢100倍。然而,我却看到了一个“极速”的网络服务器。
联网
在电子烟上搭建网络服务器的想法并不是突然冒出来的。事实上,我已经研究它们一段时间了,但在写完关于半主机的文章后,我才恍然大悟。
如果你不想阅读那篇文章,简单来说,半主机是嵌入式ARM微控制器的系统调用。你将一些值/指针放入寄存器并调用断点指令,连接的调试器会解释寄存器中的值并执行某些操作。大多数人只是用它来从微控制器获取日志,但它实际上是双向的。
如果你比我年长,可能会记得在Wi-Fi和以太网之前的“黑暗时代”,那时人们必须使用拨号调制解调器上网。你可能也知道,这些调制解调器的“幽灵”仍然存在于我们周围。几乎所有USB串行设备实际上都在模拟这些调制解调器:一个56k的调制解调器只是一个57600波特率的串行设备。这些调制解调器之间的数据传输使用了一种称为SLIP(串行线路互联网协议)的协议。
Linux(经过一些调整后,甚至macOS)支持SLIP。slattach工具可以让任何/dev/tty*设备发送和接收IP数据包。我们只需要以正确的格式将数据发送到线路上,并提供一个虚拟的tty。这实际上比你想象的要简单,pyOCD可以通过telnet端口转发所有半主机调用。然后,我们使用socat将该端口链接到虚拟tty:
bash
pyocd 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
好了,现在我们有了一个“调制解调器”,但这还远远不是一个网络服务器。要真正实现TCP/IP通信,我们需要一个IP协议栈。有很多选择,但我选择了uIP,因为它非常小巧,不需要实时操作系统,并且易于移植到其他平台。它还附带了一个非常简单的HTTP服务器示例。
在将SLIP代码移植到使用半主机后,我有了一个可以工作的网络服务器……但只有一半的时间。与大多数高度优化的库一样,uIP是为8位和16位机器设计的,这些机器通常没有内存对齐要求。然而,在ARM上,如果你解引用一个u16 *,你最好希望地址是偶数,否则会引发异常。uip_chksum假设u16对齐,但创建文件系统的脚本没有。我决定稍微修改文件系统的结构,使其更具可移植性。这是我第一次使用perl,不得不说,它非常适合这种任务。
极速
那么,运行在一次性微控制器上的网络服务器有多快呢?最初,它并不快。Ping延迟约为1.5秒,丢包率为50%,加载一个简单的页面需要超过20秒。这简直糟糕到好笑,我甚至想就这样算了。
然而,问题实际上出在我自己身上。最初的实现是一次读取和写入一个字符,这带来了巨大的开销。我之前在这个设备上对半主机进行了基准测试,得到了约20KB/s的速度,但uIP的SLIP实现是为内存非常低的设备设计的,所以它逐字节序列化数据。我们有3KB的RAM可以使用,所以我添加了一个环形缓冲区来缓存从主机读取的数据,并将其提供给SLIP轮询函数。我还将写入分批进行,以允许转义。
现在,这才是我所说的“极速”!Ping延迟现在为20毫秒,没有丢包,完整页面加载时间约为160毫秒。这几乎使用了所有的RAM,但我也可以调整缓冲区的大小,以留出足够的空间来运行其他任务。项目仓库中的所有设置都在延迟和RAM使用之间达到了良好的平衡:
Memory region Used Size Region Size %age Used
FLASH: 5116 B 24 KB 20.82%
RAM: 1380 B 3 KB 44.92%
不过,对于这篇博客来说,我没有为RAM付费,所以我会用尽所有的RAM。
你可能已经注意到,我们还有不到20KB(80%)的存储空间。这可能不足以部署整个React,但正如你所看到的,它足以托管这篇完整的博客文章。而且,这不仅仅是一个静态页面服务器,如果你懂C语言,你可以运行任何服务器端代码。
为了好玩,我添加了一个JSON API端点,用于获取主页的请求次数(自上次崩溃以来)和微控制器的唯一ID。
资源
- 项目代码
评论总结
评论内容总结:
技术潜力与浪费问题:
- 一些评论者认为一次性电子烟中的微控制器具有技术潜力,甚至可以在极端情况下被重新利用。例如,x187463提到:“想象一个后末日场景,城市由这种随机计算设备拼凑而成。”但同时,他也批评这是“电子废物的严重来源”。
- jerf则从技术角度对比了现代微控制器与老式计算机的性能,指出“虽然它的内存只有Commodore 64的一半,但它的32位24MHz CPU是1980年代无法想象的”。
环境与道德问题:
- 多位评论者对一次性电子烟的环境影响表示担忧。RedShift1直言:“我们需要减少微塑料。”而nusl则强烈批评:“一次性电子烟是一种社会已经正常化的畸形现象。”
- ivape提出了一种可能的解决方案,建议在电子烟中加入USB存储设备,以鼓励重复使用:“如果它们包含一个小型USB存储驱动器,成本会增加多少?你可以激励人们不丢弃它们。”
趣味性与技术挑战:
- 一些评论者从技术趣味性角度看待这一话题。peteforde调侃道:“我注意到截至评论时,他还没有在上面运行《Doom》。还没有吗?”droobles则赞扬了黑客精神:“黑客精神长存!这正是Hacker News的意义所在。”
重复提交与讨论:
- jsheard和ChrisArchitect都提到了之前的相关讨论,并提供了链接,表明这一话题已经有过多次讨论。
总结:评论者普遍认为一次性电子烟中的微控制器展示了技术潜力,但也对其环境危害表示担忧。同时,这一话题引发了关于技术趣味性和道德责任的讨论。