基于 t-io 实现 mqtt5 协议之 mica-mqtt

JAVA架构日记

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

  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[]返回。

图片

图示WriteBuffer

图片

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

图片

四、效果(mqtt5协议)

4.1 使用 MQTTX 客户端


4.2 使用 mica-mqtt 客户端

五、待办

由于精力有限,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 万人大群,邀你一起来耍!!!


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

七、相关连接

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

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

浏览 41
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报