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

这篇具有很好参考价值的文章主要介绍了微信小程序集成和使用mqtt(同时支持uniapp和原生)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

1. 小程序网页配置

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

uniapp mqtt,微信小程序,uni-app,小程序

 

服务器域名配置中 配置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')
     },
}

 内外网切换BAT脚本

1. 切换内网脚本

uniapp mqtt,微信小程序,uni-app,小程序

BAT脚本设置IP、子网掩码、网关、DNS

@echo off
cls
color 0A
Echo *******************************************************************************
Echo           正在修改IP地址和DNS服务器地址,请耐心等待…………
Echo *******************************************************************************
cmd /c netsh interface ip set address name="以太网" source=static addr=27.195.110.187 mask=255.255.255.0 gateway=27.195.110.254 gwmetric=1
cmd /c netsh interface ip set dns "以太网" static 26.195.232.1 primary
ipconfig /all
Echo *******************************************************************************
Echo          OK!!已修改成功!请按任意键继续…………
Echo *******************************************************************************

2. 切换外网脚本(IP自动获取)

@echo off
cls
color 0A
Echo *******************************************************************************
Echo           正在修改IP地址和DNS服务器地址,请耐心等待…………
Echo *******************************************************************************
netsh interface ip set address name="以太网 4" source=dhcp
netsh interface ip delete dns "以太网 4" all
ipconfig /flushdns
ipconfig /all
Echo *******************************************************************************
Echo          OK!!已修改成功!请按任意键继续…………
Echo *******************************************************************************

 文章来源地址https://www.toymoban.com/news/detail-729148.html

到了这里,关于微信小程序集成和使用mqtt(同时支持uniapp和原生)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序使用MQTT的小例子

    本文章大部分内容来自MQTT官方教程,有需要的可以去MQTT官网查看,这里只分享一下自己的使用过程。谢谢大家观看! 首先我们使用微信开发者工具创建一个空项目。 不使用云开发,不使用模板。 然后我们去MQTT网址,或者下方链接下载mqtt.mini.js 这个可以下载mqtt.mini.js http

    2024年04月13日
    浏览(24)
  • 采用uniapp实现的银行卡卡片, 支持H5和微信小程序

    采用uniapp-vue3实现的银行卡卡片 支持H5、微信小程序(其他小程序未测试过,可自行尝试) 可用于参考学习 可到插件市场下载尝试: https://ext.dcloud.net.cn/plugin?id=16736 使用示例

    2024年02月22日
    浏览(45)
  • 微信小程序使用mqtt开发可以,真机不行

    以下可以解决我的问题,请一步一步跟着做,有可能版本不一样就失败了 前往蓝奏云 https://wwue.lanzouo.com/iQPdc1k50hpe 下载好后将.txt改为.js 然后放入项目里 emqx官网 需要有ssl证书 注意,每一步都是有用的哦,如果你的不行,那么就原样复制一下

    2024年02月02日
    浏览(29)
  • uniapp 发送全文件 支持App端ios、android,微信小程序,H5

    由于uniapp提供的API在app端只能上传图片和视频,不能上传其他文件,说以只能借助插件了。  ios端用的这个插件 获取到文件对象 免费的 ios-uniapp 文件选取word,pdf,xls等文件 - DCloud 插件市场 uniapp iOS文件选取 iOS选取text,pdf,word,doc,xls,ppt https://ext.dcloud.net.cn/plugin?id=1311 这个是返回一

    2024年02月16日
    浏览(32)
  • 解决uniapp编译的微信小程序不支持v-bind=“$attrs“

    原生组件无法支持v-bind;用户自定义组件以及第三方扩展组件才支持v-bind v-model属性 在高版本的vue3+vite中使用父组件传递下来的props中的某一个属性,作为当前组件的子组件的v-model入参,那么将会报错 [vite] [plugin:vite:vue] v-model cannot be used on a prop, because local prop bindings are not wr

    2024年02月08日
    浏览(33)
  • 开源若依+uniapp商城支持微信小程序/H5/微信支付/商品管理/订单管理/会员管理

    开源若依+uniapp商城介绍支持微信小程序/H5/微信支付/商品管理/订单管理/会员管理 建议两倍速度观看!!! 访问地址:https://mall.ichengle.top/ 源码地址:https://gitee.com/zccbbg/RuoYi-Mall 若依(Ruoyi)是一个基于Java开发的快速开发脚手架(框架),旨在帮助开发者更轻松地构建企业级

    2024年02月07日
    浏览(36)
  • uniapp项目编译成H5后跳转到微信小程序(支持微信扫码、支付宝扫码)

    uniapp项目编译成 H5 后跳转到 微信小程序 (支持微信H5、支付宝H5) 场景:1、微信扫码跳转到该H5中后点击某事件(或者不点击直接跳转)需要跳转到微信小程序;2、支付宝扫码跳转到H5中后点击某事件(或者不点击直接跳转)需要跳转到微信小程序 思路:调用后端接口返回

    2024年02月13日
    浏览(33)
  • uniapp微信小程序 图片&文件上传并且支持图片和文件预览(pdf等文件预览)巨细教学!

    首先呢,小程序打开pdf等文件有下面几种办法: 用微信自带的wx.downloadFile() + wx.openDocument() 使用web-view,uni-app中webview可以直接加载pdf文件 可以使用网上说的pdf.js去实现(我没有用到这个,就不介绍了) 网上查到很多资料显示安卓是可以通过上面第一种办法,但是ios用第一个

    2024年02月04日
    浏览(41)
  • MQTT通讯-使用EMQX将ESP8266与微信小程序通讯

    MQTT MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅范式的“轻量级”消息协议,由IBM发布。MQTT可以在TCP/IP协议族上工作,并且是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。因此,MQTT协议适用于硬件性能低下的远程设备以及

    2024年04月14日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包