tb自带mqtt服务器源码学习

发布时间 2023-08-18 20:21:56作者: heroinss

 tb自带的mqtt服务器,是基于netty实现的

启动类是 :MqttTransportService,启动的配置参数如下图:

 

编排处理channel中数据的handler的是 MqttTransportServerInitializer

context的isProxyEnabled默认为flase,sslHandlerProvider是null

所以处理数据的handler如下图圈中的

 

说一下四个handler的用处第一个框的类是IpFilter

主要是check和添加,check的时候结合了DefaultTransportRateLimitService类的transport.rate_limits.ip_limits_enabled:false配置,对该连接做访问频率限制,因为默认为false,所以没有做这个check。

接下来两个是decocer和encoder主要是编解码

业务上的处理主要在最后的 MqttTransportHandler

这个handler继承自ChannelInboundHandlerAdapter,处理设备上报的数据

入口在channelRead方法,调用processMqttMsg,分成了连接消息CONNECT,privision消息和一般消息

 

 

Connect消息的处理中,如果是设备首次连接,则正常建立连接,如果设备已经有连接,则会断开老连接

enqueueRegularSessionMsg方法处理一般消息,也是一般设备传上来的业务消息,消息放入queue中,异步处理

 

 

设备上报消息是mqtt的publish动作

 

 

 

根据设备类型不同,区分为gateway网关和设备,两种topic不同

 

根据topic的不同,走入不同的分支,这些分支主里工作内容都差不多:转换上报的消息,调用transportService的对应process方法

 

以第一个属性数据为例,给消息添加一些附属信息,发送到规则引擎,其他分支类似。

 

 

 

通过这几个handler 可以知道了tb接到消息后到进入规则引擎前的业务流转。

 

 

再回头看看,tb是实现了一个定制化的mqtt服务器的功能

mqtt服务器需要能连接,一个clientid只有一个链接;tb以username为唯一,也实现了一个username的连接只有一个。

mqtt服务器可以订阅和发布消息,这个在tb有很多限制

参看subscribe动作处理的方法

 

只能订阅switch分支中的符合的topic,不能随便订阅

对于回复确认都是最多一次的原则,没有重试