java mqtt客户端_基于 t-io 实现一个 mqtt5 协议之 mica-mqtt

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的gui库_tkinter——python的GUI标准库

-- coding:utf-8 --import tkinter as tkwindowtk.Tk()#一个窗口对象window.title("tkinter")#窗口名称window.geometry("200x200")#字符串形式表示长宽 中间是xlatk.Label(window,text"我是鬼畜窗口\nnb",bg"red",font("Ariel&q…

java rc4_nodejs 和 java 进行 rc4 加密得到的结果不一样

同时在对一个buffer<03 01 00 00 02 00 00 00>进行加密。java 和 c 得到的结果是CA 66 C4 5D 90 E7 30 01nodejs 得到的结果是6f 61 f8 95 ab ba aa 90不一样 什么原因导致的呢&#xff1f;import java.nio.ByteBuffer;import javax.crypto.Cipher;import javax.crypto.s…

python3闭包通俗解释_Python|闭包、装饰器,简单的实例,通俗的理解

闭包和装饰器都是属于函数的语法范畴&#xff0c;是在函数定义中以另一个函数做为形参的语法机制。1 闭包(Closurer)闭包是定义内部函数的一种语法规则&#xff0c;要理解闭包&#xff0c;请看下面的实例&#xff1a;def outer(t):....print(t)....def inner(i):........return…

java自我介绍_JAVA面试技巧之自我介绍

【如何进行自我介绍】自我介绍这个问题&#xff0c;不用多说了&#xff0c;面试必定会问&#xff01;如果想要在自我介绍的时候就能够打动面试官&#xff0c;吸引面试官对我们的兴趣&#xff0c;那么像我们这种接受过Java培训的程序员的自我介绍当然不能和应届生或者其他非技术…

java excel 操作 poi_Java使用apache poi进行excel相关操作

一.基本介绍1.1、Apache POI介绍Apache POI是一个可以进行微软的文档进行开源库&#xff0c;可以操作的文档类型包括word、ppt、excel、visio、outlook....本文主要针对Apache POI对excel的操作进行介绍&#xff0c;主要包括如何创建一个excel、录入数据、读取excel数据的方式。…

程序解析excel中的图片_产品日志丨支持导入Excel中的图片amp;批量修改后期实体字段...

本次安捷秀又迎来了一个大版本更新&#xff0c;除了大家呼声很高的「实体模块导入 Excel 」外&#xff0c;还有「批量编辑实体」&#xff0c;「支持右击修改」以及针对海外用户的「全页面支持英文」等功能的新增与优化&#xff0c;一起来看看吧。导入功能优化AGILESHOT&#xf…

java随机星星怎么闪_canvas画随机闪烁的星星

canvas画一颗星星&#xff1a;规则的星星有内切圆和外切圆&#xff0c;每两个点之间的角度是固定的&#xff0c;因此可得到星星的每个点的坐标&#xff0c;画出星星。function drawStars(x,y,radius1,radius2,num,drawType,color){var angle 360/(num*2);var arr [];for(var …

java 四种内存_不可访问内存 Java四种引用包括强引用,软引用,弱引用,虚引用...

小结&#xff1a;1、不可访问内存是指一组没有任何可访问指针指向的由计算机程序进行动态分配的内存块。2、垃圾收集器能决定是否一个对象还是可访问的&#xff1b;任何被确定不可访问的对象将会被释放。https://zh.wikipedia.org/wiki/不可访问内存在计算机科学中&#xff0c;…

python async_python async with和async for的使用

网上async with和async for的中文资料比较少&#xff0c;我把PEP 492中的官方陈述翻译一下。异步上下文管理器”async with”异步上下文管理器指的是在enter和exit方法处能够暂停执行的上下文管理器。为了实现这样的功能&#xff0c;需要加入两个新的方法&#xff1a;__aenter_…

python将dataframe写入csv_Pandas dataframe数据写入文件和数据库

转自&#xff1a;http://www.dcharm.com/?p584Pandas是Python下一个开源数据分析的库&#xff0c;它提供的数据结构DataFrame极大的简化了数据分析过程中一些繁琐操作,DataFrame是一张多维的表&#xff0c;大家可以把它想象成一张Excel表单或者Sql表。之前这篇文章已经介绍了从…

java字节输入与字符输入_Java中的字节输入出流和字符输入输出流

Java中的字节输入出流和字符输入输出流下面哪个流类属于面向字符的输入流( )A BufferedWriterB FileInputStreamC ObjectInputStreamD InputStreamReader解析&#xff1a;IO流(1)字节输入流基类&#xff1a;InputStreamFileInputStream、ByteArrayInputStream、PipedInputStrea…

java不同垃圾回收器_细述 Java垃圾回收机制→Types of Java Garbage Collectors

本文非原创&#xff0c;翻译自Types of Java Garbage Collectors在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的。和C语言不一样的是Java程序员不需要手动写垃圾回收相关的代码。这是使得Java如此流行&#xff0c;同时也是Java能帮助程序员写出更好的Java应…

python控制流代码怎么用_Python学习笔记控制流的元素

随笔记录方便自己和同路人查阅。#------------------------------------------------我是可耻的分割线-------------------------------------------控制流语句的开始部分通常是‘’关键字‘、’“条件”&#xff0c;接下来是一个代码块&#xff0c;称为“子句”。在开始学习具…

js修改地址栏url_不同寻常的地址栏过渡

前几天&#xff0c;我在推特上看到这样一张图。原来地址栏还能这么玩&#xff0c;瞬间就觉得自己弱爆了。然后我决定去实现一下这个效果&#xff0c;然后做成一个库。画了一个晚上&#xff0c;终于做好了。这是最后的成果。这个库使用非常的简单。你只需要&#xff0c;yarn add…

linux php和java环境变量配置_Linux下Java环境变量的安装与配置

安装以JDK1.6.0_43为例增加可执行权限 chmod x jdk-6u43-linux-x64.bin&#xff0c;执行 ./jdk-6u43-linux-x64.bin 生成目录jdk1.6.0_43拷贝到/usr/share下&#xff0c;mv jdk1.6.0_43 /usr/share另外&#xff0c;jdk-6u43-linux-x64.bin将所有文件解压缩到当前目录的jdk$veri…

kaggle数据集_ArXiv170万篇论文数据集上线Kaggle!

大数据文摘出品学术圈的朋友对ArXiv肯定都不陌生。在将近30年的时间里&#xff0c;ArXiv通过公开访问学术文章为公众和研究社区提供了一个更高效的学术成果沟通平台&#xff0c;从物理学到计算机科学的许多子学科&#xff0c;以及介于两者之间的所有内容&#xff0c;包括数学&a…

java检测tomcat宕机_Tomcat意外宕机分析

之前在网上看过一篇文章&#xff0c;是讲Tomcat进程意外退出的&#xff0c;我看完感觉好奇&#xff0c;自己也测试了下&#xff0c;果然是有这种问题&#xff0c;所以自己也借此总结一下。先简单说下测试过程&#xff0c;先创建一个web服务启动 test.sh&#xff0c;内容如下&am…

万能驱动xp离线版_教你用SC封装软件来封装XP系统

今天我们来讲解一下如何用SC软件来封装XP系统。今天的讲解只演示基本的SC封装软件&#xff0c;具体的封装前的准备工具&#xff0c;我们不进行讲解&#xff0c;当然前期的准备工作也是有很多&#xff0c;首先我们先要安装虚拟机软件&#xff0c;并在虚拟机上面安装好原版的XP系…

java dispo lock_java实现文件上传和下载(1)

原理&#xff1a; 使用html 的 标签&#xff0c;提交form 的几个属性必须为&#xff1a; methodpost encTypemultipart/form-data;组件:smartUpload或者commons fileuploadsmartUpload代码实现1。文件预览function showImage(obj){var strobj.value;$("#id").html(&q…

剪板机自动上下料_机器人联轴器,用于机器人自动化上下料

关注点击蓝字&#xff0c;关注我吧纤薄型机器人联轴器&#xff0c;可搬运重量范围从 1kg 至 1,000kg&#xff0c;用于高效机器人自动化机床上下料&#xff0c;多年来受到广泛认可。紧凑型微型联轴器适合于最近迅速发展的小型机器人应用领域。无人操作时工艺可靠性高模块的特殊混…