c++ 协议格式
=======================================================
typedefstruct _THead
{
unsignedshort wHeader; ;
unsigned shortcmdFlag;
}THead;
typedefstruct _TGpsData
{
unsigned char GpsId[6];
double lon;
doublelat;
unsigned char speed;
unsigned char dir;
unsignedint state;
unsigned short nMsgtype;
unsignedshort height;
doubletime;
}TGpsData;
typedefstruct _TGpsFram
{
THead Head;
TGpsDataGpsData;
}TGpsFram;
======================================================
字段类型
=================================================
定位消息体报文
字段标志 | 描述 | 数据长度 | 字段类型 | 参数值 | 说明 |
wHeader | 头定义 | 2 | Unsigned short | 0xAA | 必须 |
cmdFlag | 命令字 | 2 | Unsigned short | 0xCC | 定位消息格式命令字[必须] |
GpsId | 设备编号 | 6 | Unsigned char | 必须 | 定位终端编号为12位数字,不足12位的在数字前补0。从最左面的数字开始,每两个数字用一个字节表示。 |
lon | 经度 | 8 | Double | 必须 | [必须] |
Lat | 纬度 | 8 | Double | 必须 | [必须] |
speed | 速度 | 1 | Unsigned char | 必须 |
|
dir | 方向 | 1 | Unsigned char | 必须 | 目前显示不了360度,只能模2取整 |
state | 星数 | 4 | Unsigned int | 必须 |
|
nMsgtype | 消息类型 | 2 | Unsigned short | 必须 | [必须] 对定位消息默认为 1 |
height | 高程 | 2 | Unsigned short | 必须 |
|
time | 时间 | 8 | Double | 必须 | 时间基准值coledatetime 1899:年12月30日 00:00:00
|
/定义对应结构体
public struct THead
{
public ushort wHeader;
public ushort cmdFlag;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)] //结构体不自动调整长度
public struct TGpsData
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public Byte[] GpsId;
public double lon;
public double lat;
public byte speed;
public byte dir;
public int state;
public short nMsgtype;
public short height;
public double time;
}
public struct TGpsFram
{
public THead Head;
public TGpsData GpsData;
}
private void button2_Click(object sender, RoutedEventArgs e)
{
dataGrid1.Items.Insert(0, new DataGridRow() { Item = new { IP地址 = i, ISSI = "2-2", 信息 = "3-3" } });
i += 1;
Thread newThread =
new Thread(new ThreadStart(ReceiveData));
newThread.Start();
}
public Object BytesToStruct(Byte[] bytes, Type strcutType)
{
Int32 size = Marshal.SizeOf(strcutType);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, 0, buffer, size);
return Marshal.PtrToStructure(buffer, strcutType);
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
delegate void TextBoxCallback(TGpsFram udpData);
public void SetTextBox(TGpsFram udpData)
{
ih += 1;
textBox1.Text =ih.ToString()+udpData.GpsData.lat.ToString();
}
private int port = 6666;
private UdpClient udpClient;
private int ih=0;
TGpsFram udp_receive_data;
private void ReceiveData()
{
//在本机指定的端口接收
udpClient = new UdpClient(port);
IPEndPoint remote = null;
//接收从远程主机发送过来的信息;
while (true)
{
try
{
//关闭udpClient时此句会产生异常
byte[] bytes = udpClient.Receive(ref remote);
//string str = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
// udp_receive_data.GpsData.GpsId = new byte[6];
udp_receive_data = (TGpsFram)BytesToStruct(bytes, typeof(TGpsFram));
TextBoxCallback tx = SetTextBox;
this.Dispatcher.Invoke(tx, udp_receive_data);//使用委托
}
catch
{
//退出循环,结束线程
udpClient.Close();
break;
}
}
}