BitChat 工作原理及蓝牙 Mesh 通讯应用为何再次流行

当蜂窝网络服务在音乐节或山区完全消失时,熟悉的应用程序会变成毫无用处的图标。信号无处可达,基站也已过载。在这种情况下,能够直接将数据从一部智能手机传输到另一部的点对点解决方案就派上用场了。
BitChat 项目为这个问题提供了一种有趣的解决方案。开发者将蓝牙 LE 离线本地网络与全球性的 Nostr 协议相结合。结果是一款融合了经典 IRC 风格的混合通讯应用,无需账户,也无需中央服务器。
消息传输的工作原理
BitChat 基于双层架构构建。应用程序会根据当前的连接条件自动调整传输方式。
第一层:蓝牙 LE Mesh。如果接收者在附近,消息会直接发送。当接收者超出蓝牙范围时,数据包会通过其他用户的智能手机链式传递。该架构支持最多 7 个这样的中间跳点。此过程无需互联网。安全性由 Noise 协议处理,它在本地层面提供数据包的端到端加密。
第二层:Nostr 协议。如果直接蓝牙通道不可用但有网络访问,BitChat 会通过公共 Nostr 中继发送数据。
公共聊天室使用 geohash 组织。坐标哈希字符串的长度决定了精度级别:
block(7 个字符):城市街区的聊天范围neighborhood(6 个字符):区域级别city(5 个字符):全市范围的聊天region(2 个字符):覆盖整个国家
发送私密消息时,通讯应用首先搜索直接蓝牙连接。如果没有附近的设备,它会切换到 Nostr 并使用 NIP-17 算法打包文本。当既没有互联网也没有蓝牙邻居时,消息会排队等待,直到任何可用通道出现。
实现细节与界面
从外观上看,BitChat 类似于九十年代末的文字聊天界面。它支持熟悉的命令如 /slap、/msg 或 /who。完全没有注册流程。首次启动时,应用程序会生成临时加密密钥,无需请求电话号码或电子邮件。
项目中几个有趣的技术解决方案:
- 紧急删除。连续点击屏幕三次会永久清除本地存储和加密密钥。
- 流量压缩。数据在发送前通过 LZ4 进行压缩,这对于蓝牙 LE 的低带宽至关重要。
- 功耗优化。在离线模式下,聊天会动态更改 ether 扫描间隔,以节省电池电量。
- 开源。代码库采用 Unlicense 发布,可以自由 fork 或用于商业产品。
如何运行项目
源代码使用 Swift 编写,适用于 iOS 和 macOS。
运行桌面版本最快的方式是通过 just 工具:
brew install just
just run
该命令会编译应用程序并在 Mac 上启动它。测试后清理生成的文件,请调用 just clean。
要在 Xcode 中构建 iOS 版本,需要进行标准的配置准备:
cd bitchat
cp Configs/Local.xcconfig.example Configs/Local.xcconfig
之后,只需打开 bitchat.xcodeproj,在 Local.xcconfig 文件中设置您的 Developer Team ID,并更新 entitlements 中的组名称即可。
为什么要研究这个代码库
没有人会每天把 BitChat 作为主要的通讯应用。然而,从工程角度来看,这个项目具有极大的研究价值。
在代码中,你可以找到基于 CoreBluetooth 的自定义二进制协议的干净实现、geohash 处理以及 Nostr 中继集成。同时,该应用已经可以投入使用并在 App Store 上发布,因此可以作为徒步旅行或大型演唱会的备用通讯选项保存在设备中。
相关项目