设为首页 加入收藏

TOP

北斗数据包格式封装和解析(三)
2019-09-17 18:24:44 】 浏览:50
Tags:北斗 数据 格式 封装 解析
lt;/summary>
public class BeiDouContentEncoderHandler : MessageToByteEncoder<BDBaseFrame> { protected override void Encode(IChannelHandlerContext context, BDBaseFrame message, IByteBuffer output) { EncodeFrame(message, output); } private void EncodeFrame(BDBaseFrame message, IByteBuffer output) { //IByteBuffer frameBuffer = output; output.MarkReaderIndex(); //内容 IByteBuffer contentBuffer = message.EncoderContent(); if (contentBuffer == null) contentBuffer = Unpooled.Empty; //byte[] content = new byte[contentBuffer.ReadableBytes]; //contentBuffer.ReadBytes(content, 0, content.Length); //写头标志 output.WriteByte(BDFrameConst.FRAME_FLAG); //消息 ID output.WriteUnsignedShort((ushort)message.FrameType); //消息体属性 加密没做 // ushort contentLen = (ushort)content.Length; ushort contentLen = (ushort)contentBuffer.ReadableBytes; if (message.IsSubpackage) { contentLen = (ushort)(contentLen | 0x2000); output.WriteUnsignedShort(contentLen); } else { output.WriteUnsignedShort(contentLen); } //终端手机号 string tPhone = message.TerminalPhone.ToStringFramePropertyLength(12, '0'); byte[] tPhoneBuffer = CZEFrameHelper.WriteBCDString(tPhone); output.WriteBytes(tPhoneBuffer); //消息流水号 output.WriteUnsignedShort(message.FrameSerialNum); //消息包封装项 if (message.IsSubpackage) { output.WriteUnsignedShort(message.FramePackageCount); output.WriteUnsignedShort(message.FramePackageIndex); } //消息体 output.WriteBytes(contentBuffer); contentBuffer.Release(); //计算校验码 byte[] checkCodeBuffer = new byte[output.ReadableBytes]; output.ReadBytes(checkCodeBuffer, 0, checkCodeBuffer.Length); byte value = checkCodeBuffer[1]; for (int i = 2; i < checkCodeBuffer.Length; i++) value ^= checkCodeBuffer[i]; output.WriteByte(value); //写尾标志 output.WriteByte(BDFrameConst.FRAME_FLAG); //转义 output.ResetReaderIndex(); checkCodeBuffer = new byte[output.ReadableBytes]; output.ReadBytes(checkCodeBuffer, 0, checkCodeBuffer.Length); byte[] frame = FrameEscaping.BDEscapingBufferSend(checkCodeBuffer); //数据写入 frameBuffer output.Clear(); output.WriteBytes(frame); } }

6.使用 BeiDouContentEncoderHandler,在通道中加入BeiDouContentEncoderHandler,通道里面的顺序很重要,BeiDouContentEncoderHandler必须要在你发送的Handler前加到通道中去如下图

 

主要的代码就这些,水平有限,请大家多多指教

原文地址 http://www.dncblogs.cn/Blog/LookBlog/71

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C#中的split的基本用法 下一篇.net core 分布式配置中心

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目