Java で GPS デバイス リスナーをコーディングしようとしています。
これを行っている間、CRC-ITU エラー チェック用の正しいコードを開発することができません。プロトコル ドキュメントからの crc コード生成の説明は次のとおりです。
チェックコードは、受信した情報が間違っているかどうかを識別するために、端末またはサーバーによって使用される場合があります。データ伝送中に発生するエラーを防止するために、データの誤操作に対するエラーチェックが追加され、システムの安全性と効率性が向上します。チェックコードは、CRC-ITU チェック方式で生成されます。プロトコルの構造のうち、Packet Length から Information Serial Number までのデータ(「Packet Length」と「Information Serial Number」を含む)のチェックコードは、CRC-ITU の値です。受信した情報を計算するときに CRC エラーが発生した場合、受信側はデータ パケットを無視して破棄します。
これはデータリスナークラスです
byte[] data = new byte[20];
System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("Just connected to " + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println("in = " + in);
int packetSize = in.read(data, 0, data.length);
StringBuilder sb1 = new StringBuilder();
for (byte b : data) {
sb1.append(String.format("%02X ", b));
}
System.out.println("loginpacketHex = " + sb1.toString());
for (byte b : data) {
System.out.println("loginpacketinbytes = " + b);
}
NewClass cl = new NewClass();
byte[] t = new byte[4];
byte[] f = new byte[10];
t[0] = 0x05;
t[1] = data[3];
System.out.println(" t[1] = " + t[1]);
t[2] = data[data[2] - 6 + 5];
System.out.println("t[2] = " + t[2]);
t[3] = data[data[2] - 5 + 5];
System.out.println("t[3] = " + t[3]);
cl.set(t);
short x = cl.get();
f[0] = 0x78;
f[1] = 0x78;
f[2] = 0x05;
f[3] = data[3];
f[4] = data[data[2] - 6 + 5];
f[5] = data[data[2] - 5 + 5];
f[6] = (byte) ((x >> 8) & 0xff);
f[7] = (byte) (x & 0xff);
f[8] = 0x0d;
f[9] = 0x0a;
Crc生成クラスです
public class NewClass {
public static int crc;
public static int[] table = {
0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78,};
public short get() {
short c;
int y;
y = ~crc;
c = (short) y;
return c;
}
public void set(byte[] bytes) {
crc = 0xffff;
for (byte b : bytes) {
crc = (crc >>> 8) ^ table[(crc ^ b) & 0xff];
}
}
}
Incoming data string comes in following format
Example of data packet sent by the terminal 78 78 0D 01 01 23 45 67 89 01 23 45 00 01 8C DD 0D 0A
Explanation
Start Bit - 0x78 0x78
Length - 0x0D
Protocol - 0x01
Terminal ID - 0x01 0x23 0x45 0x67 0x89 0x01 0x23 0x45
Serial No - 0x00 0x01
Error - 0x8C 0xDD
Stop Bit - 0x0D 0x0A
私はこの更新されたコードのようにやっています。
ByteArrayOutputStream bytearrypacket = new ByteArrayOutputStream();
DataOutputStream responce = new DataOutputStream(bytearrypacket);
responce.writeByte(0x0D);
responce.writeByte(1);
responce.writeByte(0x03);
responce.writeByte(0x53);
responce.writeByte(0x49);
responce.writeByte(0x20);
responce.writeByte(0x49);
responce.writeByte(0x00);
responce.writeByte(0x05);
responce.writeByte(0x34);
responce.writeShort(2);
NewClass cl = new NewClass();
cl.set(bytearrypacket.toByteArray());
System.out.println("cl = " + cl.get());
System.out.println("hexhexhex = " + Integer.toHexString(cl.get()));
responce.writeShort(cl.get());
byte[] res = bytearrypacket.toByteArray();
for (byte b : res) {
System.out.println("b = " + b);
}