热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Thingsboard源码分析MQTT设备连接协议(下)

ThingsBoard源码分析之MQTTBroker实现原理逐步讲解下篇。Thingsboard使用Netty技术如何实现高性能的M

banner

前言

MQTT协议通过预定义的MQTT控制报文来通信,这一节按照MQTT控制报文类型,通过跟踪Thingsboard处理这些协议报文来解读程序如何处理协议的。

MQTT控制报文由三部分组成,按照 表格1 –MQTT控制报文的结构` 描述的顺序:

表格1 –MQTT控制报文的结构

Fixed header固定报头,所有控制报文都包含
Variable header可变报文,部分控制报文包含
Payload有效载荷,部分控制报文包含

固定报头 Fixed header: 1. MQTT控制报文类型,2. 标志Flags(DUP1=控制报文的重复分发标志,PUBLISH报文的服务质量等级,RETAIN3=PUBLISH报文的保留标志),3.剩余长度 Remaining Length

可变报文: 报文标识符Packet Identifier

有效载荷: 某些MQTT控制报文载报文的最后部分包含一个有效载荷,对于PUBLISH来说有效载荷就是应用消息。

更多MQTT信息参见:

  • MQTT3.1 英文文档 http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html

  • MQTT3.1中文文档 https://mcxiaoke.gitbook.io/mqtt/

下图为逻辑流程时序图:

Mqtt协议处理顺序图

处理入口

代码块1-1

1@Override
2    public void channelRead(ChannelHandlerContext ctx, Object msg) {
3        log.trace("[{}] Processing msg: {}", sessionId, msg);
4        try {
5            if (msg instanceof MqttMessage) {
6                processMqttMsg(ctx, (MqttMessage) msg);
7            } else {
8                ctx.close();
9            }
10        } finally {
11            ReferenceCountUtil.safeRelease(msg);
12        }
13    }

第5-9行代码,通过判断读取到的数据是否为MqttMessage,如果是则进入processMqttMsg(cox, (MqttMessage) msg)类; 如果不是则主动关闭连接。

第11行代码,自从Netty 4开始,对象的生命周期由它们的引用计数(reference counts)管理,而不是由垃圾收集器(garbage collector)管理了。Bytebuf是最值得注意的,它使用了引用计数来改进分配内存和释放内存的性能。

ReferenceCountUtil.safeRelease(msg): 将引用计数减少。


分隔线君


试看到此啦! 更多内容请加知识星球。


物联网技术指导知识星球




推荐阅读
author-avatar
mobiledu2502873611
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有