自定义的通讯协议如下:字节号 名称 长度 备注
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#大虾帮忙解析
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#大虾帮忙解析
by[0] = ox02;
by[1] = ox21;一直到 by[36] = ox03;然后对这数组进行转换成上面提供的协议
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
}
}