自定义的通讯协议如下:字节号 名称 长度 备注
0 引导符 1 0x02
1-2 帧体长度 2 大端模式 (命令序列号+帧类型+数据的长度+校验和)
3-4 命令序列号 2 大端模式
5 帧类型 1 具体取值见各帧结构的定义
6—(N+5) 数据 N 详见本协议文档第二、三部分
N+6 校验和 1 0-(N+5)位数据依次校验和
N+7 帧结束 1 0x03
命令序列号 整型 2 0-65535,大端模式,低位在前,高位在后
0x01 0x00  ->  0001   (0x0001)
0x05 0x1A  ->  6661   (0x1A05)
6-11 终端ID 6 压缩BCD
12 GPS有效性 1 0x41 有效   0x56 无效
13 南北纬度 1 0x4E 北纬   0x53 南纬
14-17 纬度 4
18 东西经度 1 0x45东经   0x57西经
19-22 经度 4
23 速度 1 0-255,单位:公里/小时
24-25 方向1 2 地面航向的小数点前数值xxx,单位:度
26 方向2 1 地面航向的小数点后数值xx
27-28 累计里程1 2 累计里程的小数点前数值xxxxx,单位:公里
29 累计里程2 1 累计里程的小数点后数值xx
30-33 UTC时间 4 表示当前时间距1970年1月1日的秒数
需要解析的样本如下:
02-21-00-C6-02-72-09-99-99-90-25-86-41-53-28-09-C6-02-45-74-1D-B7-18-00-5D-00-00-00-00-00-26-D9-80-4C-00-B5-03请各位C#大虾帮忙解析

解决方案 »

  1.   

    是要程序..请各位大虾提供02-21-00-C6-02-72-09-99-99-90-25-86-41-53-28-09-C6-02-45-74-1D-B7-18-00-5D-00-00-00-00-00-26-D9-80-4C-00-B5-03这一串是字节数组byte []by = new byte[37]
    by[0] = ox02;
    by[1] = ox21;一直到 by[36] = ox03;然后对这数组进行转换成上面提供的协议
      

  2.   


    using System.Runtime.InteropServices;namespace WindowsApplication2
    {
        class Class1
        {
            /// <summary>
            /// 监控数据
            /// </summary>
            [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
            public struct MonitorGPSData
            {
                /// <summary>
                /// 头信息
                /// </summary>
                [MarshalAs(UnmanagedType.I1, SizeConst = 1)]
                public byte Head;
                /// <summary>
                /// 帧体长度
                /// </summary>
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
                public byte[] MessageLength;
                /// <summary>
                /// 命令序号
                /// </summary>
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
                public byte[] MessageIndex;
                /// <summary>
                /// 帧类型
                /// </summary>
                [MarshalAs(UnmanagedType.I1, SizeConst = 1)]
                public byte MessageType;
                /// <summary>
                /// 终端ID
                /// </summary>
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
                public byte[] TerID;
                /// <summary>
                /// GPS数据状态
                /// </summary>
                [MarshalAs(UnmanagedType.I1, SizeConst = 1)]
                public byte GPSIsNeed;
                /// <summary>
                /// 南北纬度
                /// </summary>
                [MarshalAs(UnmanagedType.I1, SizeConst = 1)]
                public byte LatCheck;
                /// <summary>
                /// 纬度
                /// </summary>
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
                public byte[] Lat;
                /// <summary>
                /// 东西经度
                /// </summary>
                [MarshalAs(UnmanagedType.I1, SizeConst = 1)]
                public byte LonCheck;
                /// <summary>
                /// 经度
                /// </summary>
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
                public byte[] Lon;
                /// <summary>
                /// 速度
                /// </summary>
                [MarshalAs(UnmanagedType.I1, SizeConst = 1)]
                public byte Speed;
                /// <summary>
                /// 方向1
                /// </summary>
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
                public byte[] Angel;
                /// <summary>
                /// 方向2
                /// </summary>
                [MarshalAs(UnmanagedType.I1, SizeConst = 1)]
                public byte Angel;
                /// <summary>
                /// 里程1
                /// </summary>
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
                public byte[] Mileage;
                /// <summary>
                /// 里程2
                /// </summary>
                [MarshalAs(UnmanagedType.I1, SizeConst = 1)]
                public byte Mileage_;
                /// <summary>
                /// UTC时间
                /// </summary>
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
                public byte[] UTCTime;
                /// <summary>
                /// 校验和
                /// </summary>
                [MarshalAs(UnmanagedType.I1, SizeConst = 1)]
                public byte Check;
                /// <summary>
                /// 信息尾
                /// </summary>
                [MarshalAs(UnmanagedType.I1, SizeConst = 1)]
                public byte End;
            }        #region 转换方法        /// <summary>
            /// byte数组转目标结构体
            /// </summary>
            /// <param name="bytes">byte数组</param>
            /// <param name="type">目标结构体类型</param>
            /// <returns>目标结构体</returns>
            public static object ByteToStuct(byte[] DataBuff_, Type type)
            {
                //得到结构体大小
                int size = Marshal.SizeOf(type);
                //数组长度小于结构体大小
                if (size > DataBuff_.Length)
                {
                    return null;
                }            //分配结构体大小的内存空间
                IntPtr structPtr = Marshal.AllocHGlobal(size);
                //将byte数组cpoy到分配好的内存空间内
                Marshal.Copy(DataBuff_, 0, structPtr, size);
                //将内存空间转换为目标结构体
                object obj = Marshal.PtrToStructure(structPtr, type);
                //释放内存空间
                Marshal.FreeHGlobal(structPtr);
                return obj;
            }        /// <summary>
            /// 结构体转byte数组
            /// </summary>
            /// <param name="objstuct">结构体</param>
            /// <returns>byte数组</returns>
            public static byte[] StuctToByte(object objstuct)
            {
                //得到结构体大小
                int size = Marshal.SizeOf(objstuct);
                //创建byte数组
                byte[] bytes = new byte[size];
                //分配结构体大小的空间
                IntPtr structPtr = Marshal.AllocHGlobal(size);
                //将结构体copy到分配好的内存空间内
                Marshal.StructureToPtr(objstuct, structPtr, false);
                //从内存空间copy到byte数组
                Marshal.Copy(structPtr, bytes, 0, size);
                //释放内存空间
                Marshal.FreeHGlobal(structPtr);
                return bytes;
            }        #endregion
        }
    }
      

  3.   

    大体就是上面的意思,定义了结构体,之后接受到的byte[]数据调用ByteToStuct方法转成结构体对象,之后用结构体对象去执行你对应的解析,很方便的~