当前位置: 首页 > news >正文

更新原生小程序封装(新增缓存订阅)完美解决

import mqtt from '../utils/mqtt.min'let client = null
let topicCallbacks = {}    // 每个 topic 对应页面回调
let pendingSubscribes = [] // 连接前缓存订阅const options = {protocolVersion: 4,clean: true,reconnectPeriod: 1000,connectTimeout: 30 * 1000,resubscribe: true,clientId: 'wx_' + Math.random().toString(16).substr(2, 8),username: '',password: '',
}const mqttHost = ''const MQTT = {connect() {if (client && client.connected) returnclient = mqtt.connect(mqttHost, options)client.on('connect', () => {console.log('MQTT连接成功')// 重连后重新订阅所有 topicObject.keys(topicCallbacks).forEach(topic => {client.subscribe(topic)})// 处理连接前缓存的订阅pendingSubscribes.forEach(({ topic, callback }) => {topicCallbacks[topic] = callbackclient.subscribe(topic)})pendingSubscribes = []})client.on('message', (topic, message) => {const payload = message.toString()// 调用页面回调if (topicCallbacks[topic]) topicCallbacks[topic](payload)})client.on('error', (err) => console.error('MQTT连接失败', err))client.on('reconnect', () => console.log('正在重连...'))client.on('close', () => console.log('MQTT连接已断开'))},subscribe(topic, callback) {if (!client || !client.connected) {console.log('客户端未连接,缓存订阅', topic)pendingSubscribes.push({ topic, callback })return}topicCallbacks[topic] = callbackclient.subscribe(topic, { qos: 0 }, (err) => {if (!err) console.log(`已订阅:${topic}`)else console.error('订阅失败', err)})},unsubscribe(topic) {if (!client || !client.connected) returnclient.unsubscribe(topic, () => {delete topicCallbacks[topic]console.log(`取消订阅:${topic}`)})},publish(topic, message, qos = 0) {if (!client || !client.connected) {console.error('MQTT未连接,消息发布失败')return}// 保证消息是字符串const payload = typeof message === 'string' ? message : JSON.stringify(message)client.publish(topic, payload, { qos }, (err) => {if (err) console.error(`发布到 ${topic} 失败:`, err)else console.log(`消息已发布到 ${topic}:`, payload)})},end() {if (client) {client.end(true)   // true 表示强制断开,不等待未发送的消息client = nulltopicCallbacks = {}pendingSubscribes = []console.log('MQTT连接已断开')}},isConnected() {return !!(client && client.connected)},// 为兼容旧代码,disconnect 指向 enddisconnect() {this.end()}
}export default MQTT

app.js全局连接,onshow连接,onhide断联

   if (!MQTT.isConnected()) {// 需要恢复连接时调用MQTT.connect();}onHide(){MQTT.disconnect();console.log("全局hide");},

页面级别订阅和接受消息

   MQTT.subscribe(`${openIdtoc}`, (payload) => {console.log("解析后的数据11111111111111:", payload);try {} catch (err) {console.log("消息不是 JSON,原始内容:", payload);}})

http://www.dtcms.com/a/605185.html

相关文章:

  • 医疗小程序07设置默认卡
  • 培训机构如何利用小程序线上引流招生?培训机构小程序开发教程
  • 游戏助手|游戏攻略|基于SprinBoot+vue的游戏攻略系统小程序(源码+数据库+文档)
  • 基于开源AI智能名片链动2+1模式与S2B2C商城小程序的商家活动策略研究
  • iis能建设网站吗访问一个网站的过程
  • 株洲做网站哪家好网络推广哪个平台好
  • .net讲解
  • Temu欧洲站大规模下架,跨境卖家如何迎战合规风暴?
  • LMDeploy 在 Docker 容器中部署模型
  • MCU单片机,常用32位单片机,低功耗单片机MM32L系列
  • 今天,又聊了棋牌室、会议室和高尔夫...分享我的开发共享空间系统创业日记
  • vue项目配置可以让用户自己动态修改baseURL
  • GitPuk入门到精通 - 如何进行分支管理
  • MySQL 删除数据库指南
  • 常用网站开发工具详细分类与解析
  • 《Zephyr RTOS 深度学习指南与生成式AI结合方法探讨》 第七章:驱动与抽象篇
  • seo 网站改版简述网站建设优劣的评价标准
  • 有没有免费做企业网站的10黄页网站建设
  • 栈与队列入门:定义、操作及完整 C 语言实现教程
  • vue3 + antd + print-js 实现打印功能(含输出PDF)
  • 主动交互和情境感知,AI 硬件是脱离手机屏幕掌控的蓝海机会丨硬件和端侧模型专场@RTE2025 回顾
  • NeurIPS2025丨MIT提出自动化科学发现工具,AutoSciDACT对天文/物理/生物医学等异常数据强敏感
  • Java: 为PDF批量添加图片水印实用指南
  • 使用 Python 将 PDF 转换为 PNG
  • docker desktop 限制wsl使用内存空间
  • 学校网站的建设论文WordPress订阅下载插件
  • 内连接与隐式内连接:SQL连接的本质解析
  • 内存网盘 - Go语言实现的WebDAV内存文件系统
  • 【复习408】操作系统进程描述与控制详解
  • 实战1: worldskills3.vmem