0

私は TK06A GPS トラッカーを使用しており、独自のサーバー Java ファイルを開発しており、TK06A マニュアルに従って最初のログイン メッセージ パケットを受信しました。GPS メッセージ パケットを取得するためにデバイスに ack を送り返す必要があります。

座標を保持する GPS メッセージ パケットを取得できません。以下のコードを追加しています。LOCでIMEI番号を取得するまでは正しいと確信しており、出力ストリーム/ ACkの送信に問題があります。私はここで完全に打たれました。どこが間違っているのかわかりません。

親切に助けてください!

public void run() {
DataInputStream inputS = null;
DataOutputStream dos = null;
try {
    inputS = new DataInputStream(socket.getInputStream());
    if (inputS.available() > 0) {
        byte[] bb = getBytesFromInputStream(inputS);
        ChannelBuffer buf = toByteBuffer(bb);
        String imei = readImei(buf);
        System.out.println("IMEI::::: " + imei);
        buf.skipBytes(5); // End

        OutputStream os = socket.getOutputStream();
        dos = new DataOutputStream(os);
        byte[] response = parseHex();

        dos.write(response);
        Thread.sleep(1000);
        dos.flush();

    }

} catch (Exception e) {
    e.printStackTrace();
}

finally {
    try {
        inputS.close();
        if (dos != null)
            dos.close();
        socket.close();
    } catch (IOException e) {

    }
}

}

public byte[] parseHex() {
    String  hexACKlogin = "787805010001D9DC0D0A"; // String in HEX format
    int len = hexACKlogin.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(hexACKlogin.charAt(i), 16) << 4)
                             + Character.digit(hexACKlogin.charAt(i+1), 16));
    }  
     return data;
}
4

1 に答える 1

0

GPS 追跡デバイス (TK06A) のロジックを実装しています。クライアントは、トラッカーから送信されたデータを読み取るために使用している GPS トラッカーおよびサーバーです。

座標/緯度と経度を含まないログイン メッセージ パケットであることがわかった 18 バイトのデータを受信して​​います。

クライアントに ACK 応答を送信する必要があると言われています [ここで立ち往生しています]。

私の場合、クライアントへの応答としてバイトを送信する必要があります Gps tracker the byte[] response = {0x78 0x78 0x05 0x01 0x00 0x01 0xD9 0xDC 0x0D 0x0A};

portpeeker を使用して ack を送信しましたが、36 バイトの応答が返されました。

PS: データ転送に TCP を使用しています

try {
        inputS = new DataInputStream(socket.getInputStream());
        oos = new ObjectOutputStream(socket.getOutputStream());
        if (inputS.available() > 0) {
            System.out.println("Bytes Cap::: "+inputS.available());
            byte[] bb = getBytesFromInputStream(inputS);
            ChannelBuffer buf = toByteBuffer(bb);
            buf.skipBytes(4);
            String imei = readImei(buf);
            System.out.println("IMEI::::: " + imei);
            buf.skipBytes(5); // End

            byte[] response = sendOutputMessage();
            oos.write(response);
            oos.flush();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        try {
            inputS.close();
            oos.close();
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

 public byte[] sendOutputMessage() {
    byte buf[] = new byte[10];
    // Start of the body of setOutput
    // Message type  0x78 0x78 0x05 0x01 0x00 0x01 0xD9 0xDC 0x0D 0x0A
    buf[0] = (byte) 0x78;
    buf[1] = (byte) 0x78;
    buf[2] = (byte) 0x05;
    buf[3] = (byte) 0x01;
    buf[4] = (byte) 0x00;
    buf[5] = (byte) 0x01;
    buf[6] = (byte) 0xD9;
    buf[7] = (byte) 0xDC;
    buf[8] = (byte) 0x0D; // end f1
    buf[9] = (byte) 0x0A;
    return buf;
}
于 2014-12-28T14:33:45.823 に答える