aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/traccar
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/traccar')
-rw-r--r--src/main/java/org/traccar/protocol/PstProtocolDecoder.java39
1 files changed, 35 insertions, 4 deletions
diff --git a/src/main/java/org/traccar/protocol/PstProtocolDecoder.java b/src/main/java/org/traccar/protocol/PstProtocolDecoder.java
index a7cb8ef5c..62cc203d2 100644
--- a/src/main/java/org/traccar/protocol/PstProtocolDecoder.java
+++ b/src/main/java/org/traccar/protocol/PstProtocolDecoder.java
@@ -16,11 +16,14 @@
package org.traccar.protocol;
import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import org.traccar.BaseProtocolDecoder;
import org.traccar.DeviceSession;
+import org.traccar.NetworkMessage;
import org.traccar.Protocol;
import org.traccar.helper.BitUtil;
+import org.traccar.helper.Checksum;
import org.traccar.helper.DateBuilder;
import org.traccar.model.Position;
@@ -33,6 +36,7 @@ public class PstProtocolDecoder extends BaseProtocolDecoder {
super(protocol);
}
+ public static final int MSG_ACK = 0x00;
public static final int MSG_STATUS = 0x05;
private Date readDate(ByteBuf buf) {
@@ -53,23 +57,50 @@ public class PstProtocolDecoder extends BaseProtocolDecoder {
return sign * (BitUtil.from(value, 16) + BitUtil.to(value, 16) / 10000.0) / 60;
}
+ private void sendResponse(
+ Channel channel, SocketAddress remoteAddress, long id, int version, long index, int type) {
+ if (channel != null) {
+
+ ByteBuf content = Unpooled.buffer();
+ content.writeInt((int) id);
+ content.writeByte(version);
+ content.writeInt((int) index);
+ content.writeByte(MSG_ACK);
+ content.writeByte(type);
+
+ int checksum = Checksum.crc16(Checksum.CRC16_XMODEM, content.nioBuffer());
+
+ ByteBuf response = Unpooled.buffer();
+ response.writeByte('(');
+ response.writeBytes(content);
+ content.release();
+ response.writeShort(checksum);
+ response.writeByte(')');
+
+ channel.writeAndFlush(new NetworkMessage(response, remoteAddress));
+
+ }
+ }
+
@Override
protected Object decode(
Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
ByteBuf buf = (ByteBuf) msg;
- String id = String.valueOf(buf.readUnsignedInt());
- DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id);
+ long id = buf.readUnsignedInt();
+ DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, String.valueOf(id));
if (deviceSession == null) {
return null;
}
- buf.readUnsignedByte(); // version
- buf.readUnsignedInt(); // index
+ int version = buf.readUnsignedByte();
+ long index = buf.readUnsignedInt();
int type = buf.readUnsignedByte();
+ sendResponse(channel, remoteAddress, id, version, index, type);
+
if (type == MSG_STATUS) {
Position position = new Position(getProtocolName());