From 826af6579290e9c96a5958115a017297fa6d7f79 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 12 Apr 2019 22:16:30 -0700 Subject: Implement Xirgo UDP response --- .../org/traccar/protocol/XirgoProtocolDecoder.java | 18 +++++++++++++++++- .../org/traccar/protocol/XirgoProtocolDecoderTest.java | 3 +++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/traccar/protocol/XirgoProtocolDecoder.java b/src/main/java/org/traccar/protocol/XirgoProtocolDecoder.java index 6d215e672..08809307f 100644 --- a/src/main/java/org/traccar/protocol/XirgoProtocolDecoder.java +++ b/src/main/java/org/traccar/protocol/XirgoProtocolDecoder.java @@ -16,9 +16,11 @@ package org.traccar.protocol; import io.netty.channel.Channel; +import io.netty.channel.socket.nio.NioDatagramChannel; import org.traccar.BaseProtocolDecoder; import org.traccar.Context; import org.traccar.DeviceSession; +import org.traccar.NetworkMessage; import org.traccar.Protocol; import org.traccar.helper.DateBuilder; import org.traccar.helper.Parser; @@ -27,6 +29,7 @@ import org.traccar.helper.UnitsConverter; import org.traccar.model.Position; import java.net.SocketAddress; +import java.util.regex.Matcher; import java.util.regex.Pattern; public class XirgoProtocolDecoder extends BaseProtocolDecoder { @@ -174,6 +177,15 @@ public class XirgoProtocolDecoder extends BaseProtocolDecoder { Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { String sentence = (String) msg; + + if (channel instanceof NioDatagramChannel) { + Matcher matcher = Pattern.compile("\\$\\$\\d+,(\\d+),.*,(\\d+)##").matcher(sentence); + if (matcher.matches()) { + String response = "!UDP_ACK," + matcher.group(1) + "," + matcher.group(2); + channel.writeAndFlush(new NetworkMessage(response, remoteAddress)); + } + } + if (form != null) { return decodeCustom(channel, remoteAddress, sentence); } else { @@ -188,10 +200,14 @@ public class XirgoProtocolDecoder extends BaseProtocolDecoder { String[] keys = form.split(","); String[] values = sentence.replace("$$", "").replace("##", "").split(","); + if (values.length < keys.length) { + return null; + } + Position position = new Position(getProtocolName()); DateBuilder dateBuilder = new DateBuilder(); - for (int i = 0; i < Math.min(keys.length, values.length); i++) { + for (int i = 0; i < keys.length; i++) { switch (keys[i]) { case "UID": case "IM": diff --git a/src/test/java/org/traccar/protocol/XirgoProtocolDecoderTest.java b/src/test/java/org/traccar/protocol/XirgoProtocolDecoderTest.java index f795742fd..d85364d22 100644 --- a/src/test/java/org/traccar/protocol/XirgoProtocolDecoderTest.java +++ b/src/test/java/org/traccar/protocol/XirgoProtocolDecoderTest.java @@ -12,6 +12,9 @@ public class XirgoProtocolDecoderTest extends ProtocolTest { decoder.setForm("UID,EV,D,T,LT,LN,AL,GSPT,HD,SV,HP,BV,CQ,GS,SI,IG,OT"); + verifyNull(decoder, text( + "$$184800619,6115,Y1z1.1179AA2.3.7c79d34,,,000##")); + verifyPosition(decoder, text( "$$183900034,4002,03/30/2019,02:15:22,46.848577,-114.022213,978,0.0,172.3,16,1.2,13.291,20,3,2,2,1##")); -- cgit v1.2.3