微信小程序集成和使用mqtt(同时支持uniapp和原生)

2023-10-27

前言

        在集成mqtt到小程序的开发过程中,确实走了不少弯路,下了许许多多的示例,一步步踩坑到现在终于完美解决了小程序引入mqtt的方法。该方法原生和uniapp均适用。

1. 小程序网页配置

先登录微信公众平台,找到开发》开发管理》开发设置页面

服务器域名配置中 配置socket合法域名为,mq消息服务器的域名。然后保存退出。

2.代码集成

1.新建mqtt文件夹,下载paho-mqtt.js,把这个js放在新建的文件夹下。

下载地址https://download.csdn.net/download/qq_35921773/33237463 

2.然后新建mqtt.js用来初始化自己的连接信息

把mqtt.js和paho-mqtt.js放在同级文件夹下。这样方便引入

let Paho = require('./paho-mqtt.js');
var mqtt = {};
//client对象
var client = null;
//mqtt连接对象
const mqttUrl = {
    hostname: "xxx.cn",
    port:8084,
    path: "/mqtt"
}

//订阅的主题与回掉方法
var map = new Map();

/**
 * mqtt 连接状态
 * 0:正在连接
 * 1:连接成功建立
 * 2:连接正在关闭
 * 3:连接已经关闭
 */
let connectStatus = 0;

//初始化weboscket
mqtt.initMqtt = () => {
    if (null == client) {
        //创建mqtt客户端
        client = new Paho.Client(mqttUrl.hostname, Number(mqttUrl.port), mqttUrl.path, 'wxapp_client_'+Math.random(),);
    } else {
        //Do-nothing
    }

    client.onConnected = (reconnect, uri) => {
        console.log("mqtt连接成功!client:", reconnect, uri);
        //连接成功
        connectStatus = 1;
        //注册全局的报警事件
    }

    client.onConnectionLost = (responseObject) => {
        console.log("mqtt连接关闭!", responseObject);
        if (responseObject.errorCode != 0) {
            //异常关闭
            mqtt.initMqtt();
        } else {
            //正常关闭连接
        }
        connectStatus = 3;
    }



    client.onMessageArrived = (message) => {
        //console.log("Message Recieved: [Topic: ", message.destinationName, ", Payload: ", message.payloadString, ", QoS: ", message.qos, ", Retained: ", message.retained, ", Duplicate: ", message.duplicate, "]");
        let topic = message.destinationName;
        //console.log("map:",map);
        try {
            let msgObj = {}
            new Promise((resolve, reject) => {/* executor函数 */
                msgObj = JSON.parse(message.payloadString);
                resolve(msgObj);
            }).catch(function (value) {
                console.log('JSON转化异常')
                return;
            });
            if(topic.indexOf('$SYS/brokers/')>-1){
                map.get('home')(topic,msgObj);
            }else if(topic.indexOf('/client')>-1){
                map.get('device')(topic,msgObj);
            }
        } catch (err) {
            console.error(err);
        }

    }


    var options = {
        invocationContext: {
            host: mqttUrl.hostname,
            port: mqttUrl.port,
            path: mqttUrl.path,
            clientId: 'wxapp_client_'+Math.random(),
        },
        //超时
        timeout: 5,
        //心跳
        keepAliveInterval: 60,
        //清除session,如果不清除,重连之后还能收到订阅的数据
        cleanSession: true,
        useSSL:true,
        reconnect: true,
        onSuccess: onConnect,
        onFailure: onFail
    };

    function onConnect(context) {
        console.log("mqtt连接成功context:", context)
        //连接成功
        connectStatus = 1;
    }

    function onFail(context) {
        console.log("mqtt连接失败onFail:", context)
        mqtt.initMqtt();
    }

    if (1 != connectStatus) {
        console.log("开始连接");
        client.connect(options);
        //正在建立连接
        connectStatus = 0;
    }


}


/**
 * 订阅主题
 * topic:主题名称
 * qos:服务质量
 */
mqtt.subscribe = function(topic, qos, receiveCallback) {
    if (1 == mqtt.getStatus()) {
        client.subscribe(topic, {
            qos: Number(qos)
        });
        if(topic.indexOf('$SYS/brokers/')>-1){
            map.set('home',receiveCallback);
        }else if(topic.indexOf('/client')>-1){
            map.set('device',receiveCallback);
        }
    } else {
        setTimeout(function() {
            mqtt.subscribe(topic, qos, receiveCallback);
        }, 1000)
    }
}

/**
 * 取消订阅主题
 * topic:主题名称
 */
mqtt.unsubscribe = function(topic) {
    if (1 == mqtt.getStatus()) {
        client.unsubscribe(topic, {
            onSuccess: unsubscribeSuccess,
            onFailure: unsubscribeFailure,
            invocationContext: {
                topic: topic
            }
        });
        map.delete(topic);
    } else {
        setTimeout(function() {
            mqtt.unsubscribe(topic);
        }, 1000)
    }
}

function unsubscribeSuccess(context) {
    console.log("取消订阅成功Topic:", context.invocationContext.topic);
}

function unsubscribeFailure(context) {
    console.log("取消订阅成功Topic:", context.invocationContext.topic);
    setTimeout(function() {
        mqtt.unsubscribe(context.invocationContext.topic);
    }, 1000)
}

/**
 * 发送消息
 * message:消息内容
 * topic:主题
 * qos:服务质量
 */
mqtt.publish = function(message, topic, qos) {
    if (1 == mqtt.getStatus()) {
        var message = new Paho.Message(message);
        message.destinationName = topic;
        message.qos = Number(qos);
        message.retained = false;
        client.send(message);
        wx.showToast({
            title: '发送成功'
        })
    } else {
        wx.showToast({
            title: '正在重新连接服务器,请稍后重试',
            icon: 'none',
            duration: 2000
        })
        setTimeout(function() {
            mqtt.publish(message, topic, qos);
        }, 1000)
    }
}


/**
 * 返回mqtt的连接状态
 */
mqtt.getStatus = function() {
    return connectStatus;
}



/**
 * 关闭连接
 */
mqtt.disconnect = function() {
    console.log("关闭mqtt连接");
    if (null != client) {
        client.disconnect();
    } else {
        //Do-nothing
    }
    connectStatus = 3;
    client = null;
}

mqtt.initMqtt();

export default mqtt;

3.页面使用

import mqtt from '../../common/utils/mqtt.js'
//指向刚才新建的mqtt.js

//onLoad初始化订阅
onLoad(option) {
   mqtt.subscribe('$SYS/brokers/+/clients/#', 0, this.receiveCallback); 
},

methods: {
    //收到消息后的回调
     receiveCallback(){
          console.log('addad')
     },
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序集成和使用mqtt(同时支持uniapp和原生) 的相关文章

  • 前台-vue3使用animate.css

    cnpm install animate css save main ts import animated from animate css app use router use animated as any mount app 页面使用
  • BES固件烧录说明

    BES固件烧录说明 准备工具 烧录前准备 烧录步骤 单线烧录 单线升级的硬件要求 单线升级的软件要求 单线升级工具界面 单线升级步骤 详细演示了BES各芯片平台固件烧录的方法 包含串口烧录和单线烧录升级 适用于目前发布的BES2300系列
  • react + ts 配置项目路劲别名(import的时候使用@符号报错)

    前言 项目开发的过程中 tsx 页面中 import 引入项目的时候 ts 文件报错 找不到模块 xxx xxx 或其相对应的类型声明 其原因主要是因为目前 ts 对 指向 src 的目录的提示是不支持的 vite默认也不支持 所以需要手动
  • 小程序优惠券内圆角

随机推荐

  • Java技术——Java中的static关键字解析

    0 前言 static是Java中的重要的一个点 也是面试的时候经常被问到的点 如果理解不够很容易给面试官语言基础不扎实的印象 本文从static方法 static内部类 static变量 以及static代码块四个角度分别解析static
  • NRF24L01模块----6通道通讯测试

    一 MCU与NRF24L01通讯 采用SPI通讯协议 速率最大为10M 与普通SPI元器件稍有不同的是 多了一个CE引脚 用来开启接收 发送 以及使器件进入待机模式 具体看IC DATASHEET说明 写寄存器指令格式为 1 SPI写寄存器
  • elementui 自定义loading动画加载层

    elementui 自定义loading动画加载层 main js中添加 import Loading from element ui 自定义加载层 Vue prototype openLoading function wer const
  • YOLOV8-网络结构

    代码下载链接 https download csdn net download weixin 40723264 88011324 一 整体网络 本文结合YOLOv5网络进行讲解 通过与YOLOv5网络进行比较 进一步理解YOLOv8 尽快上
  • Go语言学习笔记——jwt跨域鉴权

    文章目录 Golang jwt跨域鉴权 jwt介绍 JWT 到底是什么 JWT 和 OAuth 选择签名方法 签名方法和密钥类型 安装jwt 简单使用 生成JWT 解析jwt 测试 生成token并解析token jwt在项目中的使用 第一
  • Java学习 时间类 Period类与Duration类 / LocalDate类与Instant类 用法详解

    Java学习 时间类 Period类与Duration类 LocalDate类与Instant类 用法详解 前言 java 8 中引入的两个与日期相关的新类 Period 和 Duration 两个类看表示时间量或两个日期之间的差 两者之间
  • 交易日均千万订单的存储架构设计与实践

    一 订单系统概述 1 1 业务范围 服务业务线 快递 快运 中小件 大件 冷链 国际 B2B合同物流 CLPS 京喜 三入三出 采购入 退货入 调拨入 销售出 退供出 调拨出 等 1 2 订单中心价值 1 解耦 提升系统稳定性 原系统 交易
  • ERP现状及未来发展趋势分析?

    经过多年发展 ERP作为最重要的管理软件为国内外各类型企业所普遍接受 在我国 ERP行业已经进入成熟期 随着云计算 物联网等技术的推进 国内外竞争环境日益加剧 后ERP时代 表现出以下发展趋势 第一 商业智能化建设加强 经过多年运用 ERP
  • Linux下psql的使用(一):安装、建库、建表、数据载入、删除

    Linux下psql的使用 一 安装 建库 建表 数据载入 删除 一 Install PostgreSQL Database 安装Postgresql sudo apt get install postgresql 登录PostgreSQL
  • Java-类中代码块的使用

    Java 类中代码块的使用 1 概念 代码块 初始化块 代码块用来初始化类和对象 代码块如果有修饰的话 只能使用static 静态代码块和非静态代码块的区别 静态 内部可以有输出语句 随着类的加载而运行 初始化类的属性 一个类中定义了多个静
  • Java编程思想之《一切都是对象》理解

    前言 Java编程思想 中提到 Java是基于C 的 但相比之下 Java是一种 纯粹 的面向对象的程序设计语言 Java中不再使用指针来操作内存中的元素 而是采用对象的 引用 这个引用是作者提出的一种为了简化概念上的理解和C 语言的引用有
  • android 检查fragment是否已绑定到activity

    if isAdded 确定fragment是否绑定到Activity mPhotoRecyclerView adapter PhotoAdpter mItems
  • Linux初步入门学习 1

    一基础入门 command options partment1 partment2 命令 选项 参数1 参数2 cd 返回上一级目录 cd Desktop 进入桌面目录 cd usr bin 进入一般目录 ls 列出所有文件 lp line
  • 蓝桥杯大写变小写C语言,小写数字转化为大写数字(小米OJ题与蓝桥杯题)

    import java util public class Main public static void main String args Scanner scan new Scanner System in String str Str
  • Git本地仓库文件的创建、修改和删除

    目录 基本信息设置 1 设置用户名 2 设置用户名邮箱 Git仓库操作介绍 1 创建一个新的文件夹 2 在文件内初始化git仓库 创建git仓库 3 向仓库中添加文件 1 创建一个文件 2 将文件添加到暂存区 3 将暂存区添加到仓库 4 修
  • JavaScript贪心算法

    贪心算法 贪心算法有 霍夫曼编码 prim和kruskal最小生成树算法 Dijkstra最短路径算法 什么是贪心算法 1 针对一组数据 问题有限制值和期望值 希望从中选出几个数据 在满足限制值的情况下 期望值最大 2 每次选择当前情况下
  • UVA1601 The Morning after Halloween

    UVA1601 The Morning after Halloween 题目链接 做这道题的时候看到一个写的很好的代码 在这里保存下来 以便以后学习 题目分析 这道题和普通的bfs有所不同 解题方法也有些差别 主要是这里有三个移动的 小鬼
  • ant打包提示找不到文件解决办法

    运行ant打包时如果出现提示找不到tools目录下某些jar或者bat文件的错误 是因为新版android sdk目录结构产生了变化 原本在sdk tools目录下的文件被转移到sdk build tools 各个版本号文件夹中 需要复制里
  • matlab将数据输出到excel中,matlab数据输出为excel表格-如何把matlab中的数据导到excel表格中...

    如何将matlab工作空间的数据导出到excel 1 很简单的用xlswrite函数就可以了 首先打开matlab 输入你的代码 2 找到你要存放文件的位置复制绝对路径 致谢文件名的话就会存放在当前目录中 如图以f盘根目录为例 3 然后写x
  • 微信小程序集成和使用mqtt(同时支持uniapp和原生)

    前言 在集成mqtt到小程序的开发过程中 确实走了不少弯路 下了许许多多的示例 一步步踩坑到现在终于完美解决了小程序引入mqtt的方法 该方法原生和uniapp均适用 1 小程序网页配置 先登录微信公众平台 找到开发 开发管理 开发设置页面