广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >MQTT.js入门使用教程
  • 795
分享到

MQTT.js入门使用教程

MQTT.js入门MQTT.js入门教程MQTT.js使用 2023-05-16 11:05:28 795人浏览 泡泡鱼
摘要

目录简介安装使用 npm 或 yarn 安装使用 CDN 安装全局安装使用简单例子命令行api 介绍MQtt.connect([url], options)Client 事件Clie

简介

MQtT.js 是一个开源的 MQTT 协议的客户端库,使用 javascript 编写,主要用于 node.js 和 浏览器环境中。是目前 JavaScript 生态中使用最为广泛的 MQTT 客户端库。

MQTT 是一种基于发布/订阅模式的轻量级物联网消息传输协议,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。

由于 JavaScript 单线程特性,MQTT.js 是全异步 MQTT 客户端,MQTT.js 支持 MQTT/tcp、MQTT/TLS、MQTT/websocket,在不同运行环境支持的度如下:

注意:不同环境里除了少部分连接参数不同,其他 API 均是相同的。且在 MQTT.js v3.0.0 及以上版本后,已经完整支持到 MQTT 5.0。

安装

使用 npm 或 yarn 安装

npm install mqtt --save

# 或使用 yarn

yarn add mqtt

注意:如果您的 Node 环境是 v12 或 v14 及以上版本,请使用 MQTT.js 4.0.0 及以上版本

使用 CDN 安装

浏览器环境中,我们还可以使用 CDN 的方式引入 MQTT.js。MQTT.js 的 bundle 包通过 Http://unpkg.com 管理,我们可以直接添加 unpkg.com/mqtt/dist/mqtt.min.js 来进行使用。

<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
<script>
  // 将在全局初始化一个 mqtt 变量
  console.log(mqtt)
</script>

全局安装

除了上述的安装方式外,MQTT.js 还提供了全局安装的方式,使用命令行工具来完成 MQTT 的连接、发布和订阅等。

npm install mqtt -g

我们会在下文中的一些使用教程中详细描述如何使用 MQTT.js 的命令行工具。

使用

本文将使用 EMQX Cloud 提供的 免费公共 MQTT 服务器 作为本次测试的 MQTT 服务器地址,服务器接入信息如下:

  • Broker: broker.emqx.io
  • TCP Port: 1883
  • SSL/TLS Port: 8883

更多详情请访问 EMQX Cloud 官网,或查看 EMQX Cloud 文档。

简单例子

我们简单编写一段代码实现连接到 EMQX Cloud 并完成订阅主题、收发消息的简单例子。因为在浏览器环境中仅支持使用 WebSocket 连接,所以我们将使用在浏览器环境和 Node.js 环境两种不同的连接参数来完成连接。不过除连接地址外,其它参数均是相同的,因此读者可根据自己的实际情况选择使用。

const mqtt = require('mqtt')


const url = 'ws://broker.emqx.io:8083/mqtt'

// const url = 'mqtt://broker.emqx.io:1883'

// 创建客户端实例
const options = {
  // Clean session
  clean: true,
  connectTimeout: 4000,
  // 认证信息
  clientId: 'emqx_test',
  username: 'emqx_test',
  passWord: 'emqx_test',
}
const client = mqtt.connect(url, options)
client.on('connect', function () {
  console.log('Connected')
  // 订阅主题
  client.subscribe('test', function (err) {
    if (!err) {
      // 发布消息
      client.publish('test', 'Hello mqtt')
    }
  })
})

// 接收消息
client.on('message', function (topic, message) {
  // message is Buffer
  console.log(message.toString())
  client.end()
})

命令行

在全局安装完 MQTT.js 后,我们同样可以使用命令行工具来完成主题订阅消息发布接收的动作。

示例连接到 broker.emqx.io 并订阅 testtopic/# 主题:

mqtt sub -t 'testtopic/#' -h 'broker.emqx.io' -v

示例连接到 broker.emqx.io 并向 testtopic/hello 主题发送消息

mqtt pub -t 'testtopic/hello' -h 'broker.emqx.io' -m 'from MQTT.js'

如需使用功能更加全面的 MQTT 命令行工具,可参考使用 MQTT X CLI。

API 介绍

mqtt.connect([url], options)

连接到指定的 MQTT Broker 的函数,并始终返回一个 Client 对象。第一个参数传入一个 URL 值,URL 可以是以下协议:mqttmqttstcptlswswss。URL 也可以是一个由 URL.parse() 返回的对象。然后再传入一个 Options 对象,用于配置 MQTT 连接时的选项。当使用 WebSocket 连接时需要注意地址后是否需要加上一个 path,例如 /mqtt

下面列举一些常用的 Options 对象中的属性值:

  • Options

    • keepalive: 单位为,数值类型,默认为 60 秒,设置为 0 时禁止
    • clientId: 默认为 'mqttjs_' + Math.random().toString(16).substr(2, 8),可以支持自定义修改的字符串
    • protocolVersion: MQTT 协议版本号,默认为 4(v3.1.1)可以修改为 3(v3.1)和 5(v5.0)
    • clean: 默认为 true,是否清除会话。当设置为 true 时,断开连接后将清除会话,订阅过的 Topics 也将失效。当设置为 false 时,离线状态下也能收到 QoS 为 1 和 2 的消息
    • reconnectPeriod: 重连间隔时间,单位为毫秒,默认为 1000 毫秒,注意:当设置为 0 以后将取消自动重连
    • connectTimeout: 连接超时时长,收到 CONNACK 前的等待时间,单位为毫秒,默认 30000 毫秒
    • username: 认证用户名,如果 Broker 要求用户名认证的话,请设置该值
    • password: 认证密码,如果 Broker 要求密码认证的话,请设置该值
    • will: 遗嘱消息,一个可配置的对象值,当客户端非正常断开连接时,Broker 就会向遗嘱 Topic 里面发布一条消息,格式为:
      • topic: 遗嘱发送的 Topic
      • payload: 遗嘱发布的消息
      • QoS: 遗嘱发送的 QoS 值
      • retain: 遗嘱发布的消息的 retain 标志
    • properties: MQTT 5.0 新增,可配置的对象的属性值,详情请参考:https://GitHub.com/mqttjs/MQTT.js#mqttclientstreambuilder-options
  • 如果需要配置 SSL/TLS 连接,Option 对象会被传递给 tls.connect() ,因此可以在 option 中配置以下属性

    • rejectUnauthorized: 是否验证服务端证书链和地址名称,设置为 false 时将跳过验证,会暴露在中间人的攻击之下,所以不建议在生产环境中使用这种配置,当设置为 true 时,将开启强认证模式,且如果是自签名证书,请在证书配置时设置 Alt name。
    • ca: 只有在服务器使用自签名证书时才有必要,自签名证书中生成的 CA 文件
    • cert: 只有当服务器需要客户证书认证时才有必要(双向认证),客户端证书
    • key: 只有当服务器需要客户证书认证时才有必要(双向认证),客户端密钥

Client 事件

当连接成功后,返回的 Client 对象可通过 on 方法监听多个事件,业务逻辑可在监听的回调函数中完成。以下列举一些常用的事件:

connect

当连接成功时触发,参数为 connack

client.on('connect', function (connack) {
  console.log('Connected')
})

reconnect

当断开连接后,经过重连间隔时间重新自动连接到 Broker 时触发

client.on('reconnect', function () {
  console.log('Reconnecting...')
})

close

在断开连接以后触发

client.on('close', function () {
  console.log('Disconnected')
})

disconnect

在收到 Broker 发送过来的断开连接的报文时触发,参数 packet 即为断开连接时接收到的报文,MQTT 5.0 中的功能

client.on('disconnect', function (packet) {
  console.log(packet)
})

offline

当客户端下线时触发

client.on('offline', function () {
  console.log('offline')
})

error

当客户端无法成功连接时或发生解析错误时触发,参数 error 为错误信息

client.on('error', function (error) {
  console.log(error)
})

message

当客户端收到一个发布过来的 Payload 时触发,其中包含三个参数,topic、payload 和 packet,其中 topic 为接收到的消息的 topic,payload 为接收到的消息内容,packet 为 MQTT 报文信息,其中包含 QoS、retain 等信息

client.on('message', function (topic, payload, packet) {
  // Payload is Buffer
  console.log(`Topic: ${topic}, Message: ${payload.toString()}, QoS: ${packet.qos}`)
})

Client 方法

Client 除监听事件外,也内置一些方法,用来进行发布订阅的操作等,以下列举一些常用的方法。

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

向某一 topic 发布消息的函数方法,其中包含四个参数:

// 向 testtopic 主题发送一条 QoS 为 0 的测试消息
client.publish('testtopic', 'Hello, MQTT!', { qos: 0, retain: false }, function (error) {
  if (error) {
    console.log(error)
  } else {
    console.log('Published')
  }
})
  • topic: 要发送的主题,为字符串
  • message: 要发送的主题的下的消息,可以是字符串或者是 Buffer
  • options: 可选值,发布消息时的配置信息,主要是设置发布消息时的 QoS、Retain 值等。
  • callback: 发布消息后的回调函数,参数为 error,当发布失败时,该参数才存在

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

订阅一个或者多个 topic 的方法,当连接成功需要订阅主题来获取消息,该方法包含三个参数:

// 订阅一个名为 testtopic QoS 为 0 的 Topic
client.subscribe('testtopic', { qos: 0 }, function (error, granted) {
  if (error) {
    console.log(error)
  } else {
    console.log(`${granted[0].topic} was subscribed`)
  }
})
  • topic: 可传入一个字符串,或者一个字符串数组,也可以是一个 topic 对象,{'test1': {qos: 0}, 'test2': {qos: 1}}
  • options: 可选值,订阅 Topic 时的配置信息,主要是填写订阅的 Topic 的 QoS 等级的
  • callback: 订阅 Topic 后的回调函数,参数为 error 和 granted,当订阅失败时 error 参数才存在, granted 是一个 {topic, qos} 的数组,其中 topic 是一个被订阅的主题,qos 是 Topic 是被授予的 QoS 等级

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

取消订阅单个主题或多个主题,该方法包含三个参数:

// 取消订阅名为 testtopic 的 Topic
client.unsubscribe('testtopic', function (error) {
  if (error) {
    console.log(error)
  } else {
    console.log('Unsubscribed')
  }
})
  • topic: 可传入一个字符串或一个字符串数组
  • options: 可选值,取消订阅时的配置信息
  • callback: 取消订阅时的回调函数,参数为 error,当取消订阅失败时 error 参数才存在

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

关闭客户端,该方法包含三个参数:

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

总结

至此就简单的介绍了 MQTT.js 一些常用的 API 的使用方法等,具体在实际项目中的使用请参考以下链接:

如何在 Vue 项目中使用 MQTT

如何在 React 项目中使用 MQTT

如何在 Electron 项目中使用 MQTT

如何在 Node.js 项目中使用 MQTT

使用 WebSocket 连接 MQTT 服务器

到此这篇关于MQTT.js 入门教程的文章就介绍到这了,更多相关MQTT.js 入门内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: MQTT.js入门使用教程

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MQTT.js入门使用教程
    目录简介安装使用 npm 或 yarn 安装使用 CDN 安装全局安装使用简单例子命令行API 介绍mqtt.connect([url], options)Client 事件Clie...
    99+
    2023-05-16
    MQTT.js 入门 MQTT.js 入门教程 MQTT.js使用
  • MQTT.js入门使用的方法是什么
    这篇文章主要介绍“MQTT.js入门使用的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MQTT.js入门使用的方法是什么”文章能帮助大家解决问题。简介MQTT.js 是一个开源...
    99+
    2023-07-06
  • Next.js入门使用教程
    目录简介创建Next.js项目 手动创建Next.js项目creact-next-app快速创建项目 Pages 路由 Link Router 参数传递与接收 动态路由 钩子事件 获...
    99+
    2022-11-12
  • Android Studio 使用入门教程
    作者:禅与计算机程序设计艺术 1.简介 近年来,移动端应用数量急剧增加,占据了智能手机市场绝大多数份额,应用开发者也需要具备较高的编程能力和素质。相比于传统开发流程,采用Android系统带来的开源...
    99+
    2023-10-21
    大数据 人工智能 语言模型 Java Python 架构设计
  • dedecms 初级入门使用教程
    一:dedecms安装步骤: 1.配置虚拟路径:在httpd.conf中查找DocumentRoot,修改两处: #DocumentRoot "D:/Apache Group/Apache2/htdocs&qu...
    99+
    2022-06-12
    dedecms 入门使用教程
  • SQL 入门教程:使用函数
    目录一、文本处理函数二、日期和时间处理函数三、数值处理函数请参阅 目录汇总:SQL 入门教程:面向萌新小白的零基础入门教程 大多数 SQL 实现支持以下类型的函数。 用于处理文本字符串(如删除或填充值,转换值为大写或小写)的文本函数。 ...
    99+
    2017-06-27
    SQL 入门教程:使用函数
  • ECMAScript6入门教程
    目录你的浏览器支持ES吗?ES 6 新特性汇总(一图全览)1. let、const 和 block 作用域2. 箭头函数(Arrow Functions)3. 函数参数默认值4. S...
    99+
    2022-11-13
  • maven3 入门教程
    Maven库: http://repo2.maven.org/maven2/ Maven依赖查询: http://mvnrepository.com/ Maven常用命令:  1. 创建Maven的普通java项目:  ...
    99+
    2023-01-31
    入门教程
  • Flask 入门教程
    Flask 入门教程 一、Flask简单使用 1、准备环境 硬件:Windows 7+python 3.6+安装软件:pycharm安装(社区版)、python环境安装 2、简单的Flask应用 本地...
    99+
    2023-10-07
    flask python 后端
  • Navicat入门教程
    本篇内容主要讲解“Navicat入门教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Navicat入门教程”吧!一、 连接使用 1.1 连接数据库打...
    99+
    2022-10-18
  • node.js入门教程
    Node是个啥?   写个东西还是尽量面面俱到吧,所以有关基本概念的东西我也从网上选择性的拿了些下来,有些地方针对自己的理解有所改动,对这些概念性的东西有过了解的可选择跳过这段。   1.Node 是一个服...
    99+
    2022-06-04
    入门教程 node js
  • Jmeter入门教程
    目录一、下载二、安装三、运行四、一个简单的压测实例五、如何查看系统负载何性能瓶颈jemter简介 jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全...
    99+
    2022-11-12
  • HTML5 入门教程
    本篇内容主要讲解“HTML5 入门教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML5 入门教程”吧!JavaScript作为一种弱类型语言,最大的特点就是动态类型。也就是说不用提前声明...
    99+
    2023-06-09
  • ECharts入门教程
    Echart 官网:https://echarts.apache.org/zh/index.html下载页面:https://echarts.apache.org/zh/downlo...
    99+
    2022-11-13
  • IPv6入门教程
    本篇文章主要从基础概念、IPv6的相关网络工具、关于移动应用在IPv6和IPv4网络环境中自动降级机制的研究等三个方面介绍了IPv6的入门教程。前言众所周知,32位的IPv4地址已经基本耗尽(这里的耗尽只是说的分配完了,实际上有相当一部分并...
    99+
    2023-06-03
  • Lighttpd入门教程
    Lighttpd入门教程 概述入门教程安装配置静态文件服务动态文件服务 虚拟主机SSL启动服务器日志模块总结lighthttpd使用场景和原理使用场景原理 概述 Lightt...
    99+
    2023-09-04
    服务器 linux ubuntu
  • Android入门之ScrollView的使用教程
    目录介绍高度需要注意的点例子讲解activity_main.xmlMainActivity.java介绍 ScrollView(滚动条),它有两种“滚动条”:...
    99+
    2022-11-13
    Android ScrollView使用 Android ScrollView
  • Android入门之Fragment的使用教程
    目录简介Fragment是什么课程目标项目结构全局静态常量colors.xmlstrings.xml项目中用到的图片用于定义4个按钮按下去和没有按下去时状态的Selector XML...
    99+
    2022-12-15
    Android Fragment使用 Android Fragment
  • linux中gdb的入门使用教程
    前言 gdb是linux下非常好用的一个调试工具,虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,这里简单介绍下gdb的使用方法,需要的朋友们下面来一起看看详细的介绍吧。 断点 在代码的指定位置中断,使程序...
    99+
    2022-06-04
    linux系统下gdb使用 linux中gdb命令 linux中gdb
  • Burpsuite入门及使用详细教程
    目录1、简介2、标签3、操作1、简介 Burp Suite是用于攻击web应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。所有的工具都...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作