Мы пытаемся закодировать прослушиватель устройства GPS на Java.
При этом мы не можем разработать правильный код для проверки ошибок CRC-ITU. Объяснение генерации кода CRC из документа протокола приведено ниже.
Проверочный код может использоваться терминалом или сервером, чтобы определить, является ли полученная информация ошибочной или нет. Чтобы предотвратить ошибки, возникающие во время передачи данных, добавлена проверка ошибок против неправильной обработки данных, чтобы повысить безопасность и эффективность системы. Код проверки генерируется методом проверки CRC-ITU. Контрольные коды данных в структуре протокола, от длины пакета до серийного номера информации (включая «Длина пакета» и «Серийный номер информации»), являются значениями 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);
}
D9 DC
, правильный. Ваша проблема в другом. - person Mark Adler   schedule 17.09.201405 01 00 01
, и этоD9DC
. Таким образом, значение проверки пакета правильное. - person Mark Adler   schedule 18.09.2014get()
класса NewClass с ужасным названием возвращаетshort
, что составляет 16 бит. Следовательно, это не может бытьffffd9dc
. Это может быть толькоd9dc
.ffffd9dc
— это то, что вы получите, если присвоитеshort
d9dc
int
. Знак будет расширен (поскольку в Java есть только целые числа со знаком), что даст вамint
сffffd9dc
. Вы можете избавиться от расширения знака с помощью& 0xffff
. Или вы можете сохранить его вshort
, так как он был предоставлен изначально. - person Mark Adler   schedule 18.09.2014int
, поскольку доступ к байтам будет осуществляться с помощью(value >> 8) & 0xff
иvalue & 0xff
, как в коде вопроса, который также удаляет биты расширения знака. - person Mark Adler   schedule 18.09.2014