对接物联⽹设备tcp协议_物联⽹时代-ThingsBoard源码分析-
MQTT设备连接协议-上
指南logo
系列⽂章:
⾼质量的 IOT 技术教程,代码主要源于国外开源物联⽹平台ThingsBoard和对阿⾥云物联⽹平台的感悟
源码解析系列
a.『准备篇』
《物联⽹时代-Thingsboard源码分析-调试环境调试》
《物联⽹时代-Thingsboard源码分析-项⽬结构说明》
b.『设备连接协议篇』
MQTT
《MQTT⼊门篇》
《物联⽹时代-ThingsBoard源码分析-MQTT设备连接协议-上》
MQTT概述
MQTT是⼀种轻量级的发布-订阅消息传递协议,它可能最适合各种物联⽹设备。你可以在此处到有关MQTT的更多信息。ThingsBoard服务器节点充当⽀持QoS级别0(最多⼀次)和QoS级别1(⾄少⼀次)以及⼀组预定义主题的MQTT主题。
ThingsBoard基于MQTT协议提供给设备的API是⾮常"灵活"的。
例如,⽬前提供了四种API:
遥测数据上传API
属性API
RPC API
声明设备所有权API
⽤上述四种的API,⽤户可以动态调整设备监控属性,例如原先采集设备的温度,湿度及材料⼤⼩调整为温度,湿度和材料是否合格;并可以获取设备历史遥测数据和最新遥测数据;通过RPC API, 设备和服务器可以实时获取对⽅相应属性的变化和通过API⽤户可以对设备进⾏转让,租赁和回收操作。
关联模块⼀览
和MQTT设备传输协议关联的模块有Thingsboard MQTT Transport Service、Thingsboard MQTT Transport Common和Thingsboard Server Queue components。前⾯这些名称⼤家可以看IDEA maven模块名称。
MQTT Transport Service
org.thingsboard.server.mqtt.ThingsboardMqttTransportApplication,MQTT服务启动类,使⽤SpringBoot启动类,通过加载模块
和配置⽂件,对服务进⾏配置并运⾏
@SpringBootConfiguration@EnableAsync@EnableScheduling@ComponentScan({"org.thingsboard.server.mqtt", "org.thingsboard.servermon", "org.t
第2-3⾏代码中,@EnableAsync注解使⽤来开启异步线程,@EnableScheduling注解使⽤来开启定时任务。
第4⾏代码@ComponentScan({"org.thingsboard.server.mqtt", "org.thingsboard.servermon",
"org.ansport.mqtt", "org.thingsboard.server.kafka"}): 扫描这些包下的所有使⽤@Component 的类,不管⾃动
导⼊还是导出。
第7-8⾏代码和updateArguments的作⽤是:启动时,使⽤ --fig.name = tb-mqtt-transport, 指定配置名,包括但不仅限于
MQTT Transport Common
Netty框架
Thingsboard的Mqtt协议逻辑实现是通过Netty实现的,Netty是⼀个NIO客户端、服务器框架,可以快速轻松地开发⽹络应⽤程序,例如
协议服务器和客户端。它极⼤地简化和简化了⽹络编程,例如TCP和UDP套接字服务器。
Netty 官⽹
Netty GitHub仓库
引⼊依赖
MQTT Transport common通过引⼊Netty 4.x版本的jar包对Mqtt进⾏协议逻辑实现,Netty4.x和3.x的区
别还是挺⼤的。
iotynetty-all
参数配置
transport: # 本地MQTT传输参数 mqtt: # 开启/关闭mqtt传输协议. enabled: "${MQTT_ENABLED:true}" bind_address: "${MQTT_BIND_ADDRESS:0.0.0.0}" 模块⽬录结构
⾸先我们看该模块下的⽬录结构:
└── main └── java └── org └── thingsboard └── server └── transport └── mqtt ├── MqttSslHan
Mqtt传输协议逻辑实现
MqttTransportService
@Service("MqttTransportService")@ConditionalOnExpression("'${pe:null}'=='null' || ('${pe}'=='local' && '${abled}'==
第6⾏到18⾏, 通过@value来注⼊对应的值,直接在字段上添加@value获取l⽂件中的值。
MQTT服务端参数:
其中第三个内存检测级别是源于: netty中⼤量使⽤了池化技术来减缓IO buffer的创建销毁开销。对于这些内存池管理的对象,从netty 4之后使⽤了引⽤计数来对它们进⾏管理。但是JVM GC和netty的内存回收机制是不同的,netty就提供了⼀个内存泄漏检查机制。
0. DISABLED: 不进⾏内存泄露的检测;
1. SIMPLE: 抽样检测,且只对部分⽅法调⽤进⾏记录,消耗较⼩,有泄漏时可能会延迟报告,默认级别;
2. ADVANCED: 抽样检测,记录对象最近⼏次的调⽤记录,在泄漏时可能会延迟报告;
3. PARANOID: 每次创建⼀个对象时都进⾏泄露检测,且会记录对象最近的详细调⽤记录。是⽐较激进的内存泄露检测级别,消耗最
⼤,建议只在测试时使⽤。
第四个和第五个参数,boss线程组 ⽤于服务端接受客户端的连接,worker线程组 ⽤于进⾏SocketChannel的数据读写。
第35⾏到第41⾏,通过创建ServerBootstrap对象,设置使⽤的EventLoopGroup;设置要被实例化的为NioServerSocketChannel类;设置连⼊服务端的Client的SocketChannel的处理器,绑定端⼝,并同步等待成功,即启动服务器。
第46⾏到56⾏,监听服务端关闭,并阻塞等待,并优雅关闭两个EventLoopGroup对象。
MqttTransportServerInitializer
public class MqttTransportServerInitializer extends ChannelInitializer { private final MqttTransportContext context; public MqttTransportServerInitializer 第11-16⾏设置ChannelPipeLine,判断SSL处理器处理类是否为空,如果不为空,将SSL处理器加⼊到ChannelPipeLine。
第17-23⾏,添加负载内容的解编码器,Mqtt协议逻辑处理器和异步操作完成时回调。
MqttTransportHandler
总结
1. 让⼤家了解MQTT是什么?MQTT是事实上的物联⽹准标准协议,且经过多年的发展,在IoT⾏业已然长成参天⼤树。
2. 基于NIO通讯的Netty框架是实现MQTT broker的不⼆良选。
开源mqtt服务器3. 带⼤家初步了解怎么⽤Netty框架搭建⼀个MQTT服务,Netty的⽹络参数⼜是怎么样!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论