返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JS 连接MQTT的使用方法
  • 344
分享到

JS 连接MQTT的使用方法

MQTT使用方法JS 连接MQTT 2023-01-28 06:01:38 344人浏览 八月长安
摘要

目录本文章是介绍 MQtt.js 的使用方法一、说明二、安装三、使用四、测试五、测试结果PS:关于mQtt.js报错 n.createConnection is not a func

本文章是介绍 mqtt.js 的使用方法

一、说明

  • 本文章使用的版本是 4.1.x ,没用最新版的原因是 4.2.x 以上版本会报错,具体报错可以查看文末介绍。
  • 使用的 4.1.x 版本地址:https://cdn.bootcdn.net/ajax/libs/mqtt/4.1.0/mqtt.min.js
  • 如果遇到 无法连接/错误提示 websocket connection to …… 的问题,请看我另一篇文章,其中记录了我多次用到,遇见的连接问题,点击查看。

二、安装

CDN 安装

<script src="Https://cdn.bootcdn.net/ajax/libs/mqtt/4.1.0/mqtt.min.js"></script>
<script>
  // 会在全局初始化一个 mqtt 变量,直接使用就可以
  console.log(mqtt)
</script>

npm 安装

npm install mqtt --save

npm 安装后使用

// 页面使用,直接 import 就可以
import mqtt from 'mqtt';

三、使用

常用方式 下面有详细介绍

// 连接地址,有很多连接失败都是因为地址没写对
const connectUrl = `ws://XXXX/mqtt/ws`;
// 客户端ID
const clientId = `mqtt_${Math.random().toString(16).slice(3)}`;
// 连接设置
let options = {
  clean: true,	// 保留会话
  connectTimeout: 4000,	// 超时时间
  reconnectPeriod: 1000,	// 重连时间间隔
  // 认证信息
  clientId,
  username: 'zhongketianji',
  passWord: 'zhongketianji123',
}
// 需要订阅的主题
const topic = '/mqtt_backend/fORMat_tracking/Uibox.car190';
const topic1 = '/mqtt_backend/format_tracking/Uibox.car191';

// 创建客户端
var client = mqtt.connect(connectUrl, options);

// 成功连接后触发的回调
client.on('connect', () => {
	console.log('已经连接成功');
	// 订阅主题,这里可以订阅多个主题
	client.subscribe([topic, topic1], () => {
		console.log(`订阅了主题 ${[topic, topic1].join('和')}`)
	})
});

// 当客户端收到一个发布过来的消息时触发回调

client.on('message', function (topic, message, packet) {
	// 这里有可能拿到的数据格式是Uint8Array格式,可以直接用toString转成字符串
	// let data = JSON.parse(message.toString());
	console.log("获取到的数据:", message)
	console.log("数据对应订阅主题:", topic)
	console.log("获取到的数据包:", packet)
});

// 关闭客户端(断开连接)
client.end();

// 发送信息给 topic(主题)
client.publish(topic, '这是给topic发送的信息');

options 连接设置(常用)

属性说明
keepalive单位为秒,数值类型,默认为 60 秒,设置为 0 时禁止。用于解决半连接问题,在该时间内是否接收两次传输
clientId默认为 ‘mqttjs_’ + Math.random().toString(16).substr(2, 8),可自定义修改,字符串类型
protocolVersionMQTT 协议版本号,默认为 4(v3.1.1)可以修改为 3(v3.1)和 5(v5.0)
clean是否清除会话,默认为 true。当设置为 true 时,断开连接后将清除会话,订阅过的 Topic 也将失效。当设置为 false 时,离线状态下也能收到 QoS 为 1 和 2 的消息
reconnectPeriod重连间隔时间,单位为毫秒,默认为 1000 毫秒,注意:当设置为 0 以后将取消自动重连
connectTimeout连接超时时长,收到 CONNACK 前的等待时间,单位为毫秒,默认 30000 毫秒
username认证用户名,如果 Broker 要求用户名认证的话,请设置该值
password认证密码,如果 Broker 要求密码认证的话,请设置该值
will遗嘱消息,一个可配置的对象值,当客户端非正常断开连接时,Broker 就会向遗嘱 Topic 里面发布一条消息。

will 格式:

will: {
    topic: 'WillMsg',	// 发布消息的主题
    payload: 'Connection Closed abnormally!',	// 要发布的消息
    qos: 0,		// 消息等级
    retain: false	// 保留消息标识
},

Client 监听 (on方法)

// 成功连接后触发的回调
client.on('connect', () => {
	console.log('已经连接成功');
});

// 当客户端收到一个发布过来的消息时触发回调

client.on('message', function (topic, message, packet) {
	// 这里有可能拿到的数据格式是Uint8Array格式,可以直接用toString转成字符串
	// let data = JSON.parse(message.toString());
	console.log("获取到的数据:", data_190)
	console.log("数据对应订阅主题:", topic)
	console.log("获取到的数据包:", packet)
});

// 当重新连接启动触发回调 
client.on('reconnect', () => {
    console.log("正在重新连接")
});

// 连接断开后触发的回调 
client.on("close",function () {
    console.log("已断开连接")
});

// 在收到 Broker(消息服务器) 发送过来的断开连接的报文时触发的回调,参数 packet 即为断开连接时接收到的报文。MQTT 5.0特性 
client.on("disconnect",function (packet) { 
    console.log("从broker接收到断开连接的报文:"+packet); 
});

// 客户端脱机下线触发回调 
client.on("offline",function () {
    console.log("您已断开连接,请检查网络")
});

// 当客户端无法成功连接时或发生解析错误时触发的回调,参数 error 为错误信息
client.on("error",(error) =>{
    console.log("客户端出现错误:", error);
});

//当客户端发送任何数据包时发出。这包括publish()以及MQTT用于管理订阅和连接的包 
client.on("packetsend",(packet)=>{
    console.log("客户端已发出报文", packet); 
});

//当客户端接收到任何报文时发出。这包括来自订阅主题的信息包以及MQTT用于管理订阅和连接的信息 
client.on("packetreceive",(packet)=>{
    // 会在 client.on('message', function (topic, message, packet) {}); 之前触发
    console.log("客户端接收报文", packet); 
});

Client 方法(除on方法)

向某一 topic(主题) 发布消息

Client.publish(topic, message, [options], [callback])

topic: 要发送的主题(字符串)
message: 要发送的主题的下的消息,可以是字符串或者是 Buffer
options: 可选值,发布消息时的配置信息,主要是设置发布消息时的 QoSRetain 值等。
callback: 发布消息后的回调函数,参数为 error,当发布失败时,该参数才存在

// 向 test 主题发送一条 QoS 为 0 的消息
client.publish('test', '这是一条信息', { qos: 0, retain: false }, function (error) {
  if (error) {
    console.log(error)
  } else {
    console.log('Published')
  }
})

订阅一个或者多个 topic(主题) 的方法(当连接成功后需要订阅主题来获取消息)

Client.subscribe(topic/topic array/topic object, [options], [callback])

topic: 可传入一个字符串,或者一个字符串数组,也可以是一个 topic 对象,例如:{‘test1’: {qos: 0}, ‘test2’: {qos: 1}}
options: 可选值,订阅 Topic 时的配置信息,主要是填写订阅的 TopicQoS 等级的
callback: 订阅 Topic 后的回调函数,参数为 errorgranted,当订阅失败时 error 参数才存在,granted 是一个 {topic, qos} 的数组,其中 topic 是一个被订阅的主题,qosTopic 是被授予的 QoS 等级

// 订阅一个名为 test 且 QoS 为 0 的 Topic
client.subscribe('test', { qos: 0 }, function (error, granted) {
  if (error) {
    console.log("订阅失败:", error)
  } else {
    console.log("已订阅:", granted[0].topic)
  }
})

取消订阅单个 topic(主题)或多个 topic(主题)

Client.unsubscribe(topic/topic array, [options], [callback])

topic: 可传入一个字符串或一个字符串数组
options: 可选值,取消订阅时的配置信息
callback: 取消订阅时的回调函数,参数为 error,当取消订阅失败时 error 参数才存在

// 取消订阅名为 test 的 Topic
client.unsubscribe('test', function (error) {
  if (error) {
    console.log(error)
  } else {
    console.log('已取消订阅')
  }
})

关闭客户端

Client.end([force], [options], [callback])

force: 设置为 true 时将立即关闭客户端,而无需等待断开连接的消息被接受。这个参数是可选的,默认为 false注意: 使用该值为 true 时,Broker 无法接收到 disconnect 的报文
options: 可选值,关闭客户端时的配置信息,主要是可以配置 reasonCode,断开连接时的 Reason Code
callback: 当客户端关闭时的回调函数

client.end();

四、测试

EMQX 提供的 免费公共 MQTT 服务器,该服务基于 EMQX 的 MQTT 物联网云平台 创建。
服务器接入信息如下:

Broker: broker.emqx.io
TCP Port: 1883
Websocket Port: 8083

const connectUrl = `ws://broker.emqx.io:8083/mqtt`;

client = mqtt.connect(connectUrl, {
  clean: true,
  connectTimeout: 4000,
  reconnectPeriod: 1000,
  clientId: 'emqx_test',
  username: 'emqx_test',
  password: 'emqx_test'
})

// 需要订阅的主题
const topic = 'test';

//成功连接后触发的回调
client.on('connect', () => {
  console.log('已经连接成功');
  // 这里可以订阅多个主题
  client.subscribe([topic], () => {
    console.log(`订阅了主题 ${topic}`)
  })
});

// 当客户端收到一个发布过来的消息时触发回调
client.on('message', function (message) {
  // 这里有可能拿到的数据格式是Uint8Array格式,所以可以直接用toString转成字符串
  // let data = JSON.parse(message.toString());
  console.log("返回的数据:", message)
});

// 连接断开后触发的回调
client.on("close", function () {
  console.log("已断开连接")
});

五、测试结果

在这里插入图片描述

PS:关于mqtt.js报错 n.createConnection is not a function

在这里插入图片描述

原因: 这个是版本问题,4.2.x 以上(目前我使用最新版也是这个问题,可能后续会改进)

解决方案: 使用低版本的,我用的4.1.x就可以。(后面有CDN地址)

这里是连接成功后输出了一下client。

在这里插入图片描述

Vue的解决方案:
看网上其他的说vue安装,不仅需要修改版本,还需要将版本前面的^去掉(packpage.json里),不过没用vue测试,大家可以试试(这里截了一张其他博客的图)

在这里插入图片描述

这里可以选择版本:https://www.bootcdn.cn/mqtt/

我用的地址:https://cdn.bootcdn.net/ajax/libs/mqtt/4.1.0/mqtt.min.js

到此这篇关于JS 连接MQTT的使用方法的文章就介绍到这了,更多相关MQTT使用方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JS 连接MQTT的使用方法

本文链接: https://lsjlt.com/news/178130.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JS 连接MQTT的使用方法
    目录本文章是介绍 mqtt.js 的使用方法一、说明二、安装三、使用四、测试五、测试结果PS:关于mqtt.js报错 n.createConnection is not a func...
    99+
    2023-01-28
    MQTT使用方法 JS 连接MQTT
  • 在Django中使用MQTT的方法
    安装MQTT Python环境下安装MQTT也很简单,需要注意的就是不要输错命令 在Python3环境下安装Python MQTT的命令是: pip3 install pah...
    99+
    2024-04-02
  • C++连接使用MySQL的方法
    C++连接使用MySQL,供大家参考,具体内容如下 定义MySQLCon类 class MySQLCon { MYSQL mysql; public: int errornum; string errort...
    99+
    2022-05-16
    C++ mysql
  • 在Django中如何使用MQTT的方法
    这篇文章主要介绍了在Django中如何使用MQTT的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。安装MQTTPython环境下安装MQTT也很简单,需要注意的就是不要输...
    99+
    2023-06-15
  • ESP-01S烧录及使用,连接本地MQTT服务器
    网上的教程大多无法正常烧录与使用,因此在这里进行总结。 1 ESP-01S烧录 固件烧录建议使用专用的烧录器,十分省心。 本文讨论的是使用普通的CH340串口模块进行烧写。 必须使用的工具:杜邦线、CH340串口模块、另外一块有3V3电源和...
    99+
    2023-08-18
    服务器 运维
  • js中matchAll()方法的使用方法
    本篇内容介绍了“js中matchAll()方法的使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明matchAll()方法返回一个包...
    99+
    2023-06-20
  • vue3+vite2+mqtt连接遇到的坑及解决
    目录vue3+vite2+mqtt连接遇到的坑vue3调用mqtt问题总结vue3+vite2+mqtt连接遇到的坑 从vue2版本整合到vue3版本遇到的坑,其实也是自己不够熟悉,...
    99+
    2023-05-17
    vue3 vite2的坑 vite2 mqtt的坑 vue3 vite2 mqtt的坑
  • C#使用OleDbConnection连接读取Excel的方法
    使用C#连接读取Excel的方法需要使用`OleDbConnection`类。首先需要在项目中引用`System.Data.OleD...
    99+
    2023-08-09
    C#
  • JS、HTML、Web端怎么使用MQTT通讯测试
    本文小编为大家详细介绍“JS、HTML、Web端怎么使用MQTT通讯测试”,内容详细,步骤清晰,细节处理妥当,希望这篇“JS、HTML、Web端怎么使用MQTT通讯测试”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-06
  • php直接调用js的方法名
    PHP作为一种非常流行的后端语言,被广泛用于构建各种类型的网站和应用程序。与此同时,JavaScript作为一种前端语言,被广泛用于交互式 Web 界面的开发。在许多情况下,开发人员需要通过PHP直接调用 JavaScript函数。在本篇文...
    99+
    2023-05-14
    php
  • html里js的使用方法
    小编给大家分享一下html里js的使用方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!html里js的使用方法:1、在HTML中使用【<script>...
    99+
    2023-06-06
  • js中arguments的使用方法
    本篇内容主要讲解“js中arguments的使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js中arguments的使用方法”吧!说明当不确定传递了多少参数时,可以使用arguments...
    99+
    2023-06-20
  • js中repeat()的使用方法
    本篇内容介绍了“js中repeat()的使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、返回一个新字符串,表示将原字符串重复n次。...
    99+
    2023-06-20
  • js中Array.filter()方法的使用
    这篇文章主要讲解了“js中Array.filter()方法的使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“js中Array.filter()方法的使用”吧!1、用filter()方法返回...
    99+
    2023-06-20
  • JS中Object.assign方法的使用
    最在做项目过程中,大量的使用了Object.assign方法,发现这个还是挺好使用的,现在总结下Object.assign的基本使用。 一、基本语法 Object.assign(ta...
    99+
    2024-04-02
  • 使用navicat连接数据库的操作方法
    小编给大家分享一下使用navicat连接数据库的操作方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  无论是本机安装的MyS...
    99+
    2024-04-02
  • 使用JDBC连接数据库的方法步骤
    这篇文章主要讲解了“使用JDBC连接数据库的方法步骤”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“使用JDBC连接数据库的方法步骤”吧!JDBC简介  JD...
    99+
    2024-04-02
  • 教你使用MySQLShell连接数据库的方法
    目录一、下载MySQL Shell二、配置运行环境三、连接MySQL数据库在有些情况下我们需要使用命令行方式连接MySQL数据库,这时可以使用MySQL官方提供的命令行工具MySQL...
    99+
    2024-04-02
  • 使用Dbeaver远程连接Hive的详细方法
    目录0. Linux上Hive1. 下载DBeaver2. 驱动包3. 建立链接,测试0. Linux上Hive 启动Hadoop 启动Hive sh hive --service ...
    99+
    2024-04-02
  • ADO.NET连接池的原理及其使用方法
    本篇内容主要讲解“ADO.NET连接池的原理及其使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ADO.NET连接池的原理及其使用方法”吧!不要关闭数据库中所有的连接,至少保证ADO.NE...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作