设为首页 加入收藏

TOP

北斗数据包格式封装和解析(一)
2019-09-17 18:24:44 】 浏览:48
Tags:北斗 数据 格式 封装 解析

1.北斗协议的具体格式如下图

image.png

image.png

2.数据包类型 根据北斗协议类型定义如下枚举类型

 /// <summary>
    /// 数据包类型
    /// </summary>
    public enum BDFrameType : ushort
    {
        /// <summary>
        /// 默认
        /// </summary>
        Default = 0x00,
 
        /// <summary>
        /// 终端通用应答
        /// </summary>
        TerCommonResponse = 0x0001,
 
        /// <summary>
        /// 平台通用应答
        /// </summary>
        PlatCommonResponse = 0x8001,
 
        /// <summary>
        /// 终端心跳
        /// </summary>
        TerHeartbeat = 0x0002,
         
         
             /// <summary>
             /// 位置信息汇报
            /// </summary>
              Position = 0x0200
         
        //省略其他的数据包类型
 
    }

3.基础类封装 BDBaseFrame,使用 IByteBuffer 类来封装数据包,IByteBuffer 内置提供了很多字节操作方法(read,write) 

byteBuffer.ReadUnsignedShort()
byteBuffer.WriteUnsignedShort()
//等等
public abstract class BDBaseFrame
    {
        /// <summary>
        /// 消息ID
        /// </summary>
        public BDFrameType FrameType { get; set; }
 
        /// <summary>
        /// 是否分包
        /// </summary>
        public bool IsSubpackage { get; set; }
 
        /// <summary>
        /// 加密方式
        /// </summary>
        public BDFrameEncryptType FrameEncryptType { get; set; }
 
        /// <summary>
        /// 消息体长度
        /// </summary>
        public UInt16 FrameContentLen { get; private set; }
 
        /// <summary>
        /// 终端手机号  唯一
        /// </summary>
        public string TerminalPhone { get; set; } = string.Empty;
 
 
        /// <summary>
        /// 消息流水号
        /// </summary>
        public ushort FrameSerialNum { get; set; }
 
        /// <summary>
        /// 消息总包数
        /// </summary>
        public ushort FramePackageCount { get; set; }
 
        /// <summary>
        /// 包序号  从 1开始
        /// </summary>
        public ushort FramePackageIndex { get; set; }
 
 
        private int m_frameBodyOffset = 13;
 
        /// <summary>
        /// 消息体 数据偏于量
        /// </summary>
        protected int FrameBodyOffset
        {
            get { return m_frameBodyOffset; }
        }
 
        private static ushort m_SendFrameSerialNum = 0;
 
        /// <summary>
        /// 获取发送的流水号
        /// </summary>
        public static ushort SendFrameSerialNum
        {
            get
            {
                if (m_SendFrameSerialNum == ushort.MaxValue)
                    m_SendFrameSerialNum = 0;
 
                m_SendFrameSerialNum++;
 
                return m_SendFrameSerialNum;
            }
        }
 
        /// <summary>
        /// 数据包内容 字节
        /// </summary>
        //public IByteBuffer ContentBuffer { get; set; }
 
        #region 解析数据包
        /// <summary>
        /// 解析头部
        /// </summary>
        private void DecoderHead(IByteBuffer byteBuffer)
        {
            //消息体属性
            byteBuffer.SetReaderIndex(1);
            FrameType = (BDFrameType)byteBuffer.ReadUnsignedShort();
            ushort frameProerty = byteBuffer.ReadUnsignedShort();
            IsSubpackage = FrameHelper.ReadBoolean16(frameProerty, 13);
            FrameContentLen = (UInt16)(frameProerty & 0x1FFF);//消息体长度
            if (IsSubpackage)
                m_frameBodyOffset = 17;
            //终端手机号
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < 6; i++)
            {
                stringBuilder.Append(byteBuffer.ReadByte().ToString("X2"));
            }
            TerminalPhone = stringBuilder.ToString().TrimStart(new char[] { '0' });
            //消息流水号
            FrameSerialNum = byteBuffer.ReadUnsignedShort();
            //消息包封装项
            if (IsSubpackage)
            {
                FramePackageCount = byteBuffer.ReadUnsignedShort();
                FramePackageIndex = byteBuffer.ReadUnsignedShort();
            }
        }
 
        /// <summary>
        /// 解析内容
        /// </summary>
        public virtual void DecoderFrame(IByteBuffer byteBuffer)
        {
            //解析头部
            DecoderHe
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C#中的split的基本用法 下一篇.net core 分布式配置中心

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目