解码Concox TR06 GPS跟踪器的4字节纬度/ 4个经度

时间:2016-09-16 10:20:19

标签: c# gps

我们有Concox TG06 GPS追踪器。我通过TCP从它接收数据,但我正在努力解码纬度和经度坐标(在C#中)。根据协议手册,从跟踪器(终端)到服务器的消息如下所示:

Concox TR06 position protocol

如您所见,纬度和经度坐标各为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;
{

(显然经度相同)。我非常感谢任何帮助!

谢谢

4 个答案:

答案 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 个步骤进行转换:

  1. 将 Hex Lat 值转换为 Decimal: 0x027AC7EB => 41601003

  2. 将你得到的值除以 30000: 41601003 / 30000 => 1,386.7001

  3. 除以 60 将值转换为度数: 1,386.7001 / 60 => 23.11166833333333 degrees

  4. 前缀 minusplus,具体取决于半球。

    它是如何工作的?

    对于纬度: - 北前缀 + - 南前缀 -

    对于经度: - 东前缀 + - 西方前缀 -

    您可以从 Course and Status 字节中提取这些定位值

例如。如果解码课程和状态字节的计算结果为 South Latitude,则最终纬度值为 -23.11166833333333 degrees

同样的过程适用于解码 Longitude