更新记录
v0.0.1(2026-04-05) 下载此版本
uni-mqtt-lite
一个基于 UniApp WebSocket 的轻量级 MQTT 3.1.1 客户端插件。
适用于 UniApp / Vue3 项目,支持连接、订阅、发布、断开、自动重连、自动恢复订阅等基础能力。
特性
- 基于
uni.connectSocket实现,适配 UniApp 多端环境 - 无第三方依赖,包体轻量
- 支持 MQTT 3.1.1
- 支持 QoS 0 / QoS 1
- 支持自动重连
- 支持重连后恢复订阅
- 支持字符串 / JSON / Uint8Array / ArrayBuffer 消息发布
- 提供事件监听机制,方便页面状态同步
平台兼容性
uni-app(5.05)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | - | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
UniApp MQTT 客户端插件
基于 UniApp WebSocket 实现的 MQTT 3.1.1 协议客户端,轻量、无依赖、支持多实例。
平台支持
| 平台 | 支持情况 |
|---|---|
| H5 | ✅ 支持 |
| Android | ✅ 支持 |
| iOS | ✅ 支持 |
| 微信小程序 | ✅ 支持 |
| 其他小程序 | ✅ 支持(需 WebSocket 支持) |
特性
- 🚀 轻量无依赖 - 体积约 15KB,无第三方依赖
- 🔌 多实例支持 - 可同时连接多个不同的 MQTT Broker
- 🔄 自动重连 - 支持断线自动重连,可配置重连间隔
- 📡 订阅恢复 - 重连后智能恢复订阅(根据 sessionPresent 判断)
- ⏱️ 超时保护 - 订阅、发布、取消订阅均有超时机制
- 🛡️ 异常容错 - 报文解析异常不会导致消息循环崩溃
- ⚙️ 灵活配置 - 支持自定义 WebSocket 子协议、超时时间等
安装
将 utils/mqtt 目录复制到你的 UniApp 项目中:
your-project/
└── utils/
└── mqtt/
├── index.js # 核心模块
├── config.js # 配置文件
├── codec.js # 编解码模块
└── packets.js # 报文构建模块
快速开始
基础用法
<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
import mqttService from '@/utils/mqtt'
const status = ref('disconnected')
function onMessage(data) {
console.log('收到消息:', data.topic, data.payloadText)
}
onMounted(async () => {
mqttService.on('message', onMessage)
await mqttService.connect({
url: 'wss://your-broker:8084/mqtt',
username: 'your-username',
password: 'your-password'
})
await mqttService.subscribe('test/#')
await mqttService.publish('test/hello', 'Hello MQTT')
})
onUnmounted(() => {
mqttService.off('message', onMessage)
mqttService.disconnect()
})
</script>
多实例用法
import { createMqttClient } from '@/utils/mqtt'
const client1 = createMqttClient()
const client2 = createMqttClient()
await client1.connect({
url: 'wss://broker1.example.com:8084/mqtt',
username: 'user1',
password: 'pass1'
})
await client2.connect({
url: 'wss://broker2.example.com:8084/mqtt',
username: 'user2',
password: 'pass2'
})
client1.destroy()
client2.destroy()
API 文档
导出方式
import mqttService, { UniMqttClient, createMqttClient } from '@/utils/mqtt'
const client1 = mqttService
const client2 = createMqttClient()
const client3 = new UniMqttClient()
配置项
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| url | string | '' | WebSocket MQTT 服务器地址(必填) |
| username | string | '' | 用户名 |
| password | string | '' | 密码 |
| clientId | string | '' | 客户端ID,为空时自动生成 |
| keepAlive | number | 60 | 心跳间隔(秒) |
| cleanSession | boolean | true | 是否清除会话 |
| connectTimeout | number | 10000 | 连接超时(毫秒) |
| reconnectPeriod | number | 5000 | 重连间隔(毫秒) |
| requestTimeout | number | 10000 | 请求超时(毫秒) |
| autoReconnect | boolean | true | 是否自动重连 |
| resubscribe | boolean | true | 重连后是否恢复订阅 |
| wsProtocols | string[] | null | null | WebSocket 子协议 |
方法
connect(config)
连接到 MQTT 服务器。
await mqttService.connect({
url: 'wss://broker:8084/mqtt',
username: 'user',
password: 'pass',
wsProtocols: ['mqtt']
})
subscribe(topic, options)
订阅主题。
const result = await mqttService.subscribe('test/#', { qos: 0 })
console.log(result)
unsubscribe(topic)
取消订阅。
await mqttService.unsubscribe('test/#')
publish(topic, message, options)
发布消息。支持字符串、对象、Uint8Array、ArrayBuffer。
await mqttService.publish('test/msg', 'Hello', { qos: 0 })
await mqttService.publish('test/msg', { foo: 'bar' }, { qos: 1 })
await mqttService.publish('test/binary', new Uint8Array([1, 2, 3]))
disconnect()
断开连接。
await mqttService.disconnect()
destroy()
销毁实例,释放所有资源。
mqttService.destroy()
getStatus()
获取当前状态。
const status = mqttService.getStatus()
isConnected()
检查是否已连接。
if (mqttService.isConnected()) {
}
getClientId()
获取客户端 ID。
const clientId = mqttService.getClientId()
事件
| 事件名 | 参数 | 说明 |
|---|---|---|
| status | string | 状态变化 |
| connect | { sessionPresent, clientId } | 连接成功 |
| message | { topic, qos, retain, dup, packetId, payloadText, payloadJson, payloadBytes } | 收到消息 |
| error | Error | 发生错误 |
| reconnect | { delay } | 开始重连 |
| close | Object | 连接关闭 |
| pingresp | boolean | 心跳响应 |
mqttService.on('message', (data) => {
console.log('主题:', data.topic)
console.log('文本:', data.payloadText)
console.log('JSON:', data.payloadJson)
console.log('字节:', data.payloadBytes)
})
mqttService.off('message', handler)
状态说明
| 状态 | 说明 |
|---|---|
| disconnected | 未连接 |
| connecting | 连接中 |
| connected | 已连接 |
| reconnecting | 重连中 |
重连机制
自动重连
当 autoReconnect: true 时,连接意外断开后会自动重连:
- 触发
reconnect事件 - 等待
reconnectPeriod毫秒 - 重新建立连接
订阅恢复
重连成功后是否恢复订阅的逻辑:
| cleanSession | sessionPresent | 是否恢复订阅 |
|---|---|---|
| true | - | ✅ 是 |
| false | false | ✅ 是 |
| false | true | ❌ 否(broker 已保存) |
QoS 支持
| QoS 级别 | 发布 | 订阅 | 说明 |
|---|---|---|---|
| 0 | ✅ | ✅ | 最多一次 |
| 1 | ✅ | ✅ | 至少一次 |
| 2 | ❌ | ✅ | 恰好一次(仅接收) |
超时机制
以下操作有超时保护:
- 连接:
connectTimeout(默认 10s) - 订阅:
requestTimeout(默认 10s) - 取消订阅:
requestTimeout(默认 10s) - QoS 1 发布:
requestTimeout(默认 10s)
超时后会 reject Promise,错误信息包含超时时长。
注意事项
- 协议版本:当前仅支持 MQTT 3.1.1
- QoS 限制:发布消息仅支持 QoS 0 和 QoS 1
- WebSocket:必须使用 WebSocket 协议,地址格式为
wss://host:port/mqtt - 安全提示:请勿在代码中硬编码账号密码,建议从服务端获取
常见问题
1. 连接失败
- 检查服务器地址是否正确(需以
ws://或wss://开头) - 检查用户名密码是否正确
- 检查网络是否通畅
- 检查
wsProtocols配置是否与服务器要求一致
2. 订阅无消息
- 检查订阅主题是否正确
- 检查发布者是否向该主题发布了消息
- 检查消息是否被其他客户端消费(非共享订阅)
3. 频繁重连
- 检查
keepAlive设置是否合理 - 检查网络稳定性
- 检查服务器是否主动断开连接
更新日志
v1.0.0
- 支持 MQTT 3.1.1 协议
- 支持多实例
- 支持自动重连
- 支持订阅恢复
- 支持超时机制
- 支持异常容错
许可证
MIT License

收藏人数:
下载插件并导入HBuilderX
下载插件ZIP
赞赏(0)
下载 4
赞赏 0
下载 11468407
赞赏 1902
赞赏
京公网安备:11010802035340号