JT/T808消息体转义

  • 前言
  • C#实现
    • C#转义实现
    • C#反转义实现
  • Java实现
    • JAVA 转义实现
    • JAVA 反转义实现

前言

在网络传输过程中会存在粘包、半包等问题,在各个厂家做物联网产品的时候,大多会定义一种协议,协议里面包含了数据的包头、包尾以及校验位等字节,主要目的是为了在我们做物联网服务网关(接收物联网设备传输数据的系统)的时候方便对接收的数据进行校验以及处理粘包与半包问题。
为了防止消息体里面出现与包头包尾相同的字节出现,在物联网设备进行组包的时候一般会进行转移,就是将消息体中出现与包头包尾相同的字节按特定的规则转成其他字节。
比如:JT/T808协议,会将除包头包尾外整个消息体中出现的
0x7E——>0x7D 0x02
0x7D——>0x7D 0x01
所以我们在网关程序接收到设备的原始数据的时候,去掉包头、包尾之后需要进行反转义,然后将反转义后的数据在进行解析分析。
反转义:
0x7D 0x01——>0x7D
0x7D 0x02——>0x7E

C#实现

C#转义实现

        /// <summary>/// 息头、消息体、校验码中0x7E转义为0x7D 0x02,0x7D转义为0x7D 0x01/// </summary>/// <param name="inbytes"></param>/// <returns></returns>public byte[] escape(byte[] inbytes){List<byte> list = new List<byte>();for (int i = 0; i < inbytes.Length; i++){byte b = inbytes[i];if (b == 0x7e){list.Add(0x7d);list.Add(0x02);}else if (b == 0x7d){list.Add(0x7d);list.Add(0x01);}else{list.Add(b);}}return list.ToArray();}

C#反转义实现

        /// <summary>/// 消息头、消息体、校验码中0x7D 0x02反转义为0x7E,0x7D 0x01反转义为0x7D/// </summary>/// <param name="inbytes"></param>/// <returns></returns>public byte[] unescape(byte[] inbytes){List<byte> list = new List<byte>();int i = 0;int bodyLength = inbytes.Length;if (i < bodyLength){byte firstByte = inbytes[i];if (firstByte == 0x7d){byte nextByte = inbytes[i + 1];if (nextByte == 0x01){list.Add(0x7d);}else if (nextByte == 0x02){list.Add(0x7e);}else{list.Add(firstByte);list.Add(nextByte);}i += 2;}else{list.Add(firstByte);i++;}}return list.ToArray();}

Java实现

基于Netty框架

JAVA 转义实现

    /*** 消息头、消息体、校验码中0x7E转义为0x7D 0x02,0x7D转义为0x7D 0x01** @param out* @param bodyBuf*/public static void escape(ByteBuf out, ByteBuf bodyBuf) {while (bodyBuf.readableBytes() > 0) {int b = bodyBuf.readUnsignedByte();if (b == 0x7E) {out.writeShort(0x7D02);} else if (b == 0x7D) {out.writeShort(0x7D01);} else {out.writeByte(b);}}}

JAVA 反转义实现

    /*** 消息头、消息体、校验码中0x7D 0x02反转义为0x7E,0x7D 0x01反转义为0x7D** @param in* @param frame* @param bodyLen*/public static void unescape(ByteBuf in, ByteBuf frame, int bodyLen) {int i = 0;while (i < bodyLen) {int b = in.readUnsignedByte();if (b == 0x7D) {int nextByte = in.readUnsignedByte();if (nextByte == 0x01) {frame.writeByte(0x7D);} else if (nextByte == 0x02) {frame.writeByte(0x7E);} else {//异常数据frame.writeByte(b);frame.writeByte(nextByte);}i += 2;} else {frame.writeByte(b);i++;}}}

JT/T808消息体转义相关推荐

  1. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

  2. 道路运输车辆卫星定位系统JT/T808服务实现和压测

    在工作上的需要接触道路运输车辆卫星定位系统相关应用,由于自己对网络服务的编写比较感兴趣,所以利用空闲时间实现了JT/T808的一些协议和相关服务(不得不说这种协议的设计在解释的确导致性能上的损耗,特别 ...

  3. 808协议 java_基于JT/T808协议的车辆监控平台架构方案

    技术支持QQ:78772895 1.车载终端协议网关采用mina/netty+spring架构,独立于其他应用,主要负责维护接入终端的tcp链接.上行以及下行消息的解码.编码.流量控制,黑白名单等安全 ...

  4. JT/T808协议之:0x0001终端通用应答和0x8001平台通用应答

    终端是指obd设备,既车载obd设备. 平台是指上文中说到的通过短信设置的上报IP指向的机器所提供的网关服务. 这两种消息一是终端设备发出的,一是平台发出的,都是通用应答的格式,所谓通用既是可以用于应 ...

  5. 部标JT808 JT/T808协议网关

    项目介绍 基于Netty,实现JT808 JT/T808部标协议的消息处理,与编码解码: 使用SpringBoot + MyBatis提供数据入库.Web接口服务: 协议部分不依赖Spring,可移除 ...

  6. Android4.0.4之后,服务器返回401或者407时,获取不到消息体的解决办法

    Android4.0.4之后,服务器返回401或者407时,获取不到消息体的主要原因就是报错了,内容是: java.io.IOException: No authentication challeng ...

  7. 请求体的方式传参_Angularjs中$http以post请求通过消息体传递参数的实现方法

    本文实例讲述了Angularjs中$http以post请求通过消息体传递参数的方法.分享给大家供大家参考,具体如下: Angularjs中,$http以post在消息体中传递参数,需要做以下修改,以确 ...

  8. Java微信公众平台开发(二)--微信服务器post消息体的接收

    转自: http://www.cuiyongzhi.com/post/39.html 在上一篇的文章中我们详细讲述了如何将我们的应用服务器和微信腾讯服务器之间的对接操作,最后接入成功,不知道你有没有发 ...

  9. C#微信公众号开发系列教程三(消息体签名及加解密)

    http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...

最新文章

  1. 多细胞生命进击之路:单细胞为何放弃自由,长成复杂的多细胞?
  2. 【Codeforces1327A】: Sum of Odd Intergers C/C++题解
  3. 以 boost::spirit 规则形式编写的 INFO 文件格式的语法测试程序
  4. 梯度下降法_梯度下降
  5. CondenserDotNet - 使用 Kestrel 和 Consul 的 API 反向代理库!
  6. python实现var模型_copula函数及其Var计算的Python实现
  7. vue 页面引入多个内部js_.html多页页面引入vue.js怎么开发?
  8. Zend Framework学习之Zend_Config
  9. 300 万行核心代码全部开源!OceanBase 开启 3.0 时代
  10. paip.spring3 mvc servlet的配置以及使用最佳实践
  11. lfw分类 python_LFW精确度验证__python读写txt
  12. TabLayout+Viewpage滑动
  13. 根据城市的名称获取省份的名称
  14. 【物联网毕设基础】NBIOT 窄带物联网
  15. uniapp 快速实现简单首页布局
  16. android自定义金额输入键盘_触摸键盘的设计解析
  17. 2022年山东省职业院校技能大赛“网络安全”比赛任务书
  18. 架构师之路-网络框架的搭建(高逼格)
  19. Uber Shader
  20. [WUA APIs]UpdateInstaller

热门文章

  1. Docker基础-使用Dockerfile创建镜像
  2. java盘古分词_.NET使用Lucene.Net和盘古分词类库实现中文分词
  3. prometheus告警功能
  4. JavaEE知识点总结详细版(一)计算机是如何进行工作的
  5. excel中单元格日期为计算机日期,#excle里设置今天的日期#excel表格时间如何自动修改为当天的时间...
  6. 解决微信小程序录制视频存在的问题
  7. JavaFX调用虚拟键盘
  8. Androidq下编译efr32mg21
  9. ffmpeg example演示教程 -AudioDecode
  10. GNU Radio: 射频子板