我们有Concox TG06 GPS追踪器。我通过TCP从它接收数据,但我正在努力解码纬度和经度坐标(在C#中)。根据协议手册,从跟踪器(终端)到服务器的消息如下所示:
如您所见,纬度和经度坐标各为4个字节。再往下,手册解释了如何格式化这些坐标:
5.2.1.6纬度 消耗四个字节,定义位置数据的纬度值。该值的范围是0 - 162000000,表示范围为0°-90°。其转换方法如下: 将GPS模块输出的纬度和经度值转换为基于分钟的小数;将转换后的小数乘以30000;并将相乘的结果转换为十六进制。示例:22º32.7658'=(22X60 + 32.7658)X30000 = 40582974,然后转换为十六进制数40582974(十进制)= 26B3F3E(十六进制),最后值为0x02 0x6B 0x3F 0x3E
我真的很难向后解决这个问题 - 即从四个字节(0x02 0x6B 0x3F 0x3E)到纬度坐标(不一定是度数和分钟,因为我在我的代码中使用十进制度数)。基本上我正在尝试创建一个shell看起来像这样的函数:
private double DecodeLat(byte[] latBytes)
{
double latitude;
// implementation
return latitude;
{
(显然经度相同)。我非常感谢任何帮助!
谢谢
答案 0 :(得分:2)
您可以按如下方式对其进行解码:
public static decimal DecodeLatitude(byte[] bytes)
{
decimal minutes = (bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3];
minutes /= 30000;
return minutes;
}
查看示例here。
答案 1 :(得分:1)
经度是4个字节 因为我不能看到我假设的实施 你尝试用
读取双倍BitConverter.ToDouble(Buffer, index);
double = 8字节
如果不是这种情况请在评论中告诉我
答案 2 :(得分:0)
对于conx协议,二进制数据的转换非常简单-您只需将4个二进制字节扫描为数字(小尾数-例如,只需简单转换为32位无符号整数),然后将该数字除以1800000.0。结果在decimal degrees中。南半球和西半球由符号定义,符号位于字节的特殊位,后跟坐标。
如果您无法通过设备进一步解析数据,请查看专门的云服务,这些服务可提供完整的协议解析并输出完整的解析后的JSON消息,例如this。
免责声明:我与flespi解析后端有关,我的意见可能会受到此产品的影响。
答案 3 :(得分:0)
以将十六进制纬度 0x027AC7EB
转换为度数为例。
您可以通过 4 个步骤进行转换:
将 Hex Lat 值转换为 Decimal:
0x027AC7EB
=> 41601003
将你得到的值除以 30000
:
41601003 / 30000 => 1,386.7001
除以 60
将值转换为度数:
1,386.7001 / 60 => 23.11166833333333 degrees
前缀 minus
或 plus
,具体取决于半球。
它是如何工作的?
对于纬度: - 北前缀 +
- 南前缀 -
对于经度: - 东前缀 +
- 西方前缀 -
您可以从 Course and Status
字节中提取这些定位值
例如。如果解码课程和状态字节的计算结果为 South
Latitude
,则最终纬度值为 -23.11166833333333 degrees
同样的过程适用于解码 Longitude
。