Merge branch 'master' of github.com:Snowbridge/traccar

This commit is contained in:
Leo Sadovsky 2023-01-26 20:34:30 +03:00
commit 2c4a87d08f
2 changed files with 59 additions and 9 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2013 - 2022 Anton Tananaev (anton@traccar.org)
* Copyright 2013 - 2023 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -22,9 +22,11 @@ import io.netty.channel.Channel;
import org.traccar.BaseProtocolDecoder;
import org.traccar.NetworkMessage;
import org.traccar.Protocol;
import org.traccar.config.Keys;
import org.traccar.helper.BitBuffer;
import org.traccar.helper.BitUtil;
import org.traccar.helper.UnitsConverter;
import org.traccar.helper.model.AttributeUtil;
import org.traccar.model.Position;
import org.traccar.session.DeviceSession;
@ -47,6 +49,17 @@ public class GalileoProtocolDecoder extends BaseProtocolDecoder {
}
private ByteBuf photo;
private boolean compressed;
public void setCompressed(boolean compressed) {
this.compressed = compressed;
}
public boolean getCompressed(long deviceId) {
Boolean value = AttributeUtil.lookup(
getCacheManager(), Keys.PROTOCOL_EXTENDED.withPrefix(getProtocolName()), deviceId);
return value != null ? value : compressed;
}
private static final Map<Integer, Integer> TAG_LENGTH_MAP = new HashMap<>();
@ -299,8 +312,34 @@ public class GalileoProtocolDecoder extends BaseProtocolDecoder {
buf.readUnsignedInt(); // accuracy
buf.readUnsignedByte(); // data tag header
// ByteBuf data = buf.readSlice(buf.readUnsignedShort());
// decodeMinimalDataSet(position, data);
ByteBuf data = buf.readSlice(buf.readUnsignedShort());
if (getCompressed(deviceSession.getDeviceId())) {
decodeMinimalDataSet(position, data);
int[] tags = new int[BitUtil.to(data.readUnsignedByte(), 8)];
for (int i = 0; i < tags.length; i++) {
tags[i] = data.readUnsignedByte();
}
for (int tag : tags) {
decodeTag(position, data, tag);
}
} else {
while (data.isReadable()) {
int tag = data.readUnsignedByte();
if (tag == 0x30) {
position.setValid((data.readUnsignedByte() & 0xf0) == 0x00);
position.setLatitude(data.readIntLE() / 1000000.0);
position.setLongitude(data.readIntLE() / 1000000.0);
} else {
decodeTag(position, data, tag);
}
}
}
return position;
}

View File

@ -10,12 +10,6 @@ public class GalileoProtocolDecoderTest extends ProtocolTest {
var decoder = inject(new GalileoProtocolDecoder(null));
verifyPosition(decoder, binary(
"01004e01001c0747ea59333030323334303639363034353930000012000063c85e6903000b0321a8f846aba50000000202001e205f5ec863300c4643fdfdbbe6c8fb330000000034e7013505d400000000"));
verifyNotNull(decoder, binary(
"01006501001c05cf1f8133303032333430363939303130313000004a000062d8f3ee03000b000f85402088970000000602003503333030323334303639393031303130100000207af3d862300cbe08ee00acfaf001330000760634b301350840090a416b2f42920e"));
verifyPositions(decoder, binary(
"011801018202130338363833343530333230343234323604640010a406207caa9f5b300c830a7901ca0ec802330000000034b802350540003e41703f422b1043234504004600e09000000000a000a100a200a300a400a500a600a700a800a900aa00ab00ac00ad00ae00af00b00000b10000b20000b30000b40000b50000b60000b70000b80000b90000c000000000c100000000c200000000c300000000c400c500c600c700c800c900ca00cb00cc00cd00ce00cf00d000d100d200d4d3140000d60000d70000d80000d90000da0000db00000000dc00000000dd00000000de00000000df00000000f000000000f100000000f200000000f300000000f400000000f500000000f600000000f700000000f800000000f9000000008960"));
@ -51,4 +45,21 @@ public class GalileoProtocolDecoderTest extends ProtocolTest {
}
@Test
public void testDecodeIridium() throws Exception {
var decoder = inject(new GalileoProtocolDecoder(null));
decoder.setCompressed(false);
verifyPosition(decoder, binary(
"01004e01001c0747ea59333030323334303639363034353930000012000063c85e6903000b0321a8f846aba50000000202001e205f5ec863300c4643fdfdbbe6c8fb330000000034e7013505d400000000"));
/*decoder.setCompressed(true);
verifyPosition(decoder, binary(
"01003a01001c07553e40333030323334303639363034353930020021000063d1921c03000b0321ac2c4545b20000009f02000ac200000000db00000000"));*/
}
}