更新记录

1.0.16(2026-06-25)

修复ios编译错误

1.0.13(2026-06-25)

增加ssl 链接

1.0.12(2026-01-14)

优化

查看更多

平台兼容性

uni-app(4.07)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
√ √ - - √ √ 5.0 √ √
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

uni-app x(4.07)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - 5.0 √ √ -

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
√ √ √ √

xtf-mqtt

Android、iOS、鸿蒙 App 端 MQTT 连接插件,支持普通 TCP、SSL/TLS、CA 证书、p12/pfx 客户端证书、client.crt + client.key 分离式客户端证书。

支持平台

平台 支持状态 说明
Android App 支持 基于 Eclipse Paho MQTT
iOS App 支持 基于 CocoaMQTT
鸿蒙 App 支持 基于 @ohos/mqtt
Web/H5 不支持 Web 端已移除,请使用 App 原生端
小程序 不支持 当前插件不提供小程序实现

安装与运行

  1. 下载插件到项目的 uni_modules/xtf-mqtt 目录。
  2. 在页面或业务模块中引入 MqttControl。
  3. Android/iOS 如使用原生依赖或三方 SDK,请制作并使用自定义基座。
  4. 鸿蒙端建议将项目放在纯英文、无空格路径下运行,避免鸿蒙工具链路径限制。
  5. 如果设备上安装过旧基座,建议先卸载旧基座后重新运行。

快速开始

import { MqttControl } from "@/uni_modules/xtf-mqtt"

const control: MqttControl = new MqttControl()

control.connect({
  host: "tcp://192.168.2.1:1883",
  clientId: "client_001",
  username: "admin",
  password: "password",
  cleanSession: true,
  automaticReconnect: true,
  keepAliveInterval: 60,
  connectionTimeout: 10,
  topic: ["demo/topic"] as string[],
  qos: [1] as number[],
  connectSuccess: function(res: boolean) {
    console.log("connectSuccess", res)
  },
  connectLost: function() {
    console.log("connectLost")
  },
  messageArrived: function(topic: string, msg: string) {
    console.log("messageArrived", topic, msg)
  },
  deliveryComplete: function() {
    console.log("deliveryComplete")
  }
})

SSL/TLS 连接

把 host 从 tcp://host:port 改为 ssl://host:port 即可启用 App 原生端 SSL/TLS 连接。

control.connect({
  host: "ssl://mqtt.example.com:8883",
  sslProtocol: "TLSv1.2",
  sslInsecure: false,
  clientId: "client_ssl_001",
  username: "admin",
  password: "password",
  cleanSession: true,
  automaticReconnect: true,
  connectSuccess: function(res: boolean) {
    console.log("ssl connect", res)
  }
})

单向证书认证

只需要校验服务端证书时,传入 CA 证书文件路径 sslCaCertPath。

control.connect({
  host: "ssl://mqtt.example.com:8883",
  sslProtocol: "TLSv1.2",
  sslInsecure: false,
  sslCaCertPath: "/static/certs/ca.crt",
  clientId: "client_ca_001"
})

双向证书认证 p12/pfx

三端都支持 p12/pfx 客户端证书。该方式兼容性最好,推荐优先使用。

control.connect({
  host: "ssl://mqtt.example.com:8883",
  sslProtocol: "TLSv1.2",
  sslInsecure: false,
  sslCaCertPath: "/static/certs/ca.crt",
  sslClientCertPath: "/static/certs/client.p12",
  sslClientKeyPassword: "123456",
  clientId: "client_p12_001"
})

双向证书认证 client.crt + client.key

三端字段保持一致,支持通过 sslClientCertPath 和 sslClientKeyPath 传入分离式客户端证书和私钥。

control.connect({
  host: "ssl://mqtt.example.com:8883",
  sslProtocol: "TLSv1.2",
  sslInsecure: false,
  sslCaCertPath: "/static/certs/ca.crt",
  sslClientCertPath: "/static/certs/client.crt",
  sslClientKeyPath: "/static/certs/client.key",
  clientId: "client_key_001"
})

证书文件路径

  • 推荐把证书放到项目 static/certs/ 目录,例如 /static/certs/ca.crt、/static/certs/client.p12。
  • Android、iOS、鸿蒙会自动把 /static/... 这类代码包文件转换为当前平台可读取的原生路径。
  • 如果证书是运行时下载的文件,请传入 App 可访问的本地文件路径。
  • 正式环境建议使用完整可信证书链,并保持 sslInsecure: false。

私钥格式说明

方式 Android iOS 鸿蒙
ca.crt 支持 支持 支持
client.p12 / client.pfx 支持 支持 支持
client.crt + client.key 支持 支持 支持
加密私钥文件 建议转 p12/pfx 建议转 p12/pfx 取决于 @ohos/mqtt 支持

client.key 建议使用未加密 RSA PEM 私钥。若私钥已加密,建议先转换为 client.p12 或 client.pfx 后使用。

API

connect(opt)

连接 MQTT 服务器。

control.connect(opt)

subscribe(topic, qos, callback)

订阅一个或多个主题。

control.subscribe(["demo/topic"] as string[], [1] as number[], function(res: boolean) {
  console.log("subscribe", res)
})

unsubscribe(topic, callback)

取消订阅指定主题。

control.unsubscribe("demo/topic", function(res: boolean) {
  console.log("unsubscribe", res)
})

publish(topic, msg, qos, retained)

发布消息。

control.publish("demo/topic", "hello", 1, false)

isConnected()

获取当前连接状态。

const connected = control.isConnected()

disconnect()

断开 MQTT 连接。

control.disconnect()

MqttOpt 参数

参数 类型 必填 说明
host string 是 原生端 MQTT 地址,普通连接用 tcp://host:port,SSL 用 ssl://host:port
webHost string 否 Web 端已移除,保留字段仅兼容旧配置
clientId string 是 MQTT 客户端 ID
username string 否 MQTT 用户名
password string 否 MQTT 密码
topic string[] 否 连接成功后自动订阅的主题列表
qos number[] 否 自动订阅主题对应的 QoS
cleanSession boolean 否 是否清理会话
automaticReconnect boolean 否 是否自动重连
keepAliveInterval number 否 心跳间隔,单位按平台 SDK 处理
connectionTimeout number 否 连接超时时间,单位按平台 SDK 处理
hexRecMsg boolean 否 接收消息是否返回十六进制字符串
willTopic string 否 遗嘱消息主题
willMsg string 否 遗嘱消息内容
willQos number 否 遗嘱消息 QoS
willRetain boolean 否 遗嘱消息是否保留
sslProtocol string 否 SSL/TLS 协议,推荐 TLS 或 TLSv1.2
sslInsecure boolean 否 是否跳过服务端证书校验,仅测试环境建议设为 true
sslCaCertPath string 否 CA 证书文件路径
sslClientCertPath string 否 客户端证书路径,支持 p12/pfx 或 client.crt
sslClientKeyPath string 否 客户端私钥路径,用于 client.crt + client.key 模式
sslClientKeyPassword string 否 p12/pfx 或私钥密码
connectSuccess (res:boolean)=>void 否 连接结果回调
connectLost ()=>void 否 连接断开回调
messageArrived (topic:string,msg:string)=>void 否 收到消息回调
deliveryComplete ()=>void 否 消息发送完成回调

注意事项

  • 本插件当前仅支持 Android、iOS、鸿蒙 App 端,不再提供 Web/H5 实现。
  • 使用 SSL 时,host 必须使用 ssl:// 协议头。
  • 使用自签名证书时,推荐传入 sslCaCertPath,不要在正式环境使用 sslInsecure: true。
  • Android/iOS 原生依赖和三方 SDK 需要自定义基座才能完整生效。
  • 鸿蒙端建议使用纯英文、无空格项目路径,避免工具链构建失败。
  • 三端双向认证优先推荐 p12/pfx,如需分离证书再使用 client.crt + client.key。

常见问题

为什么 Web/H5 不能用了?

浏览器不能直接连接原始 MQTT TCP/SSL 地址,只能使用 MQTT over WebSocket。本插件当前目标是 App 原生 MQTT 能力,因此已移除 Web 端。

sslInsecure 应该什么时候使用?

仅建议在测试环境临时使用,例如服务端使用自签名证书且暂时没有配置 CA 文件。正式环境应保持 sslInsecure: false 并传入可信 CA 证书或使用系统可信证书链。

双向认证推荐哪种证书格式?

推荐优先使用 client.p12 或 client.pfx,三端一致性最好。如果服务端证书体系要求分离文件,可以使用 client.crt + client.key。

开发文档

隐私、权限声明

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

<uses-permission android:name="android.permission.INTERNET"/>

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

无

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

无