一、项目背景

  公司和第三方合作开发一个传感器项目,想要通过电脑或者手机去控制项目现场的传感器控制情况。现在的最大问题在于,现场的边缘终端设备接入的公网方式是无线接入,无法获取固定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协议的服务器端和客户端的双向交互的更多相关文章

  1. 物联网MQTT协议分析和开源Mosquitto部署验证

    在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...

  2. net remoting 服务器端订阅客户端(附源代码)

    remoting 在分布式应用中逐渐在企业级应用发展开来,最初提出分布式应用,主要目的是为了降低服务器的压力,将耗性能的处理放在另外一个程序中,然后将计算结果发送到另外一个应用中.而remoting就 ...

  3. MQTT协议学习及实践(Linux服务端,Android客户端的例子)

    前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提 ...

  4. java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端

    java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列 ...

  5. 采用MQTT协议实现android消息推送(4)选fusesource-mqtt-client为客户端

    1.简介 一个java写的mqtt客户端.项目地址: https://github.com/fusesource/mqtt-client 2.引入fusesource-mqtt-client库 Fil ...

  6. 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表

    1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...

  7. 海鑫智圣:物联网漫谈之MQTT协议

    什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...

  8. MQTT协议(一)

    MQTT(Message Queue Telemetry Transport),遥测传输协议,提供订阅/发布模式,更为简约.轻量,易于使用,针对受限环境(带宽低.网络延迟高.网络通信不稳定),可以简单 ...

  9. MQTT协议学习笔记

    1.前沿 万物联网的时代即将到来,物联网也由当初的概念开始进一步落实.随着无线网络技术飞速发展,各种设备都可以连接网络,实现远程控制.例如智能家居最近非常火爆,智能插座.智能LED灯.智能摄像头等.在 ...

  10. 【转载】MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用

    http://blog.csdn.net/xukai871105/article/details/39252653 0 前言     MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联 ...

随机推荐

  1. XCTF-CGfsb

    考察知识点 PWN.格式化字符串漏洞 题目链接 https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&am ...

  2. React错误: Can't resolve 'react-dom/client'

    错误截图 解决方案 当你的react版本低于18时,但仍然报这个错误,可以采用如下方案 意外的发现当我采用上述方案时,我的React路由跳转时,页面不刷新的问题也解决了,很神奇,日后技艺精进再补充.

  3. 王道oj/problem10

    地址:http://oj.lgwenda.com/problem/10 思路:首先创建字符串赋初值,其次用gets()输入字符串[fgets()相对于gets()会多识别"\n", ...

  4. 从ABNF读懂HTTP协议格式

    定义 HTTP(Hyper Text Transfer Protocol)超文本传输协议 HTML( Hyper Text Markup Language)超文本标记语言 URI(Uniform Re ...

  5. [selenium]取值元素文本属性样式

    前言 版本: python:3.9 selenium:4.1.5 获取元素文本 text = driver.find_element(by=By.XPATH, value=""). ...

  6. 【go笔记】目录操作

    基本目录操作 涉及:创建目录.重命名目录.删除目录 package main import ( "fmt" "os" "time" &quo ...

  7. [ABC128E] Roadwork

    2023-01-14 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 区间覆盖,线段树,双堆 解题思路 可以将问题转化为区间覆盖问题和单点查询问 ...

  8. TDD、BDD、ATDD都是什么、有什么区别?(上)

    软件开发是一个迭代过程,包括编写.测试和改进代码,直到满足需求.测试驱动开发(TDD).行为驱动开发(BDD)和验收测试驱动开发(ATDD)是支持该过程的三种方法.TDD.BDD和ATDD都是软件开发 ...

  9. 「codeforces - 1344D」Résumé Review

    link. 有点狗,但还算个好题. 设定 \(f_i(x)=a_ix-x^3\),\(\Delta_i(x)=f_i(x)-f_i(x-1)\),可以洞察到 \(\Delta_i(x)\) 在正自然数 ...

  10. python-显示张量(tensorflow)的具体的值

    ------------恢复内容开始------------ # 方法1 a = tf. random.normal ([4,4],mean=0.1,stddev=1) with tf.Session ...