Gotta go faster.

背景(起因?)

事情的起因是我某天在刷 Fediverse 的时候看到了我所在的实例上有人发了这么一条帖子(现在找不到了,内容大概是):

Meshtastic is modern Pictochat

这里提到的 Pictochat 指的是老任在 NDS 掌机上推出的聊天功能,可以与附近的掌机进行无线连接,并通过触摸屏画画来聊天。我恰好有一台 3DS ,它有一个类似的功能叫 Streetpass ,能在休眠状态下和附近的掌机联机,我觉得这个功能还挺酷的。因此我当时对这个 Meshtastic 起了点兴趣,简单了解了一下之后发现是一个开源的离网无线电通讯工具。不过我很快就忘记了这件事。

后来我在油管上又看到了 38C3 上有两个 talk 都介绍了 Meshtastic (这个这个),其中提到节点的成本相当便宜(DIY成本在5-7刀,我在国内买零件应该会比他更便宜),于是就想试试。

正好 lyc8503 也感兴趣,就决定在学校尝试一下 Meshtastic 。他已经写了一篇博客介绍总体的探索过程,我在这里仅做一些我自己的补充和想法。建议先去看他的博客再看我的。

硬件选择与成本

我当时看完 talk 就去搜了一下 Meshtastic 支持的各种成品硬件(开发板),结果成品硬件的价格都在 100 元以上,远超我的预期。这下不得不自己组装了。

一开始使用的 ESP32 + SX1278(Ra-01) 组合的成本也达到了 40 元,这还没算上天线,也没有带屏幕。虽然有更便宜的 ESP32C3 ,但是我们把固件刷进去之后无法启动,而且没有任何信息输出,抓瞎了一会儿就放弃了。后来尝试的 nRF52840 + SX1268(E22-400MM22S) 的组合相对便宜,算上小天线也只有 20 元出头,但是射频模块其实是以拿样价 6 元购买的,如果原价购买则需要 20 元,算下来总成本也要将近 40 元。而且需要手动焊接。

另外,我还购买了 U-blox NEO-6M GPS 模块,成本为 11 元,可以为节点提供位置信息,虽然精度不高。

我的目标是尽可能压低成本,这样看下来 20 元每个节点应该已经是极限了。 不过Meshtastic群的群友似乎不太在意成本, 100 多的成品也买得很开心

更多距离测试

我的另一个目标就是想看看自制节点的极限传输距离。根据 Meshtastic 网站显示,目前地面上的距离纪录高达 331km国内的 Meshtastic 社群也有群友达到 10km 以上的传输距离。而在南京进行的几次实验都因为周围有很多建筑物遮挡而无法达到很远的距离(不到1km)。因此我去了乡下的一些地方尝试更远的距离。相对空旷的地形和较弱的噪声干扰应该能让传输距离有所提升。

V2 硬件的距离测试

使用硬件: nRF52840 + SX1268(焊接在小板) + 转接线连接的胶棒天线(即 lyc8503 文中的 硬件 Version 2)

放置在四楼阳台上的节点

将一个节点放置在四楼阳台上之后拿着另一个节点沿着门口的直路走。最远能达到大约 800m 的距离,再远就收不到消息了。地图上的位置和最远位置的信噪比如下。

地图上的位置
信号指标

从地图上看连线几乎没有建筑物遮挡(蹭着厂房的一角过去了,可能就是因为这个原因不能继续往外走),可惜还是没满 1km 。可能这个手搓的天线转接线的质量还是太幽默了。

V3 硬件的距离测试

使用硬件: nRF52840 + SX1268 + 转接板 + 胶棒天线 + (可选的) GPS 模块(即 lyc8503 文中的 硬件 Version 3)

升级了硬件之后,我去了另一个乡下地方进行测试。一个节点放置在3楼窗口,另一个节点四处移动。这个地方没有很长的直路,只能尽可能找空旷的方向走。但是我仍然没能找到理想的、完全没有建筑遮挡的长线段,最终在有少量房屋遮挡的线上测到了 1km 的距离。地图上的位置和信号测量记录如下。注意到箭头所指位置有少量房屋遮挡,但仍然能成功传输。这次实验的时候在移动的节点上尝试交换了长天线(24cm)和短天线(11cm),但似乎两根天线的传输距离和信号质量并无明显区别。

地图上的位置
信号指标

V3 硬件的距离测试,第二次

去乡下还是没能找到足够平坦的地方,于是我决定再来一次测试,这次利用山的高度来绕过城市中的各种建筑物障碍。

使用硬件同上一次(只使用了短天线),把一个节点贴在家里的4楼阳台窗户上,拿着另一个节点去爬山。虽然一路上没有信号,但是到达山顶的一个建筑物之后成功收到了信号,此处距离我家 2.6km ,海拔比我家高 200m 左右 在这里放地图的话就把我家盒了,还是算了。

山顶的节点

^山顶的节点。此处到我家的肉眼视线被树挡住了,但是电波能轻松穿过。

信号指标

^四次 traceroute 的信号指标。甚至有一次是良好,应该还没到极限。

聊天记录

^连续多条消息被成功接收、发出的消息被成功 ACK 。

总结

上山测完这一次之后,总算是达到了我对这玩意传输距离的预期值。不过这应该还没达到极限。也许之后还可以进一步测试,但我不会分身术,不能同时移动两个节点,也不太能在山上放置节点之后再下来到处移动(毕竟公共场所)。上一次山只能获得 1 bit 的信息。之后有空再说吧。果然高度才是王道。

从 lyc8503 五月发的博客到现在也拖了快 3 个月了。这个 project 终于结束了。稍微感受了一下在现实中做嵌入式开发的感觉。我个人感觉能用上 Meshtastic 的场景还是不太多,现在能想到的只有:去偏远没手机信号的地方旅游,以及在空旷地区使用物联网设备(比如范围较大的农田)成本上应该比使用 4G 要低一点。在城市这种环境组网只是看起来有点酷(?),并且基础设施由自己控制而已。

阅读此文

本文章含有较多拍屏图片,因为 Live CD 不方便把截图传出来,请读者忍一下(。

前年的时候我把我家的一台旧电脑升级了下硬件改造成了服务器,持续运行至今没出过什么大问题,直到前两天——

红温的开始

我像往常一样连着 ssh 操作服务器,然后命令行突然没反应了,随后执行什么命令都报 输入/输出错误

输入/输出错误

再过一会儿, ssh 连接也没反应了,我前去查看服务器情况,插上显示器发现没有显示输出,电源也没有断,但是键盘完全无反应,只能硬重启。重启之后发现 BIOS 识别不到系统盘了。我想着可能是接触不良就把硬盘换了个 SATA 接口,启动之后识别到了系统盘并且正常启动了系统,但是没过多久就开始报满屏的 I/O Error

噔噔咚

大事不妙。这块 SSD 很可能已经坏了。糟糕的是我没有对系统盘做任何备份,虽然上面没有什么重要数据,但是重装系统以及重新配置各种服务还是很烦的。

硬重启之后 BIOS 又识别不到硬盘了,必须断电一段时间才能重新识别到。我启动到 Live CD 试图把盘里的数据 dd 出来,结果读到 4GB 就读不出来了:

dd中断

重启之后跳过这一块继续试图 dd ,但是在 8GB 多的地方又失败了,看来坏了不止一个地方。

至少分区表和超级块还在,不过这时候已经晚上11点了,如果继续的话我不知道要干到什么时候,就先睡了 (结果没睡好)

恢复数据

第二天起来查到了一个 ddrescue 工具,可以自动从坏掉的硬盘里读出尽量多的数据。于是就插上 Live CD 开干了。 ddrescue 运行的时候遇到 I/O Error 会等内核重置 SATA 链接之后跳过去继续读。花了约 1.5h 完成 Pass 1 之后已经成功读取了 240GB 中 239.897GB 的数据,看来还坏得不严重。

ddrescue成功读取

继续运行几个小时之后已经只剩 5MB 没有读出来了。我挂载上恢复出来的镜像先 fsck 了一遍,发现没有找到问题,看来文件系统是完好的,损坏的只有文件数据。ddrescue 还会输出一个 map 文件,里面有每一段读取成功/失败的范围,应该可以通过这个范围去寻找被破坏的数据属于哪个文件。

于是找到了superuser上的这个问答,发现可以使用 debugfs 命令来寻找被影响的文件,于是写了个脚本找出了所有损坏的文件。

损坏的少量文件

万幸的是损坏的少量文件都是不重要的文件,只需要重新安装一下软件包就能恢复。

复活!

接下来就简单了,我正好有张几乎是空的 HDD ,直接划个分区出来,把恢复出来的镜像 dd 回去,重新安装 grub ,然后修一下受损的文件就好了。虽然在 HDD 上的系统可能会慢一点,但是我几乎不跑什么 IO 密集型负载,就先凑合着用了。

后记

血的教训:备份很重要,所有丢失了就很烦的数据都应该备份。虽然这次运气好能完全恢复数据,但是下次可不一定。此外这块 致态 SC001 Active SSD竟然用了一年多就坏了, SMART 信息显示写入才 15TB ,看来长江存储也不太能信(?)

阅读此文
post @ 1970-01-01

UPD 2023.10.27 加入了 Waline 评论系统。欢迎在评论区交换友链;-)

从高中开始想搞的博客,咕了5年终于想起来做了。如你所见这是一个 retro 风格的主题,虽然只是表面上 retro ,但是我之后应该会做一个纯html,没有任何jscss的分站。

现在还没想好这里要写什么,想到了再说。首先排除课程笔记。

此帖也用作本站的 Changelog.

阅读此文
⬆︎TOP