mirror of
https://github.com/traccar/traccar.git
synced 2025-01-09 04:07:38 +08:00
Merge branch 'master' of github.com:Snowbridge/traccar
This commit is contained in:
commit
2c4a87d08f
@ -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;
|
||||
}
|
||||
|
@ -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"));*/
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user