【问题标题】:TK06a GPS Tracker Protocol : Long/Lat FormatTK06a GPS 追踪器协议:Long/Lat 格式
【发布时间】:2014-12-29 22:36:26
【问题描述】:

我有一个带有 TK06a 芯片组的 GPS 跟踪器,我有自己的 tcp 监听器,一切正常,我从设备收到了这种格式的数据:

#355488020131775##1#0000#AUT#01#52500100232a47#10341.175280,E,121.322800,N,0.28,0.00#111113#171607.000##

我想我知道这些是什么,(例如第一个是 IMEI),但我不知道如何将 (10341.175280,E) 和 (121.322800,N) 转换为谷歌地图可以理解的东西.

设备旁边的用户手册很差,没有协议文档。

真正的位置应该在这里(1.355269,103.686426)也许这可以引导你解开这个谜团:)

提前致谢。

编辑:

我在网上找到了这个,也许有人会觉得它有用:

上面一行的解码。

  1. IMEI号不能为空,如果SIM卡号作为设备序列号,则IMEI部分的数据要填写 SIM 卡号码。
  2. SIM卡号:此部分可以为空,也可以和第1点一样,填写SIM卡号。
  3. 0或1,保留(原意为ACC状态)
  4. 设备密码(0-9位数字,不能超过6位,一般为4位)
  5. 保留字 AUT,无法更改。
  6. 数据的数量,00-99,2 位数。

每个数据的格式如下:

#base station number#Longitude, East and West identification, latitude,North and South identification,speed(nm), direction angle(0-360)#date#time
  1. 基站号可以为空。
  2. 经度,格式:dddff.ffff,度数部分必须是3个整数,分部分必须是2个整数,小数部分是 4 位数字,度和分之间没有分隔符。
  3. 东西方标识,只有一个字符,E/W。
  4. 纬度,格式:ddff.ffff,与经度相同,只有度数部分为2个整数。
  5. 南北标识,只有一个字符,N/S。
  6. 速度:可以为 0。
  7. 方向:可以为 0。
  8. 日期、格式:ddmmyy。
  9. 时间,格式:hhnnss.mmm,小数点前应依次为时、分、秒,各为2位,后部分 小数点应该是毫秒,可以是000。

【问题讨论】:

  • 似乎我有相同的设备,但是在我收到第一个数据包后,它只会继续发送 IMEI。您是否通过 TCP 向设备重放一些代码?
  • 嗨 Mr.Phoenix,即使从设备中正确获取数据,我也遇到了问题。我正在使用Java,我得到的只是垃圾字符。您能否发布您的代码 sn-p,因为您是如何获得这种十六进制格式的?我正在使用TK06A芯片和java进行监听。

标签: gps format latitude-longitude


【解决方案1】:

这种格式类似于 NMEA RMC 消息中的 DM,但缺少前导 0:

给定经度:10341.175280 E

前 3 位数字是度数:103
然后剩下的就是分钟:41.175280
现在是格式“DM”度数和小数分钟。
Google 使用“DEG”(十进制度)
转换:103 + 41.175280 / 60.0 = 103.686254 (DEG = 度 + 分 / 60.0)
非常适合您的位置

现在有点奇怪:
它应该是“0121.322800”而不是“121.322800”
但是与上面类似,但由于纬度限制为两位数:
前 2 位数字始终是度数:01
然后剩下的就是分钟:21.322800
与上述相同的形式:lat= 1 + 21.322800 / 60.0 = 1,35538​​

finally:如果是 W 或 S,则将 deg 值乘以 -1 (在你的情况下它是 N 和 E,所以它保持原样 - 积极)

这种格式部分看起来像 NMEA RMC 语句

【讨论】:

    【解决方案2】:

    我认为您希望使用 OpenGTS 来完成这项工作。

    所以在这里我做了什么工作:(注意我不需要 tk10x 设备所以我覆盖了文件,如果你愿意,你可以创建另一个类)

    转到 $GTS_HOME/src/org/opengts/servers/tk10x

    并使用此代码更改 TrackServer.java

    我写了一个新的 parseInsertFunction

    package org.opengts.servers.tk10x;
    
    import java.lang.*;
    import java.util.*;
    import java.io.*;
    import java.net.*;
    import java.sql.*;
    
    import org.opengts.util.*;
    import org.opengts.db.*;
    import org.opengts.db.tables.*;
    
    public class TrackServer
    {
    
    // ------------------------------------------------------------------------
    // initialize runtime configuration
    
    public static void configInit()
    {
        DCServerConfig dcs = Main.getServerConfig();
        if (dcs != null) {
            TrackServer.setTcpIdleTimeout(   dcs.getTcpIdleTimeoutMS(      Constants.TIMEOUT_TCP_IDLE   ));
            TrackServer.setTcpPacketTimeout( dcs.getTcpPacketTimeoutMS( Constants.TIMEOUT_TCP_PACKET ));
            TrackServer.setTcpSessionTimeout(dcs.getTcpSessionTimeoutMS(Constants.TIMEOUT_TCP_SESSION));
            TrackServer.setUdpIdleTimeout(   dcs.getUdpIdleTimeoutMS(   Constants.TIMEOUT_UDP_IDLE   ));
            TrackServer.setUdpPacketTimeout( dcs.getUdpPacketTimeoutMS( Constants.TIMEOUT_UDP_PACKET ));
            TrackServer.setUdpSessionTimeout(dcs.getUdpSessionTimeoutMS(Constants.TIMEOUT_UDP_SESSION));
        }
    }
    
    // ------------------------------------------------------------------------
    // Start TrackServer (TrackServer is a singleton)
    
    private static TrackServer trackServerInstance = null;
    
    /* start TrackServer on array of ports */
    public static TrackServer startTrackServer(int tcpPorts[], int udpPorts[], int commandPort)
        throws Throwable
    {
        if (trackServerInstance == null) {
            trackServerInstance = new TrackServer(tcpPorts, udpPorts, commandPort);
        } else {
            //Print.logError("TrackServer already initialized!");
        }
        return trackServerInstance;
    }
    
    public static TrackServer getTrackServer()
    {
        return trackServerInstance;
    }
    
    // ------------------------------------------------------------------------
    // TCP Session timeouts
    
    /* idle timeout */
    private static long tcpTimeout_idle     = Constants.TIMEOUT_TCP_IDLE;
    public static void setTcpIdleTimeout(long timeout)
    {
        TrackServer.tcpTimeout_idle = timeout;
    }
    public static long getTcpIdleTimeout()
    {
        return TrackServer.tcpTimeout_idle;
    }
    
    /* inter-packet timeout */
    private static long tcpTimeout_packet   = Constants.TIMEOUT_TCP_PACKET;
    public static void setTcpPacketTimeout(long timeout)
    {
        TrackServer.tcpTimeout_packet = timeout;
    }
    public static long getTcpPacketTimeout()
    {
        return TrackServer.tcpTimeout_packet;
    }
    
    /* total session timeout */
    private static long tcpTimeout_session  = Constants.TIMEOUT_TCP_SESSION;
    public static void setTcpSessionTimeout(long timeout)
    {
        TrackServer.tcpTimeout_session = timeout;
    }
    public static long getTcpSessionTimeout()
    {
        return TrackServer.tcpTimeout_session;
    }
    
    // ------------------------------------------------------------------------
    // UDP Session timeouts
    
    /* idle timeout */
    private static long udpTimeout_idle     = Constants.TIMEOUT_UDP_IDLE;
    public static void setUdpIdleTimeout(long timeout)
    {
        TrackServer.udpTimeout_idle = timeout;
    }
    public static long getUdpIdleTimeout()
    {
        return TrackServer.udpTimeout_idle;
    }
    
    /* inter-packet timeout */
    private static long udpTimeout_packet   = Constants.TIMEOUT_UDP_PACKET;
    public static void setUdpPacketTimeout(long timeout)
    {
        TrackServer.udpTimeout_packet = timeout;
    }
    public static long getUdpPacketTimeout()
    {
        return TrackServer.udpTimeout_packet;
    }
    
    /* total session timeout */
    private static long udpTimeout_session  = Constants.TIMEOUT_UDP_SESSION;
    public static void setUdpSessionTimeout(long timeout)
    {
        TrackServer.udpTimeout_session = timeout;
    }
    public static long getUdpSessionTimeout()
    {
        return TrackServer.udpTimeout_session;
    }
    
    // ------------------------------------------------------------------------
    // ------------------------------------------------------------------------
    
    // TCP port listener threads
    private java.util.List<ServerSocketThread> tcpThread = new Vector<ServerSocketThread>();
    
    // UDP port listener threads
    private java.util.List<ServerSocketThread> udpThread = new Vector<ServerSocketThread>();
    
    // Command port listener thread
    private ServerSocketThread cmdThread = null;
    private DatagramSocket     udpSocket = null;
    
    // ------------------------------------------------------------------------
    
    /* private constructor */
    private TrackServer(int tcpPorts[], int udpPorts[], int commandPort)
        throws Throwable
    {
        int listeners = 0;
    
        // Start TCP listeners
        if (!ListTools.isEmpty(tcpPorts)) {
            for (int i = 0; i < tcpPorts.length; i++) {
                int port = tcpPorts[i];
                if (ServerSocketThread.isValidPort(port)) {
                    try {
                        this._startTCP(port);
                        listeners++;
                    } catch (java.net.BindException be) {
                        Print.logError("TCP: Error binding to port: %d", port);
                    }
                } else {
                    throw new Exception("TCP: Invalid port number: " + port);
                }
            }
        }
    
        // Start UDP listeners
        if (!ListTools.isEmpty(udpPorts)) {
            for (int i = 0; i < udpPorts.length; i++) {
                int port = udpPorts[i];
                if (ServerSocketThread.isValidPort(port)) {
                    try {
                        ServerSocketThread sst = this._startUDP(port);
                        if (this.udpSocket == null) {
                            this.udpSocket = sst.getDatagramSocket();
                        }
                        listeners++;
                    } catch (java.net.BindException be) {
                        Print.logError("UDP: Error binding to port: %d", port);
                    }
                } else {
                    throw new Exception("UDP: Invalid port number: " + port);
                }
            }
        }
    
        /* do we have any active listeners? */
        if (listeners <= 0) {
            Print.logWarn("No active device communication listeners!");
        }
    
    }
    
    // ------------------------------------------------------------------------
    
    /* start TCP listener */
    private void _startTCP(int port)
        throws Throwable
    {
        ServerSocketThread sst = null;
    
        /* create server socket */
        try {
            sst = new ServerSocketThread(port);
        } catch (Throwable t) { // trap any server exception
            Print.logException("ServerSocket error", t);
            throw t;
        }
    
        /* initialize */
        sst.setTextPackets(Constants.ASCII_PACKETS);
        sst.setBackspaceChar(null); // no backspaces allowed
        sst.setLineTerminatorChar(Constants.ASCII_LINE_TERMINATOR);
        sst.setIgnoreChar(Constants.ASCII_IGNORE_CHARS);
        sst.setMaximumPacketLength(Constants.MAX_PACKET_LENGTH);
        sst.setMinimumPacketLength(Constants.MIN_PACKET_LENGTH);
        sst.setIdleTimeout(TrackServer.tcpTimeout_idle);         // time between packets
        sst.setPacketTimeout(TrackServer.tcpTimeout_packet);     // time from start of packet to packet completion
        sst.setSessionTimeout(TrackServer.tcpTimeout_session);   // time for entire session
        sst.setTerminateOnTimeout(Constants.TERMINATE_ON_TIMEOUT);
        sst.setClientPacketHandlerClass(TrackClientPacketHandler.class);
        sst.setLingerTimeoutSec(Constants.LINGER_ON_CLOSE_SEC);
    
        /* start thread */
        Print.logInfo("Starting TCP listener thread on port " + port + " [timeout=" + sst.getSessionTimeout() + "ms] ...");
        sst.start();
        this.tcpThread.add(sst);
    
    }
    
    // ------------------------------------------------------------------------
    
    /* start UDP listener */
    private ServerSocketThread _startUDP(int port)
        throws Throwable
    {
        ServerSocketThread sst = null;
    
        /* create server socket */
        try {
            sst = new ServerSocketThread(ServerSocketThread.createDatagramSocket(port));
        } catch (Throwable t) { // trap any server exception
            Print.logException("ServerSocket error", t);
            throw t;
        }
    
        /* initialize */
        sst.setTextPackets(Constants.ASCII_PACKETS);
        sst.setBackspaceChar(null); // no backspaces allowed
        sst.setLineTerminatorChar(Constants.ASCII_LINE_TERMINATOR);
        sst.setIgnoreChar(Constants.ASCII_IGNORE_CHARS);
        sst.setMaximumPacketLength(Constants.MAX_PACKET_LENGTH);
        sst.setMinimumPacketLength(Constants.MIN_PACKET_LENGTH);
        sst.setIdleTimeout(TrackServer.udpTimeout_idle);
        sst.setPacketTimeout(TrackServer.udpTimeout_packet);
        sst.setSessionTimeout(TrackServer.udpTimeout_session);
        sst.setTerminateOnTimeout(Constants.TERMINATE_ON_TIMEOUT);
        sst.setClientPacketHandlerClass(TrackClientPacketHandler.class);
    
        /* start thread */
        Print.logInfo("Starting UDP listener thread on port " + port + " [timeout=" + sst.getSessionTimeout() + "ms] ...");
        sst.start();
        this.udpThread.add(sst);
        return sst;
    
    }
    
    public DatagramSocket getUdpDatagramSocket()
    {
        return this.udpSocket;
    }
    
    // ------------------------------------------------------------------------
    

    }`

    并在 Constant.java 中找到 'ASCII_LINE_TERMINATOR[]' 常量声明并将 '000' 添加到 with

    public static final int     ASCII_LINE_TERMINATOR[]     = new int[] { 
        // this list has been construction by observation of various data packets
        0x00, 0xFF, 0xCE, '\0', '\n', '\r', ')', ';',000
    };
    

    之后 cd $GTS_HOME 蚂蚁tk10x bin/runserver.sh -s tk10x

    这应该可以解决问题

    这是我创建的包的链接

    https://anonfiles.com/file/0aae22ccb3822618fb693cd667283b18

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多