乐趣区

关于node.js:如何在-Nodejs-项目中使用-MQTT

Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。在 Node.js 呈现之前,JavaScript 通常作为客户端程序设计语言应用,以 JavaScript 写出的程序常在用户的浏览器上运行。Node.js 的呈现使 JavaScript 也能用于服务端编程。

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

本文次要介绍如何在 Node.js 我的项目中应用 MQTT 实现客户端与 MQTT 服务器的连贯、订阅、勾销订阅、收发音讯等性能。

MQTT 客户端库抉择

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

我的项目初始化

确认 Node.js 版本

本我的项目应用 Node.js v14.14.0 进行开发和测试,读者可用如下命令确认 Node.js 的版本

node --version

v14.14.0

应用 npm 装置 MQTT.js 客户端库

# 新建我的项目
npm init -y

# 装置依赖
npm install mqtt --save

实现后咱们在当前目录下新建一个 index.js 文件作为我的项目的入口文件,在该文件中来实现 MQTT 连贯测试的残缺逻辑。

Node.js MQTT 应用

连贯 MQTT 服务器

本文将应用 EMQ X 提供的 收费公共 MQTT 服务器,该服务基于 EMQ X 的 MQTT 物联网云平台 创立。服务器接入信息如下:

  • Broker: broker.emqx.io(国内能够应用 broker-cn.emqx.io)
  • TCP Port: 1883
  • SSL/TLS Port: 8883

引入 MQTT.js 客户端库

留神:在 Node.js 环境中,导入依赖模块请应用 commonjs 标准

const mqtt = require('mqtt')

设置 MQTT Broker 的连贯参数

设置 MQTT Broker 连贯地址,端口以及 topic,这里咱们应用 JavaScript 中的生成随机数的函数来生成客户端 ID。

const host = 'broker.emqx.io'
const port = '1883'
const clientId = `mqtt_${Math.random().toString(16).slice(3)}`

编写 MQTT 连贯函数

咱们应用方才设置的连贯参数来进行连贯,连贯的 URL 通过下面定义的 host、port 端口来进行拼接。而后调用 mqtt 模块内置的 connect 函数,连贯胜利后返回一个 Client 实例。

const connectUrl = `mqtt://${host}:${port}`

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

订阅主题

应用返回的 Client 实例的 on 办法来监听连贯胜利状态,并在连贯胜利后的回调函数中订阅 topic。此时咱们连贯胜利后调用 Client 实例的 subscribe 办法订阅 /nodejs/mqtt 主题。

const topic = '/nodejs/mqtt'
client.on('connect', () => {console.log('Connected')
  client.subscribe([topic], () => {console.log(`Subscribe to topic '${topic}'`)
  })
})

订阅主题胜利后,咱们再应用 on 办法来监听接管音讯的办法,当承受到音讯时,咱们能够在该办法的回调函数中获取到 topic 和 message 音讯。

留神:回调函数中的 message 是 Buffer 类型,须要应用 toString 办法将其转化为字符串

client.on('message', (topic, payload) => {console.log('Received Message:', topic, payload.toString())
})

音讯公布

实现上述的订阅主题和音讯监听后,咱们再来编写一个公布音讯的办法。

留神:音讯公布须要在 MQTT 连贯胜利当前,因而这里咱们写到 Connect 胜利的回调函数里

client.on('connect', () => {client.publish(topic, 'nodejs mqtt test', { qos: 0, retain: false}, (error) => {if (error) {console.error(error)
    }
  })
})

残缺代码

服务器连贯、主题订阅、音讯公布与接管的代码。

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

测试

咱们在 package.json 文件中的脚本字段中增加一行启动脚本。

"scripts": {"start": "node index.js"}

而后就能够简略应用 npm start 来运行我的项目。

npm start

运行后咱们能够看到管制的输入信息如下:

咱们看到了客户端曾经胜利连贯到 MQTT 服务器并且订阅主题、接管和公布音讯胜利。此时咱们再应用 MQTT 5.0 客户端工具 – MQTT X 作为另一个客户端进行音讯收发测试。

能够看到控制台内打印出了 MQTT X 发送过去的音讯。

至此,咱们实现了应用 Node.js 来作为 MQTT 客户端连贯到公共 MQTT 服务器,并实现了测试客户端与 MQTT 服务器的连贯、音讯公布和订阅。

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

原文链接:https://www.emqx.com/zh/blog/…

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

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

退出移动版