基于 t-io 实现 mqtt5 协议之 mica-mqtt
共 1643字,需浏览 4分钟
·
2020-11-12 22:24
一、简介
MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的“轻量级”消息协议,由 IBM 发布。
目前使用比较广泛的就是 mqtt 3.1.1(2014年制定),mqtt 5.0(2018年制定),Mqtt5特性详见:https://www.emqx.io/cn/mqtt/mqtt5
二、mica-mqtt
为了深入了解 mqtt 协议的,在今年 9 月左右基于 t-io 开发了 mica-mqtt,mqtt 编解码直接基于 netty codec-mqtt 模块进行的调整,当时 netty 还不支持 mqtt5 协议。
netty 的 codec-mqtt 比较成熟,大多数 java 的 mqtt-broker 也是基于它实现的。下面我主要介绍我是如何将 netty 的 codec-mqtt 移植到 t-io 的。
三、mqtt5协议移植
前 2 周发现 netty 的 codec-mqtt 已经支持 mqtt5 协议了,花了一点时间对它进行了升级,下面跟我一起来看看我是怎么处理的。
3.1 copy 源码
先直接 copy 源码,对代码进行初步的调整,
ObjectUtil.checkNotNull
改为 jdk 的Objects.requireNonNull
CharsetUtil.UTF_8
调整为 StandardCharsets.UTF_8重写 toString
方法
3.2 ByteBuf 转 ByteBuffer
netty 中采用 ByteBuf 来解析协议,t-io 则是使用的 ByteBuffer,那么我们最大的任务就是将 ByteBuf 转成 ByteBuffer 了。
ByteBuf vs ByteBuffer 方法对比
ByteBuf | ByteBuffer |
---|---|
writeByte | put |
writeBytes | put |
writeShort | putShort |
writeInt | putInt |
getByte | get |
getBytes | get |
getShort | getShort |
getInt | getInt |
3.3 mqtt5 encodeProperties 处理
由于 ByteBuffer 是定长的,初始化的时候就需要指定长度,在 encodeProperties 我自定义了一个WriteBuffer
做数据承载,最后转成byte[]
返回。
图示WriteBuffer
WriteBuffer
底层是 t-io 自带原作者为 biezhi(王爵)同学的FastByteBuffer
。
四、效果(mqtt5协议)
4.1 使用 MQTTX 客户端
4.2 使用 mica-mqtt 客户端
五、待办
由于精力有限,mica-mqtt 目前还属于试验性质。希望有更多的同学可以参与进来。
topic 的绑定。 实现基础的 mqtt-broker 功能。
说明:另外可以参考 zbus 来处理消息或者实现内部的集群。
六、关于 t-io
t-io 是一款简单、高性能、低延迟的网络中台。t-io 解决了其它网络框架没有解决的用户痛点,帮助企业节约大量人力成本。
t-io技术白皮书:https://www.tiocloud.com/tio.pdf
t-io 官方基础 t-io 的 IM(谭聊) 1.4 万人大群,邀你一起来耍!!!
谭聊产品介绍:https://www.tiocloud.com/tioim.pdf
七、相关连接
mica-mqtt:https://gitee.com/596392912/mica-mqtt
t-io:https://gitee.com/tywo45/t-io