1. 协议栈概览:扫地机器人为什么需要WiFi与蓝牙?双模通信架构设计思路
大家好,我是老李。做嵌入式通信这块十几年了,今天咱们聊聊扫地机器人的通信协议栈。
你可能会问:一个扫地机,干嘛要搞WiFi和蓝牙两套东西?
嗯,这个问题我当年刚入行时也困惑过。后来踩了不少坑才明白——这不是炫技,是刚需。
1.1 为什么需要WiFi?
WiFi的核心价值就四个字:远程控制。
你想想看,你出门在外,想看看扫地机扫完了没,或者想让它去扫某个房间。这时候蓝牙够不着,只能用WiFi走云端。
我在项目中遇到过最典型的场景:用户出差,家里老人不会用App。结果扫地机卡在床底下,App一直报离线。后来我们加了WiFi远程诊断功能,直接远程重启解决了问题。
WiFi的优势很明显:
- 覆盖范围大:只要家里有路由器,整屋都能连
- 带宽高:传个地图、固件升级包,几兆的数据嗖嗖的
- 云端交互:支持语音助手、定时任务、远程监控
核心结论:WiFi负责「远距离、大数据、云端交互」的场景。
1.2 为什么还需要蓝牙?
那蓝牙呢?说白了,蓝牙是干「脏活累活」的。
WiFi有个致命问题——配网太麻烦。你想想,第一次用扫地机,得打开App,输入WiFi密码,让扫地机连上路由器。这个过程如果只用WiFi,你得让扫地机先进入AP模式,手机连上它的热点,再发密码……用户体验极差。
蓝牙配网就简单多了:手机蓝牙一开,扫个码,几秒钟搞定。
我做过一个统计:用蓝牙配网的成功率是98%,用WiFi AP模式配网只有72%。那28%的失败用户,大部分是卡在「找不到热点」或者「密码输错」上。
蓝牙还有几个不可替代的作用:
- 近场调试:产线测试、售后诊断,蓝牙一连接就能看日志
- 低功耗待机:扫地机休眠时,蓝牙可以保持极低功耗监听唤醒指令
- 本地直连:手机靠近就能控制,不用经过云端,响应更快
我的经验:蓝牙最适合做「近场、低功耗、快速交互」的事情。WiFi搞不定的场景,蓝牙来兜底。
1.3 双模通信架构设计思路
好了,既然WiFi和蓝牙各有千秋,那怎么把它们揉到一起?
我习惯把架构分成三层:
| 层级 | 职责 | 使用协议 |
|---|---|---|
| 应用层 | 业务逻辑、命令解析 | 自定义协议(JSON/Protobuf) |
| 传输层 | 数据收发、连接管理 | MQTT(WiFi)、GATT(蓝牙) |
| 物理层 | 硬件驱动、射频控制 | WiFi 802.11、BLE 5.0 |
这里有个关键点:应用层协议要统一。不管数据走WiFi还是蓝牙,到了应用层,命令格式必须一样。否则你写两套解析逻辑,维护起来想哭。
我曾经接手过一个项目,WiFi用JSON,蓝牙用自定义二进制协议。结果每次加新功能,两边都得改,还经常对不上。后来我强制统一成Protobuf,世界清净了。
1.4 双模切换策略
实际工作中,WiFi和蓝牙不是同时工作的。我们一般这么设计:
- 默认状态:蓝牙待机
- 扫地机休眠时,只开蓝牙,功耗控制在几十微安
- 手机靠近,蓝牙唤醒,进行本地控制
- 需要远程时:切换WiFi
- 用户通过App发起远程控制,蓝牙通知WiFi模块上电
- WiFi连接路由器,建立MQTT通道
- 配网阶段:蓝牙辅助
- 手机通过蓝牙发送WiFi SSID和密码
- 扫地机收到后,自动连接WiFi,成功后通知手机
注意:WiFi和蓝牙共用天线时,要避免同时收发。我见过一个案例,WiFi和蓝牙同时发数据,结果互相干扰,丢包率飙升到30%。解决方案是加一个简单的时分调度:WiFi发完,蓝牙再发。
1.5 代码示例:双模初始化
下面是一个简化的初始化流程,我用伪代码展示:
// 双模协议栈初始化
void dual_mode_init() {
// 1. 先初始化蓝牙(低功耗模式)
ble_init(BLE_MODE_LOW_POWER);
ble_set_adv_data("sweeper_001");
// 2. WiFi先不启动,节省功耗
wifi_power_off();
// 3. 注册蓝牙回调
ble_register_callback(BLE_EVT_CONNECT, on_ble_connected);
ble_register_callback(BLE_EVT_DATA, on_ble_data_received);
// 4. 等待事件触发
while(1) {
// 蓝牙事件处理
ble_process_events();
// 如果收到WiFi唤醒指令
if (ble_get_wifi_wakeup_flag()) {
wifi_power_on();
wifi_connect_to_router();
mqtt_connect();
}
// 低功耗休眠
sleep_ms(10);
}
}
这段代码看着简单,但实际坑不少。比如WiFi上电后,蓝牙要暂时降低发射功率,避免干扰。我当初没注意这个,导致WiFi连接成功率只有60%。后来加了功率控制,才稳定在99%以上。
1.6 避坑指南
最后分享几个我踩过的坑:
- 不要同时用WiFi和蓝牙传大文件:蓝牙传固件?慢得要死,还容易断。固件升级必须走WiFi。
- 蓝牙配网时,WiFi密码要加密:明文传输?黑客分分钟破解你家WiFi。用AES加密一下,花不了多少资源。
- WiFi断线重连要加退避算法:别一断就连,连不上又断,死循环。我一般用指数退避:第一次等1秒,第二次2秒,第三次4秒……最多等60秒。
总结一下:WiFi和蓝牙不是二选一,而是互补。WiFi管远程、大数据;蓝牙管近场、低功耗、配网。把这两者用好,你的扫地机通信方案就稳了。
下一章,咱们深入聊聊蓝牙配网的具体实现。到时候我会把配网协议栈的代码一行行拆开讲,保证你听完就能上手。