更新记录

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 时各端按实现回退。

最佳实践

  1. clientId 全局唯一(可拼用户 ID / 设备 ID / 随机后缀),避免互踢。
  2. 业务层做会话隔离:页面/模块各自订阅自己的 topic,关闭时 unsubscribe + 必要时 disconnect。
  3. 重连策略:简单场景用 reconnectInterval;需要指数退避、超限断开时传 reconnectInterval: 0,在业务层调度。
  4. 消息体建议 JSON 文本,插件不做解析,便于跨端一致。

开发文档

隐私、权限声明

1. 本插件需要申请的系统权限列表:

android.permission.INTERNET;android.permission.ACCESS_NETWORK_STATE;android.permission.ACCESS_WIFI_STATE;iOS 无特殊权限(网络由 ATS 管理,非 TLS 地址需业务侧配置 NSAppTransportSecurity);ohos.permission.INTERNET

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集、不上传任何业务数据。仅按调用方传入的 broker 地址、clientId、账号与主题建立 MQTT 连接并透传报文;连接参数与消息内容由业务方自行保管。底层为开源协议客户端(Eclipse Paho / CocoaMQTT / @ohos/mqtt),无额外统计或追踪 SDK。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。