4125b49d80d1ed7e4c8e97ba51fa8eb8.png

一、简介

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 源码,对代码进行初步的调整,

  1. ObjectUtil.checkNotNull改为 jdk 的Objects.requireNonNull
  2. CharsetUtil.UTF_8调整为 StandardCharsets.UTF_8
  3. 重写toString方法

3.2 ByteBuf 转 ByteBuffer

netty 中采用 ByteBuf 来解析协议,t-io 则是使用的 ByteBuffer,那么我们最大的任务就是将 ByteBuf 转成 ByteBuffer 了。

ByteBuf vs ByteBuffer 方法对比

ByteBufByteBuffer
writeByteput
writeBytesput
writeShortputShort
writeIntputInt
getByteget
getBytesget
getShortgetShort
getIntgetInt

3.3 mqtt5 encodeProperties 处理

由于 ByteBuffer 是定长的,初始化的时候就需要指定长度,在 encodeProperties 我自定义了一个WriteBuffer做数据承载,最后转成byte[]返回。

130d85ed74a6ab85d8ac02e3c1949f41.png

图示WriteBuffer

f7b875f34e9002ff9ad84c44887e1925.png

WriteBuffer底层是 t-io 自带原作者为 biezhi(王爵)同学的FastByteBuffer

b82335dec7e6ebc3669ec0b25b3730a2.png

四、效果(mqtt5协议)

4.1 使用 MQTTX 客户端

b11334dc016f70ce76b97ae270efc727.png

4.2 使用 mica-mqtt 客户端

11f066fc0f8ed7b8a32f3155f4c852ff.png

五、待办

由于精力有限,mica-mqtt 目前还属于试验性质。希望有更多的同学可以参与进来。

  1. topic 的绑定。
  2. 实现基础的 mqtt-broker 功能。

说明:另外可以参考 zbus 来处理消息或者实现内部的集群。

六、关于 t-io

t-io 是一款简单、高性能、低延迟的网络中台。t-io 解决了其它网络框架没有解决的用户痛点,帮助企业节约大量人力成本。

t-io技术白皮书:https://www.tiocloud.com/tio.pdf

t-io 官方基础 t-io 的 IM(谭聊) 1.4 万人大群,邀你一起来耍!!!

94656366c1b1b1be39c1a1b09a08f31a.png

谭聊产品介绍:https://www.tiocloud.com/tioim.pdf

七、相关连接

mica-mqtt:https://gitee.com/596392912/mica-mqtt

t-io:https://gitee.com/tywo45/t-io

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐