uni-app本身不能直接对接物联网设备,它只是前端运行容器;真正对接需通过HTTP/MQTT/WebSocket/串口等协议+原生能力(插件或平台API)实现,通路选择取决于设备通信方式、目标平台及发布端(H5/小程序/App)。

uni-app 本身不能直接对接物联网设备,它只是前端运行容器;真正对接设备必须通过网络协议(HTTP/MQTT/WebSocket/串口)+ 原生能力(插件或平台 API)来完成。关键不是“能不能”,而是“走哪条通路”——取决于设备通信方式、目标平台、以及你发布的端(H5 / 小程序 / App)。
设备直连:用 uni.connectWifi + TCP/UDP 配网最常用
这是让手机控制硬件的第一步:先连上设备发出的热点,再发配网参数。微信小程序和 App 端都支持,但行为差异大:
-
uni.connectWifi在 iOS 上要求提前声明NSLocalNetworkUsageDescription权限,且必须开启“局域网通信”开关,否则静默失败 - 安卓端需动态申请
ACCESS_FINE_LOCATION权限(因为 WiFi 扫描被归为位置信息),不授权就拿不到设备热点列表 - 连接设备热点后,不能直接用
uni.request发 TCP 包——得用wx.createTCPSocket(小程序)或原生插件(App) - 常见错误:
connectWifi成功回调里立刻调用createTCPSocket,但实际连接尚未就绪,建议加setTimeout或监听onGetWifiList确认已关联
云平台对接:OneNet / 阿里云 IoT / EMQX 选 HTTP 还是 MQTT?
绝大多数项目不该自己实现底层协议,而是对接成熟云平台。选择依据很实际:
- 如果只读传感器最新值(比如温湿度),用 OneNet 的
GET /devices/{device_id}/datastreams/{datastream_id}/datapoints最轻量,uni.request直接调,Header 带api-key即可 - 如果要实时接收设备上报(比如门磁开关触发告警),必须用 MQTT —— H5 用
mqtt.js+ WebSocket,小程序需封装wx.connectSocket适配层,App 端强烈建议用原生 MQTT 插件(mqtt.js在长连接保活和重连策略上容易出问题) - 阿里云 IoT 的一机一密认证参数(
productKey、deviceName、deviceSecret)必须在前端 JS 里计算sign,但deviceSecret绝不能硬编码,应由后端下发或通过安全通道注入
蓝牙与串口:iOS 和安卓权限模型完全不兼容
想读 BLE 设备或接 USB 串口?别指望一套代码通吃:
- iOS 蓝牙扫描必须调用
uni.openBluetoothAdapter后显式uni.startBluetoothDevicesDiscovery,且用户首次使用会弹系统级授权框;安卓则只需BLUETOOTH_ADMIN权限,但 Android 12+ 要求额外声明BLUETOOTH_SCAN和BLUETOOTH_CONNECT - 串口通信在 App 端依赖原生插件(如
Fvv-UniSerialPort),但该插件在 iOS 上需手动配置Info.plist添加UISupportedExternalAccessoryProtocols,否则open返回fail permission denied - 微信小程序根本不支持串口,BLE 也仅限“中心角色”(即扫描连接外设),无法做广播(Peripheral)——所以小程序做设备配网可以,做设备固件升级不行
真正卡住项目的,往往不是协议怎么写,而是某个平台的权限没声明、某个插件的 native 配置漏了一行、或者 Token 被缓存在了 URL 里被 CDN 记录下来。跨端的本质,是把同一套逻辑拆成三套配置去填坑。











