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;
}
}
}