MQTT通信在JS中的实现

2023-11-19

MQTT协议(Message Queuing Telemetry Transport)消息队列遥测传输是由 IBM 发布的一种基于发布/订阅范式的“轻量级”消息协议,工作于TCP/IP协议族之上。
它是一种低开销,低带宽占用的即时通讯协议,可以用极少的代码和带宽的为连接远程设备提供实时可靠的消息服务,它适用于硬件性能低下的远程设备以及网络状况糟糕的环境下,由于这些特点,它可用于机器与机器之间的通信以及IoT(物联网)环境。
MQTT中有一些重要的概念,如:服务端,客户端,主题等。

MQTT服务端

MQTT 服务段也称为 Broker(消息代理),它可以是一个应用程序或一台设备,位于消息发布者 和订阅者之间

作用
  1. 接受客户端的网络连接请求
  2. 接受客户端发布的应用信息
  3. 处理来自客户端的订阅以及取消订阅请求
  4. 向订阅主题的客户端转发消息

MQTT客户端

一个使用 MQTT 协议的设备、应用程序等,它总是建立到服务器的网络连接

PS:一会就是实现的这一部分

作用
  1. 发布信息,其他客户端可以通过订阅主题来获取这些信息

发布信息的客户端本身也会收到该信息

  1. 订阅主题,获取其它客户端发布的消息
  2. 取消订阅,或删除消息

MQTT主题

连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。

即根据订阅的主题发布或获取消息

QoS(消息传递的服务质量水平)

服务质量,标志表明此主题范围内的消息传送到客户端所需的一致程度

  • 0:不可靠,消息基本上仅传送一次,如果当时客户端不可用,则会丢失该消息。
  • 1:消息应传送至少 1 次。
  • 2:消息仅传送一次。

JS实现MQTT客户端

这里我们使用第三方库MQTT.js,来创建。MQTT.js官网

  1. 首先在项目环境下安装MQTT.js
pnpm add mqtt
  1. 对将要创建的client进行配置
const options: IClientOptions = {
  connectTimeout: 4000, // 连接超时时间 
  reconnectPeriod: 1000,// 重连间隔
  clientId: "yl_client",// 客户端id,在服务端所呈现的名称
  protocol: "mqtt", // 协议
  host: "broker.emqx.io", // 服务器主机地址,这里是一个公共服务器地址
  port: 1883, // 端口号
}
  1. 根据上面的options创建客户端
const client = connect(options)
  1. 事件监听
    上面创建的client,提供了许多事件让我们监听,也就让我们可以在合适的时间做合适的事
  • connect: 连接成功时触发
  • message:client收到一个发布过来的 Payload 时触发
  • reconnect:重连时触发
  • error:client无法成功连接时或发生解析错误时触发
  • close:断开连接时触发
    这里我们先在connect时,来订阅我们的主题
// 定义一个mes用于发布
const MES = {
  mes: "hello MQTT",
}
client.on("connect", () => {
  console.log("Connected")
  // 订阅主题:多个或一个主题,回调在订阅成功后触发
  client.subscribe(["test"], () => {
    console.log(`Subscribe to topic '${"test"}'`)
  })
  // 向服务器推送消息:推送消息的主题,数据,qos配置,错误回调
  client.publish(
    "test",
    JSON.stringify(MES),
    { qos: 2 }, // 设置消息质量
    (error) => {
      if (error) {
        console.error(error)
      }
    }
  )
})

然后有消息时来处理服务端发过来的数据

// 监听事件:有消息时触发,回调第一个参数是主题,第二个参数是获取到的数据(buffer)
client.on("message", (topic, message) => {
  const mes_str = message.toString()
  let mes_json = JSON.parse(mes_str)
  console.log("来自主题:", topic)
  console.log("获取到消息:", mes_json)
})

这样做完之后,我们就可以收到主题test相关的消息了,下面是过了一段时间后的结果
在这里插入图片描述

结束语

这部分内容,是这会毕业设计要用到的东西,事发突然,大概也就是这些内容了吧
在这里插入图片描述

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

MQTT通信在JS中的实现 的相关文章

随机推荐

  • AngularJS学习之全局API(应用程序编程接口)

    1 AngularJS全局API用于执行常见任务的Javascript函数集合 比较对象 迭代对象 转换对象 2 全局API函数使用angularJS对象进行访问 以下是通用API函数 angular lowercase 转换字符串为小写
  • Unity用Vuforia做AR实现脱卡效果

    有时在识别目标丢失后我们仍希望虚拟物体能够出现在摄像机前 或者到一个特定的位置 我们能对其进行操作 这就是脱卡功能 自带的脱卡功能应该是ExtendedTracking 允许模型在识别图丢失的时候还存在 位置不变 在丢失的时候的位置 这样也
  • 用Python实现火车票查询(含票价版)

    用Python实现火车票查询 含票价版 写在前面 网上关于用Python3编写火车查询脚本的版本众多 我在前人的基础上编写了自己的这个版本 我觉得的写的这个版本有以下几个特色 1 智能引导输入 我一直比较喜欢这种方式 如果直接做成GUI的图
  • 基于分位数回归的门控循环单元QRGRU时间序列区间预测。(主要应用于风速,负荷,功率)包含评价指标R2,MAE,MBE,区间覆盖率,区间平均宽度。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 时间序列的单列数据 result xlsread 数据集 xlsx 数据分析 num samples
  • Sublime Text配置anaconda环境

    Ref https blog csdn net pptde article details 110791950 spm 1001 2101 3001 6661 1 utm medium distribute pc relevant t0 n
  • docker创建CentOS云主机(docker实践)

    基于Ubuntu操作系统 从零开始构建一套docker虚拟化平台 docker的产物为 容器 docker构建容器 Nginx WEB docker启动虚拟机 创建CentOS云主机 同样是容器 对之前内容的总结熟悉 要求 CentOS 7
  • Android实现裁剪

    Android自定义View实现图片缩放旋转移动裁剪 灰信网 软件开发博客聚合 freesion com SuppressLint AppCompatCustomView public class CorpToView extends Im
  • java前后端传递日期类型不一致的转换问题

    今天在做学生信息的展示时发现展示的日期和数据库中日期不同 本来最开始是用SimpleDateFormat进行转换的 但是转换之后的是字符串类型的 与date类型对不上 所以就上网查了一下 发现可以用 DateTimeFormat和 Json
  • 牛顿法

    牛顿法被称为牛顿 拉夫逊 Newton Raphson 方法 牛顿在17世纪提出用来求解方程的根 假设点x 位函数f x 的根 则f x 0 将函数f x 在点处进行一阶泰勒展开有 假设点为函数f x 的根 则有 那么可以得到 牛顿法通过迭
  • STM8的ADC的五种工作模式

    STM8的ADC的五种工作模式 STM8的ADC是10位的逐次比较型模拟数字转换器 多达16个多功能的输入通道 拥有5种转换模式 转换结束可产生中断 STM8 ADC的初始化顺序如下 1 AD输入通道对应的IO设置为上拉输入 2 配置AD参
  • JVM学习笔记(二)------Java代码编译和执行的整个过程

    http blog csdn net cutesource article details 5904542 Java代码编译是由Java源码编译器来完成 流程图如下所示 Java字节码的执行是由JVM执行引擎来完成 流程图如下所示 Java
  • JAVA实现二叉树的前、中、后序遍历(递归与非递归)

    最近在面试中遇到过问到二叉树后序遍历非递归实现的方法 之前以为会递归的解决就OK 看来还是太心存侥幸 在下一次面试之前 特地整理一下这个问题 首先二叉树的结构定义 java代码如下 public class Node private int
  • 花式获取ssl证书有效期

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pem是什么 二 读取pem证书有效期 1 命令读取 2 C C 读取 3 具体分析 总结 前言 在网络通信过程中 为了数据在传输过程中保持私密 就要用到
  • 数据结构与算法学习指南,可能是最适合新手的了!

    文章目录 先来聊聊学习数据结构与算法 数据结构与算法 听起来就难得不要不要的 数据结构与算法 到底该怎么学 通用性建议 如何学习编程知识 1 你需要的不是一个参考 2 不要钻牛角尖 3 一定要多交流 4 你得多动手 不是让你找人打架 那么针
  • 【java poi】向已存在的excel中追加数据

    1 Maven依赖
  • Mkdocs 存在任意文件读取漏洞

    文章目录 Mkdocs 存在任意文件读取漏洞 1 Mkdocs简介 2 漏洞描述 3 影响版本 4 fofa 查询语句 5 漏洞复现 6 POC EXP 7 整改意见 8 往期回顾 Mkdocs 存在任意文件读取漏洞 1 Mkdocs简介
  • java面向对象程序设计第三版耿祥义pdf_java基础知识干货——封装

    很多java初学者 在学到Java面向对象方面的知识点的时候 会觉得这块的知识点真的蛮绕的 一个知识点一个知识点的往外冒 对于初学者来说区分构造器和方法就花费了一整天的时间 现在小编带大家重新过一遍知识点 先背下来一个理念 面向对象程序设计
  • String格式问题:将String格式请求方法时,String格式突然转化为对象的问题

    String格式问题 将String格式请求方法时 String格式突然转化为对象的问题 如上图所示 在使用队列调用方法时传递的参数为 xxxxxx 但是在方法中接收到的参数为 id msg xxxxxx name java lang St
  • 【投资界学堂】创业者如何远程管理异地团队

    转自 http pe pedaily cn 201106 20110627214254 all shtml p1 摘要投资界6月27日消息 美国商业网站Under30CEO近日刊载文章 如何成功的远程管理团队 文章选摘了青年创业理事会提供的
  • MQTT通信在JS中的实现

    MQTT协议 Message Queuing Telemetry Transport 消息队列遥测传输是由 IBM 发布的一种基于发布 订阅范式的 轻量级 消息协议 工作于TCP IP协议族之上 它是一种低开销 低带宽占用的即时通讯协议 可