tb自带mqtt服务器源码学习
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,不能随便订阅
对于回复确认都是最多一次的原则,没有重试