Поддержка Sat-Lite3

Zhanbolat217 years ago

Добрый день! У меня проблема следующего рода. На автомобиле установлен девайс Sat-Lite 3. По умолчанию traccar не имеет поддержку этого девайса. Было решено переписать неиспользуемый протокол, схожий с протоколом девайса.Протокол девайса. Выбрал Gt02. В целях тестирование и вывода добавил следующий код:

        ChannelBuffer buf = (ChannelBuffer) msg;
        int crc = buf.readUnsignedShort();
        int preamble = buf.readUnsignedShort();
        long trackerId = buf.readUnsignedInt();
        int dataLen = buf.readUnsignedShort();
        int crcHeader = buf.readUnsignedShort();
        int serialId = buf.readUnsignedShort();
        long timestamp = buf.readUnsignedInt();
        int packetType = buf.readUnsignedShort();
        int packetLength = buf.readUnsignedShort();
        long x = (buf.readUnsignedInt() * 90) / 0xFFFFFFFF;
        long y = (buf.readUnsignedInt()* 180) / 0xFFFFFFFF;
        Log.debug(String.valueOf(x));
        Log.debug(String.valueOf(timestamp));
        Log.debug(String.valueOf(y));

Тестируемые данные верны. Но координаты получаемые в результате не верны.
Вопрос: в каком направлений искать ошибку? И есть ли более подходящие протоколы? Буду рад скорым ответам.

Anton Tananaev7 years ago

Откуда вы формулу подсчета координат взяли? Написано что значение хранится "в соответсвии с правилами ЕГТС". У вас есть эти правила? Также не совсем понятно зачем на 0xFFFFFFFF делить.

Zhanbolat217 years ago

У меня формула подсчета. И она равна указанной.

Zhanbolat217 years ago

По этой же формуле, с такой же структурой, и с теми же данными поэксперимонтировал на PHP скрипте. Там координаты нормально выводятся и указывают туда, куда надо.

Anton Tananaev7 years ago

Хотелось бы увидеть документацию откуда вы взяли формулу.

Zhanbolat217 years ago
Anton Tananaev7 years ago

Попробуйте делить на 0xFFFFFFFFL.

Zhanbolat217 years ago

При компиляций выходит такое сообщения, и остается.
INFO 8/3/17 4:26 PM: liquibase: Waiting for changelog lock....

Anton Tananaev7 years ago

Похоже что база заблокирована. Удалите файл и попробуйте еще раз.

Zhanbolat217 years ago

Попробовал делить на 0xFFFFFFFFL. Вывод сделал через Log::error(). Получил следующий лог. Он всегда разделяет на 2, входящее количество данных.

2017-08-03 17:04:41 ERROR: 34
2017-08-03 17:04:41 ERROR: 808465976
2017-08-03 17:04:41 ERROR: 35
2017-08-03 17:04:41  WARN: Unknown device - 934633030313730 (192.168.1.16)
2017-08-03 17:04:41 ERROR: 16
2017-08-03 17:04:41 ERROR: 875573296
2017-08-03 17:04:41 ERROR: 33
2017-08-03 17:04:41  WARN: Unknown device - 131303531373133 (192.168.1.16)

Пример посланных данных

678b2c8a6cbe0d00680280b4452177c97a594c00170000dfa79480357f6d0002020be40c5400060c000b00037f0101a1051713050201869cff03745563594c00170000bfbf94006a
Anton Tananaev7 years ago

Значит у вас проблема с frame decoder'ом.

Zhanbolat217 years ago

В протоколе Gt02 frameDecoder - LengthFieldBasedFrameDecoder.
Класс расположен где то внутри самой Java.


pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(256, 1, 1, 2, 0));
pipeline.addLast("objectDecoder", new Gt02ProtocolDecoder(Gt02Protocol.this));

Получается я должен его заменить?

Anton Tananaev7 years ago

Скорее всего нужно параметры задать корректные. Либо заменить на другой или свой класс.

Я советую вам изучить документацию на Netty 3. Похоже что вы не совсем понимаете как система работает.

Zhanbolat217 years ago

Добрый день. Я сейчас переписываю свой класс для Sat-Lite 3. По протоколу, есть преамбула, который должен быть всегда, 0x8A2C. Тестовые данные, которые я передаю, правильные, все соответствует, но у меня не получается получить преамбулу как надо. Не подскажете, где я ошибаюсь. Код такой

protected Object decode( Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {

        Log.debug("DEBUGS PROTOCAL DECODER");
        ChannelBuffer buf = (ChannelBuffer) msg;

        Log.debug("BUF-HEX: " + buf.toString(Charset.defaultCharset()));

        ChannelBuffer crc = buf.readBytes(4);
        Log.debug("CRC-HEX: " + crc.toString(Charset.defaultCharset()));

        ChannelBuffer preamble = buf.readBytes(4);
        Log.debug("preamble: "+ChannelBuffers.swapShort(buf.readShort()));
        Log.debug("8a2c: "+String.valueOf(0x8a2c));

Передаваемые байты BIG ENDIAN. Мне надо его перевести в Little Endian?

Anton Tananaev7 years ago

Не понял у вас преамбула 2 байта или 4? Неясно зачем swapShort нужен. В HEX данных она есть?