22、蓝牙与物联网云平台:MQTT over Bluetooth、BLE网关设计、数据上云(阿里云IoT/腾讯云IoT)、OTA固件升级

说实话,蓝牙开发做到一定阶段,你一定会遇到一个坎——数据怎么上云

我自己最早做蓝牙项目时,以为手机连上设备就完事了。后来客户说:我要在办公室看工厂的设备数据。嗯,这时候我才意识到,蓝牙只是最后一公里,真正的战场在云端。

这一章,我们就来聊聊蓝牙怎么跟物联网云平台打交道。包括MQTT over Bluetooth、BLE网关设计、数据上云,还有OTA固件升级。内容不少,但都是实战中绕不开的硬骨头。

核心知识点一览:

  • MQTT over Bluetooth:蓝牙设备如何通过MQTT协议与云平台通信
  • BLE网关设计:手机/专用网关作为桥梁,转发数据
  • 数据上云:对接阿里云IoT、腾讯云IoT
  • OTA固件升级:通过蓝牙远程更新设备固件
蓝牙与物联网云平台知识体系 蓝牙设备 MQTT over BLE BLE网关设计 数据上云 BLE GATT + MQTT 数据封装/解析 手机/专用网关 阿里云IoT 腾讯云IoT OTA固件升级

22.1 MQTT over Bluetooth:让轻量级协议跑在BLE上

MQTT 是物联网领域的事实标准。它轻量、省电、支持发布/订阅模式。但问题是——MQTT 原本跑在 TCP/IP 上,而 BLE 没有 IP 栈。

怎么办?我早期也被这个问题卡住过。后来发现,其实有两种主流做法:

  • 方案一:通过手机中转——手机连蓝牙拿数据,再用 Wi-Fi/4G 跑 MQTT 发到云端。这是最常用的方式。
  • 方案二:设备直连 MQTT Broker——设备本身带 Wi-Fi 或以太网,蓝牙只做配置/调试通道。

说白了,纯 BLE 设备没法直接跑 MQTT。但我们可以把 MQTT 的数据包封装在 BLE 的 GATT 特征值里传输。我管这叫「MQTT over BLE 隧道」。

我的经验:在项目中,我通常把 MQTT 的 Topic 和 Payload 打包成一个 JSON 字符串,通过 BLE 的 Write 和 Notify 特征值来收发。手机端收到后解析,再通过标准 MQTT 客户端转发到云端。

数据封装示例

// 设备端发送数据到手机
{
  "topic": "/device/001/temperature",
  "payload": {
    "value": 25.6,
    "unit": "celsius",
    "timestamp": 1695000000
  },
  "qos": 1
}

// 手机端收到后,调用 MQTT client 发布
mqttClient.publish("/device/001/temperature", payloadJson, 1);

22.2 BLE网关设计:手机还是专用硬件?

网关的角色,说白了就是「翻译官」。一头接蓝牙设备,一头接互联网。

我见过两种主流方案:

方案 优点 缺点 适用场景
手机作为网关 开发快、成本低、用户现成 依赖用户操作、后台易被杀死 消费类产品(手环、体脂秤)
专用BLE网关 7x24小时在线、稳定可靠 硬件成本高、部署复杂 工业/商业场景(传感器网络)

我个人习惯是:原型阶段用手机,量产阶段上专用网关。记得有一次做智能灯控项目,客户非要手机做网关,结果用户一关App后台,灯就失联了。后来还是换了专用网关,问题才解决。

手机网关的核心逻辑

// Android 端 BLE 扫描 + 连接 + 数据转发
BluetoothDevice device = bluetoothAdapter.getRemoteDevice(address);
device.connectGatt(context, false, new BluetoothGattCallback() {
    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, 
                                        BluetoothGattCharacteristic characteristic) {
        byte[] data = characteristic.getValue();
        // 解析数据
        String payload = parseSensorData(data);
        // 通过 MQTT 转发到云端
        mqttClient.publish("sensor/data", payload, 1);
    }
});

22.3 数据上云:对接阿里云IoT与腾讯云IoT

数据到了网关,下一步就是上云。国内主流就是阿里云IoT和腾讯云IoT。两家我都对接过,说下我的感受。

阿里云IoT接入要点

  • 设备需要提前在阿里云IoT控制台注册,获取三元组(ProductKey、DeviceName、DeviceSecret)
  • MQTT连接地址格式:${ProductKey}.iot-as-mqtt.${Region}.aliyuncs.com
  • 使用阿里云提供的设备端SDK(C/Java/Android)可以快速接入
// 阿里云 MQTT 连接示例(Android端)
String productKey = "a1B2C3D4";
String deviceName = "sensor_001";
String deviceSecret = "xxxxxxxxxx";

MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(deviceName + "&" + productKey);
options.setPassword(deviceSecret.toCharArray());
options.setCleanSession(false);

String broker = "tcp://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883";
MqttClient client = new MqttClient(broker, MqttClient.generateClientId());
client.connect(options);

腾讯云IoT接入要点

  • 同样需要先在平台创建设备,获取设备证书
  • MQTT地址格式:${ProductId}.iotcloud.tencentdevices.com
  • 腾讯云支持一机一密和一型一密两种认证方式

注意:我曾经踩过一个坑——阿里云和腾讯云的MQTT Topic格式不一样。阿里云是 /${ProductKey}/${DeviceName}/user/xxx,腾讯云是 ${ProductId}/${DeviceName}/xxx。迁移时一定要改Topic,否则数据发不上去。

22.4 OTA固件升级:远程更新,不用再跑现场

OTA(Over-The-Air)升级,是蓝牙设备必备的能力。你想想看,产品卖出去了,发现有个bug,难道要用户寄回来?或者派人上门?不现实。

我做过一个温湿度传感器项目,第一批出货500台,结果发现采集频率算法有误。还好提前做了OTA,一周内全部远程更新完毕。要是没OTA,光差旅费就够呛。

BLE OTA的典型流程

  1. 云端存储固件:将新固件上传到阿里云OSS或腾讯云COS
  2. 手机/网关下载固件:通过HTTP从云端下载.bin文件
  3. 分片传输:将固件分成多个MTU大小的包,通过BLE Write发送
  4. 设备端校验:每包校验CRC,最后校验整个固件的哈希值
  5. 设备重启:校验通过后,设备跳转到新固件运行
// OTA 分片发送示例(Android端)
byte[] firmwareBytes = downloadFirmwareFromCloud(url);
int mtu = 512; // 根据设备支持的最大MTU
int offset = 0;

while (offset < firmwareBytes.length) {
    int length = Math.min(mtu, firmwareBytes.length - offset);
    byte[] packet = new byte[length];
    System.arraycopy(firmwareBytes, offset, packet, 0, length);
    
    // 写入OTA特征值
    otaCharacteristic.setValue(packet);
    bluetoothGatt.writeCharacteristic(otaCharacteristic);
    
    offset += length;
    // 等待设备确认后再发下一包
    waitForAck();
}

避坑指南:我曾经遇到过OTA到一半断连的情况。后来加了断点续传——设备端记录已接收的偏移量,重连后从断点继续发。另外,一定要保留两个固件区(A/B分区),万一新固件起不来,还能回滚到旧版本。

22.5 整体架构串联:从设备到云端的完整链路

最后,我把整个链路串起来给你看看:

  1. 蓝牙设备采集传感器数据,通过GATT特征值上报
  2. 手机/网关接收数据,解析成JSON格式
  3. MQTT客户端将数据发布到阿里云/腾讯云IoT平台
  4. 云平台存储数据,触发规则引擎,推送到业务应用
  5. OTA升级时,流程反向:云端→手机→蓝牙设备

说白了,蓝牙只是管道,云才是大脑。把这两者打通,你的产品才算真正有了「联网」的能力。

本章小结:

  • MQTT over BLE 需要手机或网关做协议转换
  • BLE网关设计要权衡成本与稳定性
  • 阿里云IoT和腾讯云IoT接入方式类似,注意Topic格式差异
  • OTA升级必须做断点续传和双分区备份

公众号:蓝海资料掘金营,微信deep3321