物联网 App 开发实战(上)—— 协议选型、跨平台开发与设备连接

一、协议选型:物联网通信的第一道选择题

物联网 App 与设备之间的通信是整套系统的"神经系统"。协议选型不当,轻则连接不稳定,重则影响整个系统可用性。目前主流的轻量级通信协议有三个:MQTT、CoAP、LwM2M。

1.1 MQTT ------ 异步消息总线的王者

MQTT 基于发布/订阅模式,报文头部仅 2 字节,支持三个 QoS 级别。它的最大优势是解耦:设备只管发布数据,App 只管订阅感兴趣的主题,双方不需要知道对方的存在。

适用场景 :多设备协同、云端通信、需要可靠送达的控制指令。
版本提示 :推荐使用 MQTT 5.0,增加了会话过期、原因码等实用特性。
常见踩坑

  • QoS 1/2 会带来重复消息,App 端需要做幂等处理。

  • 断线重连后,订阅关系可能丢失,需在 connect 成功回调中重新订阅。

1.2 CoAP ------ 窄带网络的轻量级选手

CoAP 基于 UDP,头部仅 4 字节,采用类 HTTP 的请求/响应模型。实测表明,在 NB-IoT 模组上 CoAP 单次通信能耗远低于 MQTT,非常适合电池供电的传感器。

适用场景 :超低功耗、窄带网络(如 NB-IoT)、资源受限设备。
注意:CoAP 默认使用 UDP,需要自己处理报文重传和顺序问题。

1.3 LwM2M ------ 设备全生命周期管理

LwM2M 基于 CoAP,定义了标准化的设备信息、固件升级等对象模型,适合需要远程运维的场景。

1.4 协议选型速查表
场景 推荐协议 理由
智能家居、车联网 MQTT 成熟生态,QoS 保障
户外传感器、水表气表 CoAP 极低功耗,UDP 无连接
工业设备远程运维 LwM2M 标准对象模型,固件升级完备
实时音视频控制 WebSocket + WebRTC 低延迟,双向流

⚠️ HTTP 仅适合作为云端服务之间的辅助接口,不宜直接用于设备与 App 的长连接通信。

二、跨平台开发:一套代码,两端运行

物联网 App 通常需要同时覆盖 Android 和 iOS。跨平台框架能大幅降低维护成本。

2.1 Flutter
  • 特点:自绘 UI,性能接近原生,AOT 编译启动快。

  • 推荐插件

    • BLE:flutter_blue_plus(持续维护版本)

    • MQTT:mqtt_client

  • 踩坑 :iOS 上使用 BLE 必须在 Info.plist 中配置 NSBluetoothAlwaysUsageDescription,否则闪退。

2.2 React Native
  • 特点:基于 JavaScript,生态丰富,热更新方便。

  • 推荐插件

    • BLE:react-native-ble-plx

    • MQTT:react-native-mqtt(需结合原生模块)或 websocket 模拟

  • 踩坑 :Android 12+ 必须同时申请 BLUETOOTH_SCANACCESS_FINE_LOCATION 权限,否则扫描不到设备。

2.3 Kotlin Multiplatform (KMP)
  • 特点:共享业务逻辑(状态机、协议解析),UI 可各自原生或使用 Compose Multiplatform。

  • 推荐库kable(跨平台 BLE)、kotlinx.coroutines(异步)。

  • 优势:完全避免双端逻辑不一致,且无性能损耗。

2.4 跨平台架构策略

核心原则:业务逻辑跨平台复用,硬件访问通过原生模块注入。

复制代码
// 伪代码示例:跨平台层定义接口
abstract class BluetoothScanner {
  Future<List<Device>> scan();
}
// Android/iOS 各自实现该接口,通过依赖注入提供给 UI 层

代码共享率:通常可达 80%~90%(不含 UI 样式微调)。

三、设备连接:从扫描到握手

3.1 近距离连接:蓝牙 BLE

Android 关键步骤

  1. 申请权限(Android 12+ 需要 BLUETOOTH_SCANBLUETOOTH_CONNECT

  2. 获取 BluetoothAdapter,开启扫描

  3. 回调 onScanResult,过滤出目标设备

  4. 调用 connectGatt,在 onConnectionStateChange 中处理连接结果

  5. 发现服务 discoverServices,读写特征 writeCharacteristic

iOS 关键步骤(Core Bluetooth):

  • CBCentralManager 管理扫描和连接

  • CBPeripheral 代表外设,通过 didDiscoverServices 回调处理服务

跨平台实现建议

  • Flutter:flutter_blue_plus 已封装好权限和回调。

  • React Native:react-native-ble-plx + react-native-permissions

  • KMP:kable 提供协程友好的 API,无需处理复杂的回调地狱。

常见踩坑

  • Android 某些机型上,onConnectionStateChange 回调可能不在主线程,更新 UI 需切线程。

  • BLE 连接后如果长时间不操作,部分手机会自动断开,需要定期发送空包保持连接。

  • 写入特征值时,注意 MTU 大小(默认 23 字节,可通过 requestMtu 协商更大值)。

3.2 广域网连接:MQTT 长连接

Android 集成步骤(使用 Eclipse Paho):

复制代码
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

连接代码示例

java 复制代码
String broker = "tcp://your-mqtt-broker:1883";
String clientId = MqttClient.generateClientId();
MqttAndroidClient client = new MqttAndroidClient(context, broker, clientId);
MqttConnectOptions options = new MqttConnectOptions();
options.setKeepAliveInterval(60);
options.setAutomaticReconnect(true);
client.connect(options);

订阅与发布

java 复制代码
client.subscribe("sensor/temperature", 1); // QoS 1
client.publish("device/control", payload, 1, false);

踩坑与优化

  • 断线重连 :设置 setAutomaticReconnect(true) 后,重连成功不会自动恢复订阅,必须在 onConnectComplete 回调中重新订阅。

  • 心跳 :根据网络环境动态调整 keepAlive(默认 60 秒),弱网可适当增加。

  • SSL/TLS :生产环境必须使用 ssl:// 协议,并配置证书。

  • 离线消息 :若设备离线时 App 发送控制指令,可让 Broker 开启持久会话(cleanSession=false),设备上线后立即收到。

iOS 端推荐CocoaMQTT 库,用法与 Android 类似。

Broker 选型

  • 开发测试:Mosquitto(单机)

  • 生产环境:EMQX(支持百万连接,内置规则引擎)

四、上篇小结

上篇主要解决了物联网 App 开发的前半程:如何选择通信协议、如何搭建跨平台框架、如何实现设备连接(BLE 和 MQTT)。掌握了这些,你已经可以写出一个能扫描、连接设备并收发数据的 App 原型。下篇将深入数据采集、远程控制和完整实战案例。

相关推荐
凡泰AI10 小时前
如何借助MCP打通企业APP内部服务:从统一调用到小程序承接
小程序·uni-app·app·mpaas·mcp·小程序容器
玩转4G物联网11 小时前
FS800DTU 新品上线|免费使用 DMP 设备管理平台,支持远程批量配置 & OTA 升级
物联网·网络协议·tcp/ip·云平台·核心板·fs800dtu·iot管理平台
鉴生Eric12 小时前
IoT基础设施产品商的未来:回归本质的三层能力
物联网
MetrixAeroCore12 小时前
畜牧牛羊定位耳标物联网卡纽扣电池供电与休眠唤醒策略优化
物联网
智圣新创0113 小时前
存量团学系统效能跃升:智圣新创“青春科大”智慧团学平台二期升级的全周期建设参考
大数据·人工智能·物联网
liguojun202513 小时前
智慧文体旅系统选哪家?豆米跳跳十年技术沉淀支持源码交付
java·大数据·人工智能·物联网·1024程序员节
乐橙开放平台15 小时前
明厨亮灶笔记:乐橙轻应用 H5 + 小程序插件,一套 BFF 出两张播放凭证
人工智能·笔记·物联网·小程序·音视频·notepad++
李永奉15 小时前
杰理可视化SDK开发-配置ANC主动降噪功能模块教程
单片机·嵌入式硬件·物联网
绿蕉16 小时前
“十五五”5 万亿电网投资落地:新型电力系统带动电力物联网通信模组产业爆发
物联网·5g redcap·新型电力系统·十五五·电力物联网模组·v2g 车网互动 #配网智能化
乐橙开放平台16 小时前
养殖 SaaS 笔记:乐橙 IoT 物模型管环境,视频 OpenAPI 管回看
数据库·笔记·物联网·mysql·音视频