更新记录
1.0.0(2026-09-30)
下载此版本
首次完整实现:原生 MQTT 3.1.1 透传客户端(connect / subscribe / publish / unsubscribe / disconnect)。
- Android:Eclipse Paho
mqttv3 1.2.5
- iOS:CocoaMQTT 2.1.x
- HarmonyOS:ohpm
@ohos/mqtt@2.0.18
平台兼容性
uni-app x(5.21)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| × |
× |
√ |
√ |
√ |
× |
其他
| 多语言 |
暗黑模式 |
宽屏模式 |
蒸汽模式 |
| × |
× |
× |
√ |
原生 MQTT 3.1.1 客户端(Android / iOS / 鸿蒙)
面向 uni-app x(含蒸汽模式) 的三端 UTS 原生 MQTT 透传客户端。统一 connect / subscribe / publish / unsubscribe API 与错误码,适合 IoT 设备长连接、网关等场景。
| 平台 |
底层库 |
说明 |
| Android |
Eclipse Paho mqttv3 1.2.5 |
Gradle maven 依赖,UTS 直调 |
| iOS |
CocoaMQTT 2.1.6(预编 xcframework) |
CocoaMQTT + MqttCocoaAsyncSocket + Starscream |
| HarmonyOS |
@ohos/mqtt 2.0.18(libmqttasync.so) |
ohpm 依赖,UTS 直调 |
功能特性
| 特性 |
说明 |
| 三端统一 API |
connect / subscribe / publish / unsubscribe / disconnect / isConnected |
| 透传设计 |
只负责连接与报文收发,topic 拼装、JSON 解析、业务重试由调用方处理 |
| 协议 |
MQTT 3.1.1(protocolVersion: 4 默认;3 为 3.1,iOS 侧固定 3.1.1) |
| 连接方式 |
TCP / TLS / WebSocket / WSS(wx:// 等价于 ws://) |
| 持续消息 |
onMessage 主线程持续回调(@UTSJS.keepAlive 保活) |
| 自动重连 |
reconnectInterval 调度重连尝试;0 关闭,可交业务层自行重连 |
| 错误码 |
统一 904xxxx + 用户可读中文 errMsg |
| 线程 |
回调统一切主线程(Android Handler / iOS、鸿蒙主线程派发) |
平台兼容性
| 平台 |
支持 |
说明 |
| Android |
✅ |
minSdkVersion 21;maven 依赖需 自定义基座 或云打包 |
| iOS |
✅ |
deploymentTarget 12.0;预编 xcframework(arm64 真机 + 模拟器) |
| HarmonyOS |
✅ |
ohpm @ohos/mqtt;自定义基座 或云打包 |
| Web / 小程序 |
❌ |
请使用 MQTT.js 等 JS 实现 |
- HBuilderX:
^4.27(@UTSJS.keepAlive 需要)
- uni-app x:App-Android / App-iOS / App-HarmonyOS(含蒸汽模式)
快速开始
import {
connect, subscribe, publish, unsubscribe, disconnect, isConnected
} from '@/uni_modules/bin-mqtt'
// 1. 建立连接(重复调用:已连接直接 onConnected;连接中忽略)
connect({
url: 'tcp://mqtt.example.com:1883', // 或 wx://host:8083/mqtt、ssl://…、wss://…
clientId: 'user_xxx',
username: 'xxx',
password: 'xxx',
keepalive: 60,
cleanSession: true,
connectTimeout: 30,
reconnectInterval: 5000, // 0 关闭插件内自动重连
onConnected: () => {
// 首次与重连成功都会触发
subscribe({ topic: '/things/xxx/commands', qos: 1 })
},
onMessage: (topic, payload) => {
// payload 为 UTF-8 文本;对象请自行 JSON.parse
console.log(topic, payload)
},
onClosed: () => {
// 仅被动断开(网络错误 / 服务端关闭);主动 disconnect 不触发
},
onError: (errCode, errMsg) => {
uni.showToast({ title: errMsg, icon: 'none' })
},
onReconnect: (attempt) => {
// 重连尝试开始(attempt 从 1 起),不是重连成功
console.log('reconnect attempt', attempt)
}
})
// 2. 发布(对象请先 JSON.stringify)
publish({
topic: '/things/xxx/properties',
payload: JSON.stringify({ power: 1 }),
qos: 0,
retained: false,
onSuccess: () => {},
onFail: (errCode, errMsg) => {}
})
// 3. 取消订阅 / 断开
unsubscribe({ topic: '/things/xxx/commands' })
disconnect()
URL 约定
| scheme |
含义 |
tcp:// / mqtt:// |
原生 TCP |
ssl:// / mqtts:// |
TLS |
ws:// / wx:// |
WebSocket(wx 为 ws 的别名) |
wss:// |
安全 WebSocket(iOS WebSocket 需 iOS 13+) |
broker 开放 1883 时优先用 tcp://host:1883(比 WebSocket 更稳);仅开放 8083/443 时用 ws:// / wss://。
API
connect(options): void
建立连接并替换、释放此前的连接。void 返回 + @UTSJS.keepAlive,保证 onMessage 等持续回调不被回收。
| 参数 |
类型 |
默认 |
说明 |
url |
string |
必填 |
broker 地址,见上表 |
clientId |
string |
必填 |
同一 broker 上需唯一 |
username |
string? |
— |
账号 |
password |
string? |
— |
密码 |
keepalive |
number? |
60 |
心跳秒 |
cleanSession |
boolean? |
true |
是否 clean session |
connectTimeout |
number? |
30 |
连接超时秒 |
reconnectInterval |
number? |
5000 |
自动重连间隔毫秒;0/null 关闭 |
protocolVersion |
number? |
4 |
4=3.1.1,3=3.1 |
onConnected |
() => void |
— |
连接可用(含重连成功),主线程 |
onMessage |
(topic, payload) => void |
— |
收到已订阅主题消息,主线程持续触发 |
onClosed |
() => void |
— |
被动断开;主动 disconnect 不触发 |
onError |
(errCode, errMsg) => void |
— |
连接或传输层错误;errMsg 为中文可读描述 |
onReconnect |
(attempt) => void |
— |
自动重连尝试开始(attempt 从 1 起) |
subscribe(options): void
| 参数 |
类型 |
默认 |
说明 |
topic |
string |
必填 |
主题 |
qos |
number? |
1 |
0 | 1 | 2 |
onSuccess |
() => void |
— |
订阅成功 |
onFail |
(errCode, errMsg) => void |
— |
订阅失败 |
publish(options): void
| 参数 |
类型 |
默认 |
说明 |
topic |
string |
必填 |
主题 |
payload |
string |
必填 |
UTF-8 文本;对象请先 JSON.stringify |
qos |
number? |
0 |
0 | 1 | 2 |
retained |
boolean? |
false |
是否保留消息 |
onSuccess |
() => void |
— |
发布成功 |
onFail |
(errCode, errMsg) => void |
— |
发布失败 |
unsubscribe(options): void
| 参数 |
类型 |
说明 |
topic |
string |
主题 |
onSuccess / onFail |
function? |
结果回调 |
disconnect(): void
主动断开并释放客户端。幂等。不回调 onClosed。
isConnected(): boolean
当前是否已连接。
错误码
| 码 |
含义 |
| 9040001 |
URL 非法或协议不支持 |
| 9040002 |
连接失败 |
| 9040003 |
未连接 |
| 9040004 |
订阅失败 |
| 9040005 |
发布失败 |
| 9040006 |
取消订阅失败 |
| 9040007 |
会话忙 |
| 9040008 |
客户端内部错误 |
| 9040009 |
平台不支持 |
集成说明
Android
- 依赖经 Gradle maven 拉取
org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5,不要再往 libs/ 放同一 jar。
- 编译需能访问 Maven Central;标准基座可能不带 maven 产物,真机调试请用 自定义基座 / 云打包。
- 权限:
INTERNET、ACCESS_NETWORK_STATE、ACCESS_WIFI_STATE。
iOS
- 使用预编
Frameworks/*.xcframework(CocoaMQTT / MqttCocoaAsyncSocket / Starscream)。
- 不要改用
dependencies-pods(会丢 DCloudUTSFoundation)或 dependencies-spms(显式模块编不过 ObjC 包)。
- CocoaMQTT 2.1.6 固定 MQTT 3.1.1;
allowUntrustCACertificate 保持关闭(默认不信任任意 CA)。
- 非 TLS 地址(
tcp:// / ws://)需业务侧配置 NSAppTransportSecurity。
- 含
PrivacyInfo.xcprivacy(UserDefaults,无 Tracking)。
HarmonyOS
- 依赖 ohpm
@ohos/mqtt@2.0.18,云打包 / 真机需能拉取该包。
- 优先验证
tcp://(库为原生 so)。
行为约定
connect 重复调用:已连接直接 onConnected;连接中忽略。
- 主动
disconnect() 不回调 onClosed;被动断开会回调并按 reconnectInterval 自动重连。
- 持续回调在胶水层使用
@UTSJS.keepAlive(需 HBuilderX ≥ 4.27);请勿高频调用 connect。
onReconnect 表示「重连尝试开始」,不是重连成功;重连成功走 onConnected。
- payload 统一 UTF-8 字符串;非 UTF-8 时各端按实现回退。
最佳实践
- clientId 全局唯一(可拼用户 ID / 设备 ID / 随机后缀),避免互踢。
- 业务层做会话隔离:页面/模块各自订阅自己的 topic,关闭时
unsubscribe + 必要时 disconnect。
- 重连策略:简单场景用
reconnectInterval;需要指数退避、超限断开时传 reconnectInterval: 0,在业务层调度。
- 消息体建议 JSON 文本,插件不做解析,便于跨端一致。
开发文档