0x00 背景(无关的碎碎念)
因为之前备份 HomeLab 的上传量过大被运营商当作 PCDN 制裁, TR069 的组网又被苏州移动禁了, 我曾经设想过在大约相隔 2-3km 的两地不依赖运营商进行 P2P 通信.
想要不依赖运营商通讯只能自己搭建物理信道了, 有线方案(在马路下面施工埋光纤)看起来是个比较烧钱的大工程, 并且我没找到任何个人在城市里埋光纤的先例 - 不知道找谁施工, 不知道如何找当地市政批准, 不知道如何维护…
转向无线组网方案, 民用免执照的频段和功率下, 2-3km 距离的通讯速度甚至难以超过 10Kbps… 在我的使用场景下这个速率低到完全不能发挥作用. (最后是靠在网上信访投诉运营商解决了上传限速问题)
不过最近回到了学校, 算是闲来无事, 决定无论如何还是尝试一下当时找到的 Meshtastic 这个组网项目.
(以及, 本次共同参与者还有 Bob, 他之后应该也会更新一篇博客.)
0x01 Meshtastic 简介
根据其官网的介绍, Meshtastic 是一个开源, 离网(不依赖运营商), 分布式且运行在低功耗设备上的 Mesh 网络.
具体来说, 就是网络组建者购买一些搭载无线模块的单片机部署在各地作为”基站”, 使用者可以通过手机 APP 以蓝牙或 Wi-Fi 的形式连接到就近的基站发送消息.
发送的消息会被基站广播出去, 所有收到这一消息的基站还会进行继续的路由和转发, 直至消息经过若干跳后最终被发送到所有可达的节点. 另一头的接收者同样是通过手机 APP 连接就近的基站就可以看到发送者的消息了. 至此, 所有参与其中的基站和用户就组成了一个分布式的 “Mesh” 网络.
0x02 开始搭建~
Meshtastic 官方支持的硬件主要是一系列可以购买到的成品硬件, 其价格大约在 100-300 元不等, 成品硬件除了开发板本体以及无线模块外, 有些还会选配小屏幕, GPS模块, 塑料壳等配件.
不过作为一个开源的 DIY 项目, 我肯定是倾向于自己 DIY 一套硬件的. 观察一下官方支持的硬件列表: 单片机主要是 ESP, Raspberry 和 nRF52 三个系列的 MCU, 无线模块主要是 Semtech 制作的 SX126x/SX127x 系列 LoRa 模块, 至于屏幕其实是完全不需要的, 我直接按照这个配置尝试 DIY.
我从箱子里翻出了压箱底的 ESP32 开发板和 Raspberry Pi Zero 两块板子, 又去淘宝买了两片 SX1278 模块(一片已经焊好插针的 ~20元, 一片邮票孔封装的 ~10元, 需要自己飞线或买两片通用的 2.0mm 转 2.54mm 转接板焊接).
Pi Zero + 无需焊接的 SX1278 (图中这根烂天线为极差的信号埋下伏笔)
ESP32 + 自己焊接的邮票孔封装 SX1278
硬件连接完成后, ESP32 节点可以直接用 Web Flasher 刷入硬件组合相同的 TLoRa V2 的预编译固件, RPI 可以下载预编译好的 meshtasticd 运行. 具体的 Pin 连接方式可以参考仓库中对应的定义.
两台设备都跑起来之后, 可以用手机安装 Meshtastic 应用, 用蓝牙或 USB 连接到 ESP32, 简单设置一下频段(国内是 470-510MHz 频率), 就可以发送消息了.
第一次成功"通联"于 2025/2/24, 两台设备相隔不到 1 米
0x03 信号测试&优化
硬件 Version 1 (传输距离 30 米, 免焊接版 ~40RMB)
使用硬件: ESP32 + SX1278 + 弹簧天线
第一次装出的硬件设置虽然可以工作, 但作为无线组网, 信号传输距离显然是很重要的一环.
这套两端都是 SX1278 + 弹簧天线的 setup 在测试中信号非常差, 最差的一次从宿舍楼上到楼下走几步, 不到 30 米就无信号了, 这怕不是连 Wi-Fi 都打不过, 必须开始进行信号优化了.
我和身边的同学都是学习软件出身, 并没有学习过任何无线电相关的知识, 也对如何优化天线的信号毫无头猪绪, 不过这个拿一小节弹簧作为天线看起来就十分可疑, 抱着朴素的”加钱就能变强”的想法, 我先尝试了升级整套硬件及天线.
(p.s. 并不是说 SX1278 真的非常烂, 后续测试发现主要是天线的问题)
硬件 Version 2 (传输距离 > 400 米, ~22RMB)
使用硬件: nRF52840 + SX1268(焊接在小板) + 转接线连接的胶棒天线
我们根据 Meshtastic 官方 Wiki 支持的硬件型号和推荐, 升级到了 SX1278 的新一代产品 SX1268, 弹簧天线肯定也是不能用了, 转而购买了几种不同的天线.
这个 SX1268 模块的选购其实还比较麻烦: 虽然 SX1268 芯片是同一款, 但其模块的形态和接口真的是五花八门. 有很多串口 (UART) 的模块并不能在 Meshtastic 中使用, 而 SPI 接口的模块又都是邮票孔封装的, 必须焊接.
那既然都得自己焊, 封装就无所谓了, 最后就选了能找到的最便宜的 E22-400MM22S 模块 (薅了一把淘宝亿佰特的首单优惠, 12元/2片, 6元/片). 配套的购买了 nRF52840 的单片机 (~13元) 以及价格不等的几根天线回来测试.
这个邮票孔的孔距甚至是 1.27 mm 的, 试图用一些比较伊拉克的焊接方法都失败了, 最后去嘉立创免费 PCB 做了一块小板子, 把 1.27mm 的邮票孔转成 2.54mm 间距的排针.
第二版硬件雏形, 图中 SX1268 的小板就是自己画的
由于当时画转接板忘记留一个接天线的接口, 后面又 DIY 了一个 SMA 转杜邦线的神秘转接线, 强行把天线连接到了 SX1268.
最终, 这套 nRF52840 + SX1268 + 淘宝随机的一根 3 元胶棒天线组合的效果有明显提升, 将一端放在软院楼(地图上叫费彝民楼)五楼, 手持另一端可以走到 350 余米开外.
放在软院楼机房的节点
实测了从软院楼到操场另一边的距离, 再远离因为有建筑遮挡信号就比较差, 空旷地区能传输更远
手机上可以看到节点的 SNR (信噪比) 和 RSSI (接收信号强度指示), 类似下图. 我们测得的 SX1268 的极限大约就是 SNR 要大于 -15 dB, RSSI 要大于 -110 dBm 才能接收到消息.
手机上看到的信号测量日志
VNA
第二版的硬件虽然达到了一个可用的水平, 但距离商家宣传的 2-3km 仍有很大距离. 为了更好的测试不同天线, 购买了一个 VNA 用于测试.
将 VNA 校准后连上天线, 可以看到一些天线的参数
图中抽象的易拉罐是试图作为“地网”优化天线使用的, 但测试发现效果并不好, 后来没有使用. VNA 的具体使用由于我也不熟悉, 引用一下地网这篇文章中的表格说明.
参数 无地网优化 有地网优化 说明 SWR (驻波比) 22.574 @ 486.4 MHz 1.467 @ 486.4 MHz SWR 越接近 1,匹配越好,>3 说明损耗严重 阻抗 15.24 + j120.40Ω (阻抗) 50.86 + j19.43Ω 实际测得的天线复数阻抗值,理想状态应接近 50 + j0Ω;当阻抗偏差过大时会导致能量耦合效率低,增大传输损耗 阻抗匹配 严重偏离 50Ω 接近 50Ω 阻抗匹配接近 50Ω 时,信号传输最佳 Smith 圆图 点偏离中心严重 点接近中心 阻抗匹配好时,Smith 图上的点应接近中心
VNA 测试发现, 之前购买的 3 元短胶棒天线在 470 MHz 左右的 SWR 达到了 1.15, 阻抗为 53.37-j6.32Ω, 整体的参数还不错, 性价比也很高, 但加上自己 DIY 的转接线效果会差很多. 全部购买的几根天线如下.
自己焊接的会导致天线效果变差很多的转接线
天线合照
从左到右的淘宝包邮价格是 20元 / 3元 / 0元(随模块赠送) / 3元. 第一和第四根 VNA 测试的参数较好, 第二和第三根都很差.
硬件 Version 3 (传输距离 > 700 米, ~22RMB)
使用硬件: nRF52840 + SX1268 + 转接板 + 胶棒天线 + (可选的) GPS 模块
因为第二版缺少天线接口, 使用转接线信号变差, 重新设计了第三版的硬件, 同时把 SX1268/nRF52840/天线 SMA 座和 Bob 想加的 GPS 模块四个接口都画在了一块 PCB 上.
空板, 焊接好的板, 以及组装好的成品
新的版本加上天线接口后信号显著变好, 同时不用连一堆杜邦线了, 也更方便一手拿起.
这个版本针脚定义同 NRF52 Pro-micro DIY, 可以直接刷官网预编译的固件. PCB 文件可以在此下载, 其实画起来也没有任何门槛: 浏览器打开立创 EDA, 从元件库找到对应的封装, 再把需要连接的针脚全部连起来, 最后自动布线就行了. (小声: 还能免费下单包邮到家, 真是太方便了)
这下再出门测试一下信号传输距离, 在有一些建筑遮挡的情况下, 直接从宿舍连到了紫峰大厦边, 700 米的距离, 也算是提升巨大吧.
自建运营商 Mesh 组网信号现已覆盖紫峰大厦(x)
建筑遮挡还不少, 能达到这个距离不容易
0x04 实地 relay 测试
终于把节点优化好了, 但我们的 Mesh 网络显然不能只有两个节点(不然不就成 P2P 了).
我们用两片 v3 版本的硬件, 和一片改良天线为胶棒天线的 v1 硬件, 在南大校园里开始组网, 以及测试数据包通过中继节点的转发情况. Meshtastic 会根据硬件地址生成一个默认的节点名称, 以下, v1 节点的名称为 169c, v3 节点的名称为 eaba 和 0636.
我们全程将 169c 节点固定放在了南园 2 舍的五楼北侧窗台处, 拿着 eaba 和 0636 前往北区进行测试.
由于到北区的建筑障碍较多, 走到大约教学楼处两个 v3 节点就比较难连上 169c 了, 此时将 0636 节点留在教学楼四楼教室中作为中继, 拿着 eaba 继续前进, 在不同位置测到了以下结果.
节点位置和高度大概如图所示
在 Meshtastic 手机 APP 中, 可以选择私信对应节点, 观察发送的消息是否能被确认收到. 但除此之外, 还有一个 traceroute 功能, 可以用于确定消息实际发送的路径, 以及路途中各跳的 SNR.
在图中的第一个 eaba 位置进行 traceroute, 由于此时 eaba 恰好距离 169c 还不算那么远, 直接发生了一个非对称路由: 去程消息直接被 169c 收到, 而返程消息经由 0636 转发后被 eaba 收到. 这也确实符合 Mesh 网络动态路由的特征.
eaba<->169c 一上来就搞了个非对称路由
再走远一些, 在图中第二个 eaba 位置进行 traceroute, 此时去程和返程都经过 0636 转发.
eaba<->169c 去返程都经由 0636 节点转发的更加"经典"的中继情况
后续, 我们直接将 eaba 节点放在了软院楼三楼的南侧窗户边. 由于位置较高, eaba 节点直接绕开了建筑物障碍, 意料之外的和 169c 直接建立了信号还不错的通讯. 此时我们拿着 0636 节点在校园各处测试, eaba 就成了中继节点.
节点的位置和高度, 这时 eaba 在三楼充当了信号塔的作用, 在建筑物阻挡较少的情况下能覆盖新的一片区域
挂在软院楼窗外的 eaba 节点
此时, eaba 和 169c 两个节点已经能够覆盖南大的大部分面积了, 且两个节点间能互相通讯. 在任意地方部署第三个或者更多节点, 它们都能加入这同一个 Mesh 网络互相通讯.
0636<->169c 在操场边, 0636 通过 eaba 转发联系到了原本无法通讯的 169c
0x05 小结
虽然说我们的运营商”覆盖了”南大范围, 但由于手机没有直接收发 LoRa 信号的能力, 所以其实并不像传统运营商那样, 可以直接用手机接入运营商. 如果要实现真正的覆盖, 得部署多得多的节点, 让每个手机都能用蓝牙连上附近的节点. 这已经超出了本文的范畴.
本来还打算做外壳或者太阳能的, 不过由于锂电池比较危险, 加之也没有很好的地点用于长期部署节点, 最后也放弃了这个想法.
组网还是比想象的更加困难, 470-510 MHz 信号的衍射能力比预期的差得多, 想达到一个理想的传输距离还是需要不少优化, 也需要一个空旷的场地或者高楼. 即使覆盖范围已经如此之小, Meshtastic 的传输速率甚至达不到 1kBytes/s, 几乎无法发送除了简单文本消息以外的其他内容.
这个 idea 终于算是告一段落. 从两月写到五月下旬, 拖了三个多月, 期间在各种试错和等快递. 每次试错都要等几天的快递是最折磨的. 期间试过适配 ESP32C3, 试过驱动 OLED 屏幕 (都失败了), 把模块焊盘干掉过, 也踩过很多稀奇古怪的坑 - 印象最深刻的是压箱底的杜邦线, 放了六年之后, 居然有 80% 都断了, 属实是被坑了一把, 根本没想到线会断.
期间懒得画板, 试图自己搞抽象焊接, 然后直接把模块焊盘干掉下来了, -6 RMB
工作状态中的抽屉, 其实大部分时候桌面比这乱的多, 线和模块被丢的到处都是
无论如何也算是在离开学校前完成了所有实验, 下篇博客再见 o/
本文采用 CC BY-NC-SA 4.0 许可协议发布.
作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/meshtastic-networking/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬