物联网开发tcp协议之——netty拆包问题

1.前言

tcp协议是物联网开发中比较常见的一种通信协议,而netty则是一tcp通信协议中一个比较优秀的框架。tcp协议是一种长连接的协议,是流式传输的,开发过程中最长遇见的问题就是拆包粘包问题。我目前对接过的物联网系列有智能家居设备,433酒店智控设备,充电桩设备,安防设备,传感器(温度,噪声等等类的),对接设备的过程中有的是和厂家对接,这种需要完全根据厂家的协议走,有的是公司自研的这和设备端嵌入式工程师商议协议即可。对接过程中遇到的一个最大问题就是拆包粘包的过程。下面就目前我遇到的协议中做一个总结:

1.常规协议,netty常规编解码器

使用Netty实现的tcp服务端,由于tcp是流式传输的,故需要选用一个解码器对流式消息进行解码和包分隔,以防收到不正确的包。例如LineBasedFrameDecoder,LengthFieldBasedFrameDecoder,DelimiterBasedFrameDecoder等常用解码器。

比如对接的智能家居设备是公司自研的设备,嵌入式工程师也是我们自己公司的,定义协议的时候,以固定报文结尾,假如固定报文为:0D0ABBBB,那么可使用netty编解码器ByteArrayDecoder,ByteArrayEncoder,附上代码:

public class HwServerInitializer extends ChannelInitializer<SocketChannel> {
//
    @Override
    protected void initChannel(SocketChannel ch) {
        ChannelPipeline pipeline = ch.pipeline();
        ByteBuf delimiter = Unpooled.copiedBuffer(new byte[]{0x0D, 0x0A, (byte)0xBB, (byte)0xBB});
        
        // 以("\n")为结尾分割的 解码器
        pipeline.addLast("framer", new DelimiterBasedFrameDecoder(10000, delimiter));
        // 字符串解码 和 编码
        pipeline.addLast("decoder", new ByteArrayDecoder());
        pipeline.addLast("encoder", new ByteArrayEncoder());
        // 自己的逻辑Handler
        pipeline.addLast("handler", new HwServerHandler());
    }
}

2.不规则协议

有些协议是用常规的编解码器解决不了的,比如下面这一个安防类的协议,

包很长,常规的编解码器解决不了,一直拆包粘包,那么就需要自定义编解码器了,附上自定义解码器的代码

public class MyMessageDecode extends ByteToMessageDecoder {
    private static final Logger log = LoggerFactory.getLogger(MyMessageDecode.class);

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        // 标记一下当前的readIndex的位置
        byteBuf.markReaderIndex();
        byte[] magic = new byte[5];
        byteBuf.readBytes(magic);
        byte[] len = new byte[4];
        byteBuf.readBytes(len);
        int lens=Integer.parseInt(MyStringUtil.byteArrayToASCII(len));
        if (byteBuf.readableBytes()<lens-10){
            byteBuf.resetReaderIndex();
            return;
        }
        byte[] data = new byte[lens-9];
        byteBuf.readBytes(data);
        byte[] mesages=new byte[lens];
        System.arraycopy(magic, 0, mesages, 0, 5);
        System.arraycopy(len, 0, mesages, 5, 4);
        System.arraycopy(data, 0, mesages, 9, lens-9);
       // byteBuf.resetReaderIndex();
        list.add(mesages);
    }
}

拆包粘包问题解决

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一脉阳光上市圆梦:销售成本高昂,两大创始人的行贿往事与屡屡被罚

《港湾商业观察》施子夫 2024年6月7日&#xff0c;江西一脉阳光集团股份有限公司&#xff08;以下简称&#xff0c;一脉阳光&#xff09;将正式在港交所主板挂牌上市&#xff08;以下简称&#xff0c;一脉阳光&#xff1b;股票代码02522.HK&#xff09;&#xff0c;公司预计发…

【网络安全的神秘世界】Kali安装中文输入法

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 今天就手把手教你如何在kali中安装和配置输入法 首先&#xff0c;打开终端&#xff0c;输入下面这行代码&#xff1a; # sudo apt install ibus ibus-pi…

24年北京网安大会是AI驱动安全?还是驱动安全股票全员下跌?

AI驱动安全&#xff0c;网安一哥疯狂转发 吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 2024年6…

问题:明朝统辖西域的主要措施有( )(2.0分) (多选题) #学习方法#微信#经验分享

问题&#xff1a;明朝统辖西域的主要措施有( )(2.0分) (多选题) A.设立哈密卫 B.册封各地的首领 C.都护统领 D.布局要地 参考答案如图所示

网站建设方案书

网站建设方案书是一个详细的计划&#xff0c;用于指导如何创建一个成功的网站。在这份方案书中&#xff0c;将包括网站的目标&#xff0c;目标受众&#xff0c;用户体验设计&#xff0c;内容策略&#xff0c;技术架构&#xff0c;营销推广等方面的详细计划。以下是一份示例网站…

从零开始学JAVA

一、编写Hello world程序 public class JavaMain1 {//主程序执行入口&#xff0c;main方法public static void main(String[] args){System.out.println("Hello world!");} } 运行结果 Hello world! java编写主程序常见错误&#xff1a; 1、System ---首字母没有…

Vue3入门 - vue3相比于vue2的优点,及如何创建Vue3项目

目录 一、认识Vue3 1. Vue2 选项式 API vs Vue3 组合式API 2. Vue3的优势 二、使用create-vue搭建Vue3项目 1. 认识create-vue 2. 使用create-vue创建项目 3.熟悉项目和关键文件 一、认识Vue3 1. Vue2 选项式 API vs Vue3 组合式API <script>export default …

香蕉派BPI-F3 进迭时空(SpacemiT)K1RISC-V开发板软件下载链接

香蕉派BPI-F3是一款工业级 8核RISC-V开源硬件开发板&#xff0c;它采用进迭时空&#xff08;SpacemiT&#xff09; K1 8核RISC-V芯片设计&#xff0c;CPU集成2.0 TOPs AI计算能力。4G DDR和16G eMMC。2个GbE以太网接口&#xff0c;4个USB 3.0和PCIe M.2接口&#xff0c;支持HDM…

ESP32开发:2、使用Clion+IDF框架新建ESP32工程

文章目录 背景步骤新建工程编译工程下载代码 参考 背景 使用CLIONIDF框架新建ESP32工程。编译工程&#xff0c;并配置下载。首先需要根据教程1、安装好IDF框架&#xff0c;参考如下&#xff1a; IDF环境搭建 步骤 新建工程 首先找到IDF框架安装路径&#xff0c;我这里的如下…

JeeSite 快速开发平台 Vue3 前端版介绍

JeeSite 快速开发平台 Vue3 前端版介绍&#xff1a; 它构建于 Vue3、Vite、Ant-Design-Vue、TypeScript 以及 Vue Vben Admin 等最前沿的技术栈之上&#xff0c;能助力初学者迅速上手并顺利融入团队开发进程。涵盖的模块包括组织机构、角色用户、菜单授权、数据权限、系统参数…

webpack 优化构建速度的插件

1.HardSourceWebpackPlugin本地缓存 HardSourceWebpackPlugin这个插件比DLL动态链接库更优秀 HardSourceWebpackPlugin是webpack的插件&#xff0c;为模块提供中间缓存步骤。为了查看结果&#xff0c;您需要使用此插件运行webpack两次&#xff1a;第一次构建将花费正常的时间…

AI技术变革与企业服务创新

1、AI的技术变革 1&#xff09;AI市场规模 2&#xff09;AI大模型发展历程 3&#xff09;AIGC发展背景 4&#xff09;AIGC技术能力 AIGC的技术架构逻辑上分为基础层、技术层、能力层、应用层、终端层五大板块&#xff0c;其中核心技术层涵盖AI技术群和大模型的融合创新&#…

Python 短文本匹配,短文本语义相似度,基于大模型的短文本匹配,基于LLMs的短文本语义相似度识别,短文本语义扩充和匹配

1.任务描述 之前在做疾病相似度匹配的时候&#xff0c;堪称史诗级难题&#xff0c;虽然最后加上规则以及一些nlp模型&#xff0c;取得了差强人意的效果&#xff0c;但是短文本的语义相似度匹配一直属于比较难以攻克的难题 2.思路 随着近年大模型的飞速发展&#xff0c;就之前…

Linux实验七:线程管理

目录 一、实验目的二、实验内容三、实验环境四、参考代码五、实验步骤步骤1. 编辑源代码test7.c步骤2. 编译源代码test7.c步骤3. 运行可执行程序test7步骤4. 进一步调试源代码test7.c 六、实验结果七、实验总结 一、实验目的 1、深入理解线程模型相关概念&#xff1b; 2、掌握…

SpringBoot实现发送邮件功能

目录 一、开启邮件服务 二、导入pom依赖 三、配置yml文件 四、发送邮件 4.1、发送文字邮件 4.2、发送html邮件 4.3、发送附件邮件 4.4、发送图片邮件 一、开启邮件服务 这里拿QQ邮箱举例。 翻到下面进行开启,之后获取授权码。 二、导入pom依赖 <dependency><…

AlaSQL.js:用SQL解锁JavaScript数据操作的魔法

简介 先附上 github 地址 https://github.com/AlaSQL/alasql AlaSQL.js - JavaScript SQL database for browser and Node.js. Handles both traditional relational tables and nested JSON data (NoSQL). Export, store, and import data from localStorage, IndexedDB, or …

【机器学习】机器学习与智能交通在智慧城市中的融合应用与性能优化新探索

文章目录 引言机器学习与智能交通的基本概念机器学习概述监督学习无监督学习强化学习 智能交通概述交通流量预测交通拥堵管理智能信号控制智能停车管理 机器学习与智能交通的融合应用实时交通数据分析数据预处理特征工程 交通流量预测与优化模型训练模型评估 智能信号控制与优化…

mysql中事务的简介

大家好。我们在日常开发过程中肯定都或多或少的用到过事务&#xff0c;而且在面试时&#xff0c;数据库的事务也是必问内容之一。今天我们就来说说mysql的事务。 为了方便我们下面内容的讲解&#xff0c;我们也先建立一个讲事务必用的表–account表&#xff0c;并在表中插入两…

2024上半年主播又买了啥好东西? | 老高居然买了仨手机当望远镜用!

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 朱峰 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / &#xff08;新&#xff09;声湃轩北京录音间 本期节目绝无广告&#xff0c;如有需要&#xff0c;我们还可以提供购买记录 …

Qt 简易Word

Ui界面如下&#xff1a; 查找和替换界面&#xff1a; 具体代码&#xff1a; GitHub : 简易Word Gitee : 简易Word