请选择 进入手机版 | 继续访问电脑版

石家庄老站长

点击联系客服
客服QQ: 客服微信:
 找回密码
 立即注册
查看: 6|回复: 0

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

[复制链接]

1

主题

1

帖子

-7

积分

限制会员

积分
-7
发表于 2021-8-28 01:56:14 | 显示全部楼层 |阅读模式
[Node.js](https://nodejs  . org/zh-cn/)是基于[Chrome  V8引擎](3359v  8 . dev/)的JavaScript运行时环境,在node  . js出现之前Node.js的出现使JavaScript也可以用于服务器端编程。

[mqtt](https://www  . emqx.com/ko/mqtt)是基于发布/订阅模式的轻量级IOT消息传输协议,以最小的代码和带宽为网络设备提供实时可靠的消息服务。广泛用于IOT、移动互联网、智能

本文介绍如何在Node.js项目中使用MQTT,使客户端能够连接、订阅、取消订阅、发送和接收消息等功能。

选择Mqtt客户端库

[MQTT  . js](3359 github.com/mqttjs/mqtt  . js)是使用JavaScript编写的mqtt协议的客户端库,用于Node.js和浏览器环境。JavaScript环境(https://www  . emqx.com/zh/blog/introduction-to-the-commonly)中目前使用最广泛的[MQTT客户端库]

# # #项目初始化

# # #检查Node.js版本

该项目使用Node.js  v14.14.0进行开发和测试,读者可以使用以下命令检查Node.js版本

````外壳

节点-版本

V14.14.0

` ` ` ` ` ` ` ` ` ` ` `)

使用Npm安装MQTT.js客户端库

````外壳

#新项目

Npm  init  -y

#安装依赖关系

Npm安装mqtt-保存

` ` ` ` ` ` ` ` ` ` ` `)

完成后,在当前目录中将新的index.js文件创建为项目的门户文件,实现MQTT连接测试的全部逻辑。

使用Node.jsmqtt

连接到MQTT服务器

本文档由EMQ  X提供[免费公共MQTT服务器],该服务器基于EMQ  X的[mqter](](https://www  . em  qx.com/zh/cloud/MQTT/public-MQTT  5-)。

-broker  3360 * * broker  . emqx  . io  * *(broker-cn  . emqx  . io在国内提供)

-TCP  port  3360 * * 1883 * * *

-SSL/TLS端口3360 * * 8883 * *

介绍MQTT.js客户端库

注意:在Node.js环境中,导入从属模块时使用commonjs规范

` ` ` ` ` ` JavaScript

Const  mqtt=require('mqtt  ')

` ` ` ` ` ` ` ` ` ` ` `)

设置MQTT中介的连接参数

设置MQTT中介连接地址、端口和topic。其中,使用JavaScript生成随机数的函数生成客户端ID。

` ` ` ` ` ` JavaScript

Const  host='broker.emqx.io  '

Const  port='1883 '

constclientid=` mqtt  _ $ { math  . random()。tostring  (16)。slice  (3)} `

` ` ` ` ` ` ` ` ` ` ` `)

编写MQTT连接函数

我将使用刚才设置的连接参数连接。连接端口通过上面定义的主机、端口端口连接。然后调用mqtt模块中内置的connect函数,并在连接成功时返回客户端实例。

` ` ` ` ` ` JavaScript

Constconnecturl=`mqtt://$ {主机} : $ {端口} '

constclient=mqtt  . connect(connecturl,{

ClientId,

Clean: true,

ConnectTimeout: 4000,

Username: ' emqx  ',

Password: ' public  ',

ReconnectPeriod: 1000,

})。

` ` ` ` ` ` ` ` ` ` ` `)

# # # #加入主题

使用返回的Client实例的on方法接收连接成功状态,并在连接成功后从回调函数订阅topic。此时,连接成功后,通过调用客户端实例的subscribe方法加入了“/nodejs/mqtt”条目。

` ` ` ` ` JavaScript

Const  topic='/nodejs/mqtt  '

Client.on(“连接”,()={

Console.log(“已连接”)

Client.subscribe([topic],()={

console  . log(' subscribe  to  topic  ' $ { topic  } ')

})。

})。

` ` ` ` ` ` ` ` ` ` ` `)

如果主题订阅成功,则使用on方法接收
接收消息的方法,当接受到消息时,我们可以在该方法的回调函数中获取到 topic 和 message 消息。
> 注意:回调函数中的 message 是 Buffer 类型,需要使用 toString 方法将其转化为字符串
```javascript
client.on('message', (topic, payload) => {
  console.log('Received Message:', topic, payload.toString())
})
```
### 消息发布
完成上述的订阅主题和消息监听后,我们再来编写一个发布消息的方法。
> 注意:消息发布需要在 MQTT 连接成功以后,因此这里我们写到 Connect 成功的回调函数里
```java
client.on('connect', () => {
  client.publish(topic, 'nodejs mqtt test', { qos: 0, retain: false }, (error) => {
    if (error) {
      console.error(error)
    }
  })
})
```
## 完整代码
服务器连接、主题订阅、消息发布与接收的代码。
```javascript
const mqtt = require('mqtt')
const host = 'broker.emqx.io'
const port = '1883'
const clientId = `mqtt_${Math.random().toString(16).slice(3)}`
const connectUrl = `mqtt://${host}:${port}`
const client = mqtt.connect(connectUrl, {
  clientId,
  clean: true,
  connectTimeout: 4000,
  username: 'emqx',
  password: 'public',
  reconnectPeriod: 1000,
})
const topic = '/nodejs/mqtt'
client.on('connect', () => {
  console.log('Connected')
  client.subscribe([topic], () => {
    console.log(`Subscribe to topic '${topic}'`)
  })
  client.publish(topic, 'nodejs mqtt test', { qos: 0, retain: false }, (error) => {
    if (error) {
      console.error(error)
    }
  })
})
client.on('message', (topic, payload) => {
  console.log('Received Message:', topic, payload.toString())
})
```
项目完整代码请见:[https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Node.js](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Node.js)
## 测试
我们在 package.json 文件中的脚本字段中添加一行启动脚本。
```json
"scripts": {
  "start": "node index.js"
}
```
然后就可以简单使用 `npm start` 来运行项目。
```shell
npm start
```
运行后我们可以看到控制的输出信息如下:
![NodeJS MQTT 启动](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a9c720b0af774db6adb00e71d2418500~tplv-k3u1fbpfcp-zoom-1.image)
我们看到了客户端已经成功连接到 [MQTT 服务器](https://www.emqx.io/zh)并且订阅主题、接收和发布消息成功。此时我们再使用 [MQTT 5.0 客户端工具 - MQTT X](https://mqttx.app/zh) 作为另一个客户端进行消息收发测试。
![MQTT 5.0 客户端工具 - MQTT X](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/09c2adaf30624eec9c3811c150c3aa15~tplv-k3u1fbpfcp-zoom-1.image)
可以看到控制台内打印出了 MQTT X 发送过来的消息。
![控制台接收到 MQTT X 发送的消息](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/96b5d48aea3149169d9520c51a59116d~tplv-k3u1fbpfcp-zoom-1.image)
至此,我们完成了使用 Node.js 来作为 MQTT 客户端连接到[公共 MQTT 服务器](https://www.emqx.com/zh/mqtt/public-mqtt5-broker),并实现了测试客户端与 MQTT 服务器的连接、消息发布和订阅。
> 版权声明: 本文为 EMQ 原创,转载请注明出处。
>
> 原文链接:
>
> 技术支持:如对本文或 EMQ 相关产品有疑问,可访问 EMQ 问答社区  提问,我们将会及时回复支持。
>
> 更多技术干货,欢迎关注我们公众号【EMQ 中文社区】。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|无图版|手机版|小黑屋|石家庄@IT精英团

GMT+8, 2021-10-25 12:32 , Processed in 0.249600 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2021 Comsenz Inc.

快速回复 返回顶部 返回列表