施伟丰 發表於 2021-8-27 11:13:00

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

<p>Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。在 Node.js 出现之前,JavaScript 通常作为客户端程序设计语言使用,以 JavaScript 写出的程序常在用户的浏览器上运行。Node.js 的出现使 JavaScript 也能用于服务端编程。</p>
<p>MQTT 是一种基于发布/订阅模式的轻量级物联网消息传输协议,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。</p>
<p>本文主要介绍如何在 Node.js 项目中使用 MQTT 实现客户端与 MQTT 服务器的连接、订阅、取消订阅、收发消息等功能。</p>
<h2 id="mqtt-客户端库选择">MQTT 客户端库选择</h2>
<p>MQTT.js 是一个 MQTT 协议的客户端库,使用 JavaScript 编写,用于 Node.js 和 浏览器环境中。是 JavaScript 生态中目前使用最为广泛的 MQTT 客户端库。</p>
<h2 id="项目初始化">项目初始化</h2>
<h3 id="确认-nodejs-版本">确认 Node.js 版本</h3>
<p>本项目使用 Node.js v14.14.0 进行开发和测试,读者可用如下命令确认 Node.js 的版本</p>
<pre><code class="language-shell">node --version

v14.14.0
</code></pre>
<h3 id="使用-npm-安装-mqttjs-客户端库">使用 npm 安装 MQTT.js 客户端库</h3>
<pre><code class="language-shell"># 新建项目
npm init -y

# 安装依赖
npm install mqtt --save
</code></pre>
<p>完成后我们在当前目录下新建一个 index.js 文件作为项目的入口文件,在该文件中来实现 MQTT 连接测试的完整逻辑。</p>
<h2 id="nodejs-mqtt-使用">Node.js MQTT 使用</h2>
<h3 id="连接-mqtt-服务器">连接 MQTT 服务器</h3>
<p>本文将使用 EMQ X 提供的 免费公共 MQTT 服务器,该服务基于 EMQ X 的 MQTT 物联网云平台 创建。服务器接入信息如下:</p>
<ul>
<li>Broker: <strong>broker.emqx.io</strong>(国内可以使用 broker-cn.emqx.io)</li>
<li>TCP Port: <strong>1883</strong></li>
<li>SSL/TLS Port: <strong>8883</strong></li>
</ul>
<p>引入 MQTT.js 客户端库</p>
<blockquote>
<p>注意:在 Node.js 环境中,导入依赖模块请使用 commonjs 规范</p>
</blockquote>
<pre><code class="language-javascript">const mqtt = require('mqtt')
</code></pre>
<h3 id="设置-mqtt-broker-的连接参数">设置 MQTT Broker 的连接参数</h3>
<p>设置 MQTT Broker 连接地址,端口以及 topic,这里我们使用 JavaScript 中的生成随机数的函数来生成客户端 ID。</p>
<pre><code class="language-javascript">const host = 'broker.emqx.io'
const port = '1883'
const clientId = `mqtt_${Math.random().toString(16).slice(3)}`
</code></pre>
<h3 id="编写-mqtt-连接函数">编写 MQTT 连接函数</h3>
<p>我们使用刚才设置的连接参数来进行连接,连接的 URL 通过上面定义的 host、port 端口来进行拼接。然后调用 mqtt 模块内置的 connect 函数,连接成功后返回一个 Client 实例。</p>
<pre><code class="language-javascript">const connectUrl = `mqtt://${host}:${port}`

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