nodejs 实现MQTT协议的服务器端和客户端的双向交互
一、项目背景
公司和第三方合作开发一个传感器项目,想要通过电脑或者手机去控制项目现场的传感器控制情况。现在的最大问题在于,现场的边缘终端设备接入的公网方式是无线接入,无法获取固定IP,所以常规的HTTP协议通信就没法做,现在打算使用MQTT来实现云平台和边缘终端(传感器)之间的双向通信。
二、术语定义
2.1云平台
主要是针对数据、设备等的管理。部署在云端的软件应用系统,通过与边缘终端,实现数据获取或者指令下发。
2.2边缘终端
位于网络边缘的计算机设备,通过网络与云平台连接,向下连接解析仪和各类传感器。
2.3解析仪
数据接受装置,通过有线/无线模式,连接边缘终端或通过有线模式接收不同来源的传感器数据。
2.4传感器
通过有线/无线模式,连接边缘终端,传输相应的参数或通过有线模式连接解析仪,传输相应的参数。
三、网络结构

四、代码实现
4.1 服务器实现
首先安装nodejs和aedes,具体的操作和截图网上有很多现成的。
新建一个“server.js”
const aedes = require('aedes')();
const aedesServer = require('net').createServer(aedes.handle);
const port = 1883;
aedesServer.listen(port, function () {
console.log('服务启动并开始监听端口:', port)
})
//监听MQTT服务器端口,当有客户端连接上时,触发该回调
aedes.on("client", (client) => {
console.log("客户端连接成功:", client.id);
})
//监听MQTT服务器端口,当有客户端主动断开连接或者服务器600s内没收到某个客户端的心跳包就会触发
aedes.on("clientDisconnect", (client) => {
console.log("客户端断开连接:", client.id);
})
//监听客户端发布的主题
aedes.on("publish", function (packet, client) {
//针对不同的客户端写不同的逻辑
if (client) {
//根据主题不同写不同的逻辑,建议采用JSON格式传输
console.log("监听客户端发过来的消息",packet.topic, packet.payload.toString());
}
})
//服务器发出的消息
setInterval(() => {
aedes.publish({
topic: "serverMsg",
payload: "服务器发消息",
qos: 1,
retain: false,
dup: false,
cmd: "publish"
}, (err) => {
if (err) {
console.log("发布失败");
}
});
}, 20000)
4.2客户端实现
新建一个“client.js”
客户端只需要使用“mqtt.connect”方法,就可以跟服务端建立长连接。
就目前实际使用的情况看,客户端偶尔会自动与服务器断开,并且自动连上,稳定性方面有待验证。
var mqtt = require('mqtt');
var client = mqtt.connect('mqtt://192.168.70.220:1883',{
clientId:'nodejs-mqtt-client'
})
client.on('connect',function (){
console.log('连接上MQTT服务器')
//需要订阅服务器主题,不然无法接受消息
client.subscribe('serverMsg',{
qos:1
})
})
//发布客户端消息
setInterval(()=>{
client.publish('topic1','hello mqtt client',{
qos:1
})
},20000)
client.on('message',function (topic,message){
console.log('接受服务器消息:','主题:',topic,'消息:',message.toString())
})
4.3 效果呈现
通过两个定时器,实现了双向通信。
服务端

客户端

翻译
搜索
复制
nodejs 实现MQTT协议的服务器端和客户端的双向交互的更多相关文章
- 物联网MQTT协议分析和开源Mosquitto部署验证
在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...
- net remoting 服务器端订阅客户端(附源代码)
remoting 在分布式应用中逐渐在企业级应用发展开来,最初提出分布式应用,主要目的是为了降低服务器的压力,将耗性能的处理放在另外一个程序中,然后将计算结果发送到另外一个应用中.而remoting就 ...
- MQTT协议学习及实践(Linux服务端,Android客户端的例子)
前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提 ...
- java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端
java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列 ...
- 采用MQTT协议实现android消息推送(4)选fusesource-mqtt-client为客户端
1.简介 一个java写的mqtt客户端.项目地址: https://github.com/fusesource/mqtt-client 2.引入fusesource-mqtt-client库 Fil ...
- 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表
1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...
- 海鑫智圣:物联网漫谈之MQTT协议
什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...
- MQTT协议(一)
MQTT(Message Queue Telemetry Transport),遥测传输协议,提供订阅/发布模式,更为简约.轻量,易于使用,针对受限环境(带宽低.网络延迟高.网络通信不稳定),可以简单 ...
- MQTT协议学习笔记
1.前沿 万物联网的时代即将到来,物联网也由当初的概念开始进一步落实.随着无线网络技术飞速发展,各种设备都可以连接网络,实现远程控制.例如智能家居最近非常火爆,智能插座.智能LED灯.智能摄像头等.在 ...
- 【转载】MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用
http://blog.csdn.net/xukai871105/article/details/39252653 0 前言 MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联 ...
随机推荐
- .NET下数据库的负载均衡“经典方案”(大项目必备,建议收藏)
[前言] 本文讲述的"数据库负载均衡"方案,为市面上最经典(没有之一),由.NET界骨灰级大佬推出.采用该技术方案的大公司,一年省下了几个亿的支出. [正文] 支持.Net Cor ...
- gpg 解密-禁用交互式密码输入
背景描述 gpg 解密默认弹出如下窗口,请用户输入密码,但在脚本自动化时遇到了问题 lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x ...
- gitlab-runner-config-in-docker
gitlab in docker 网上有很多现成的解决方案,本文仅作流程梳理,若不需要,可直接用gitlab官方提供的镜像 installation Dockerfile FROM registry. ...
- html5 2.0学习
列表定义:是一种特别的对象集合.集合:集中在一起合二为一(聚集). 聚集:多个列(信息资源)排在一起.信息资源:一堆数据,可能是字符,可能是图片. 列表分类:有序列表 无序列表 (自)定义列表 有 ...
- Web通用漏洞--文件上传
Web通用漏洞--文件上传 概述 文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文件类型等方面判 ...
- 不重启Docker能添加自签SSL证书镜像仓库吗?
应用背景 在企业应用Docker规划初期配置非安全镜像仓库时,有时会遗漏一些仓库没配置,但此时应用程序已经在Docker平台上部署起来了,体量越大就越不会让人去直接重启Docker. 那么,不重启Do ...
- 春秋云镜像-CVE-2022-0788
准备: 攻击机:win10. 靶机:春秋云镜像-CVE-2022-0788. 写这个的时候在网上想查找下该漏洞的利用方式,没有找到相关的资料,因此记录下自己通过这个靶场的poc与exp. curl ' ...
- Facade Pattern and Encapsulation—— Structure Class
如果只看代码的话,应该可以说Facade pattern(门面设计模式)是一种最简单的代码结构,不就封装吗!这玩意谁不会! 还是看它背后所蕴含的思想吧,看了之后发现背后的思想也很简单,非常好理解. - ...
- 多重断言插件之pytest-assume的简单使用
背景: pytest-assume是Pytest框架的一个扩展,它允许在单个测试用例中多次断言.通常情况下,当一个断言失败时,测试会立即停止执行,而pytest-assume允许我 们继续执行剩余的断 ...
- 二叉树(binary tree)
二叉树(binary tree) 二叉树(Binary Tree)是一种常见的树状数据结构,它由一组节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点.二叉树具有以下特点: 每个节点最多有 ...