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和蓝牙不是同时工作的。我们一般这么设计:

  1. 默认状态:蓝牙待机
    • 扫地机休眠时,只开蓝牙,功耗控制在几十微安
    • 手机靠近,蓝牙唤醒,进行本地控制
  2. 需要远程时:切换WiFi
    • 用户通过App发起远程控制,蓝牙通知WiFi模块上电
    • WiFi连接路由器,建立MQTT通道
  3. 配网阶段:蓝牙辅助
    • 手机通过蓝牙发送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管远程、大数据;蓝牙管近场、低功耗、配网。把这两者用好,你的扫地机通信方案就稳了。

下一章,咱们深入聊聊蓝牙配网的具体实现。到时候我会把配网协议栈的代码一行行拆开讲,保证你听完就能上手。