乐趣区

关于mqtt:MQTTjs-入门教程

简介

MQTT.js 是一个开源的 MQTT 协定的客户端库,应用 JavaScript 编写,次要用于 Node.js 和 浏览器环境中。是目前 JavaScript 生态中应用最为宽泛的 MQTT 客户端库。

MQTT 是一种基于公布 / 订阅模式的轻量级物联网音讯传输协定,能够用极少的代码和带宽为联网设施提供实时牢靠的音讯服务,它广泛应用于物联网、挪动互联网、智能硬件、车联网、电力能源等行业。

因为 JavaScript 单线程个性,MQTT.js 是全异步 MQTT 客户端,MQTT.js 反对 MQTT/TCP、MQTT/TLS、MQTT/WebSocket,在不同运行环境反对的度如下:

  • 浏览器环境:MQTT over WebSocket(包含微信小程序、支付宝小程序等定制浏览器环境)
  • Node.js 环境:MQTT、MQTT over 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 的命令行工具。

应用

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

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

更多详情请拜访 EMQ X Cloud 官网,或查看 EMQ X Cloud 文档。

简略例子

咱们简略编写一段代码实现连贯到 EMQ X Cloud 的并实现订阅主题、收发音讯的例子:

const mqtt = require('mqtt')
const options = {
  // Clean session
  clean: true,
  connectTimeout: 4000,
  // Auth
  clientId: 'emqx_test',
  username: 'emqx_test',
  password: 'emqx_test',
}
const client  = mqtt.connect('mqtt://broker.emqx.io:1883')
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'

API 介绍

mqtt.connect([url], options)

连贯到指定的 MQTT Broker 的函数,并始终返回一个 Client 对象。第一个参数传入一个 URL 值,URL 能够是以下协定:mqtt, mqtts, tcp, tls, ws, wss。URL 也能够是一个由 URL.parse() 返回的对象。而后再传入一个 Options 对象,用于配置 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 公布音讯的函数办法,其中蕴含四个参数:

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

    订阅一个或者多个 topic 的办法,当连贯胜利须要订阅主题来获取音讯,该办法蕴含三个参数:

    • topic: 可传入一个字符串,或者一个字符串数组,也能够是一个 topic 对象,{'test1': {qos: 0}, 'test2': {qos: 1}}
    • options: 可选值,订阅 Topic 时的配置信息,次要是填写订阅的 Topic 的 QoS 等级的
    • callback: 订阅 Topic 后的回调函数,参数为 error 和 granted,当订阅失败时 error 参数才存在, granted 是一个 {topic, qos} 的数组,其中 topic 是一个被订阅的主题,qos 是 Topic 是被授予的 QoS 等级
    // 订阅一个名为 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`)
      }
    })
  • Client.unsubscribe(topic/topic array, [options], [callback])

    勾销订阅单个主题或多个主题,该办法蕴含三个参数:

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

    敞开客户端,该办法蕴含三个参数:

    • force: 设置为 true 时将立刻敞开客户端,而无需期待断开连接的音讯被承受。这个参数是可选的,默认为 false。留神:应用该值为 true 时,Broker 无奈接管到 disconnect 的报文
    • options: 可选值,敞开客户端时的配置信息,次要是能够配置 reasonCode,断开连接时的 Reason Code
    • callback: 当客户端敞开时的回调函数
    client.end()

总结

至此就简略的介绍了 MQTT.js 一些罕用的 API 的应用办法等,具体在理论我的项目中的应用请参考以下链接:

  • 如何在 Vue 我的项目中应用 MQTT
  • 如何在 React 我的项目中应用 MQTT
  • 如何在 Electron 我的项目中应用 MQTT
  • 如何在 Node.js 我的项目中应用 MQTT
  • 应用 WebSocket 连贯 MQTT 服务器

版权申明:本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/mqtt-js-tutorial

技术支持:如对本文或 EMQ 相干产品有疑难,可拜访 EMQ 问答社区 https://askemq.com 发问,咱们将会及时回复反对。

更多技术干货,欢送关注咱们公众号【EMQ 中文社区】。

退出移动版