当前位置: 首页 > 后端技术 > Node.js

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

时间:2023-04-03 19:24:40 Node.js

Node.js是一个基于ChromeV8引擎的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.jsv14.14.0进行开发和测试,读者可以使用如下命令确认Node.js节点版本--versionv14.14.0使用npm安装MQTT.js客户端library#新建项目npminit-y#安装依赖npminstallmqtt--save完成后,我们在当前目录新建一个index.js文件作为项目的入口文件,实现MQTT连接的完整逻辑在这个文件中测试。Node.jsMQTT用于连接MQTT服务器本文将使用EMQX提供的免费公共MQTT服务器,该服务器基于EMQX的MQTTIoT云平台创建。服务器访问信息如下:Broker:broker.emqx.io(国内可以使用broker-cn.emqx.io)TCP端口:1883SSL/TLS端口:8883导入MQTT.js客户端库注:在Node.js环境,引入依赖模块,请使用commonjs规范constmqtt=require('mqtt')设置MQTTBroker的连接参数,设置MQTTBroker的连接地址、端口和主题。这里我们使用JavaScript中的随机数生成功能来生成客户端ID。consthost='broker.emqx.io'constport='1883'constclientId=`mqtt_${Math.random().toString(16).slice(3)}`写MQTT连接函数我们使用刚才设置的连接up参数进行连接,连接的URL是通过上面定义的host和port拼接的。然后调用mqtt模块内置的connect函数,连接成功后返回一个Client实例。constconnectUrl=`mqtt://${host}:${port}`constclient=mqtt.connect(connectUrl,{clientId,clean:true,connectTimeout:4000,用户名:'emqx',密码:'public',reconnectPeriod:1000,})订阅主题使用返回的Client实例的on方法监听连接成功状态,连接成功后在回调函数中订阅主题。此时,我们在连接成功后调用Client实例的subscribe方法订阅/nodejs/mqtt主题。consttopic='/nodejs/mqtt'client.on('connect',()=>{console.log('Connected')client.subscribe([topic],()=>{console.log(`订阅topic'${topic}'`)})})成功订阅主题后,我们再使用on方法监听接收消息的方法。当收到消息时,我们可以在该方法信息的回调函数中获取主题和消息。注意:回调函数中的消息是Buffer类型的,需要使用toString方法将其转换成字符串client.on('message',(topic,payload)=>{console.log('ReceivedMessage:',topic,payload.toString())})消息发布完成上面的订阅主题和消息监听之后,我们来写一个方法来发布消息。注意:MQTT连接成功后需要进行消息发布,所以这里写连接成功回调函数client.on('connect',()=>{client.publish(topic,'nodejsmqtttest',{qos:0,retain:false},(error)=>{if(error){console.error(error)}})})完成代码服务器连接、主题订阅、消息发布和接收代码。constmqtt=require('mqtt')consthost='broker.emqx.io'constport='1883'constclientId=`mqtt_${Math.random().toString(16).slice(3)}`constconnectUrl=`mqtt://${host}:${port}`constclient=mqtt.connect(connectUrl,{clientId,clean:true,connectTimeout:4000,用户名:'emqx',密码:'public',reconnectPeriod:1000,})consttopic='/nodejs/mqtt'client.on('connect',()=>{console.log('Connected')client.subscribe([topic],()=>{控制台。log(`订阅主题'${topic}'`)})client.publish(topic,'nodejsmqtttest',{qos:0,retain:false},(error)=>{if(error){console.error(error)}})})client.on('message',(topic,payload)=>{console.log('ReceivedMessage:',topic,payload.toString())})项目完整代码请参见:https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Node.js测试我们在package.json文件的script字段中添加一行启动脚本。"scripts":{"start":"nodeindex.js"}然后你可以简单地使用npmstart来运行项目。npmstart运行后,我们可以看到控件的输出信息如下:我们看到客户端已经成功连接到MQTT服务器并订阅了主题,成功接收和发布了消息。此时我们将使用MQTT5.0客户端工具——MQTTX作为另一个客户端进行消息收发测试。可以看到控制台打印了MQTTX发送的消息。至此,我们就完成了使用Node.js作为MQTT客户端连接公共MQTT服务器,实现了测试客户端与MQTT服务器的连接、消息发布和订阅。版权声明:本文为EMQ原创,转载请注明出处。