diff options
-rw-r--r-- | src/org/traccar/protocol/Ardi01Protocol.java | 2 | ||||
-rw-r--r-- | src/org/traccar/protocol/Tk102Protocol.java | 10 | ||||
-rw-r--r-- | src/org/traccar/protocol/Tk102ProtocolDecoder.java | 68 | ||||
-rw-r--r-- | test/org/traccar/ProtocolTest.java | 2 | ||||
-rw-r--r-- | test/org/traccar/protocol/Tk102ProtocolDecoderTest.java | 45 |
5 files changed, 87 insertions, 40 deletions
diff --git a/src/org/traccar/protocol/Ardi01Protocol.java b/src/org/traccar/protocol/Ardi01Protocol.java index 5b7770647..66916db17 100644 --- a/src/org/traccar/protocol/Ardi01Protocol.java +++ b/src/org/traccar/protocol/Ardi01Protocol.java @@ -37,8 +37,8 @@ public class Ardi01Protocol extends BaseProtocol { @Override protected void addSpecificHandlers(ChannelPipeline pipeline) { pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("stringDecoder", new StringDecoder()); pipeline.addLast("objectDecoder", new Ardi01ProtocolDecoder(Ardi01Protocol.this)); } }); diff --git a/src/org/traccar/protocol/Tk102Protocol.java b/src/org/traccar/protocol/Tk102Protocol.java index 7310d23bd..ad3d8affa 100644 --- a/src/org/traccar/protocol/Tk102Protocol.java +++ b/src/org/traccar/protocol/Tk102Protocol.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2015 - 2016 Anton Tananaev (anton.tananaev@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,8 @@ package org.traccar.protocol; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.string.StringDecoder; -import org.jboss.netty.handler.codec.string.StringEncoder; +import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; import org.traccar.BaseProtocol; -import org.traccar.CharacterDelimiterFrameDecoder; import org.traccar.TrackerServer; import java.util.List; @@ -36,9 +34,7 @@ public class Tk102Protocol extends BaseProtocol { serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { @Override protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, ']')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 1 + 1 + 10, 1, 1, 0)); pipeline.addLast("objectDecoder", new Tk102ProtocolDecoder(Tk102Protocol.this)); } }); diff --git a/src/org/traccar/protocol/Tk102ProtocolDecoder.java b/src/org/traccar/protocol/Tk102ProtocolDecoder.java index bb7510eb1..58eb36cff 100644 --- a/src/org/traccar/protocol/Tk102ProtocolDecoder.java +++ b/src/org/traccar/protocol/Tk102ProtocolDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2013 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2013 - 2016 Anton Tananaev (anton.tananaev@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ */ package org.traccar.protocol; +import org.jboss.netty.buffer.ChannelBuffer; +import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.traccar.BaseProtocolDecoder; import org.traccar.DeviceSession; @@ -24,6 +26,7 @@ import org.traccar.helper.PatternBuilder; import org.traccar.model.Position; import java.net.SocketAddress; +import java.nio.charset.StandardCharsets; import java.util.regex.Pattern; public class Tk102ProtocolDecoder extends BaseProtocolDecoder { @@ -32,11 +35,18 @@ public class Tk102ProtocolDecoder extends BaseProtocolDecoder { super(protocol); } + public static final int MSG_LOGIN_REQUEST = 0x80; + public static final int MSG_LOGIN_REQUEST_2 = 0x21; + public static final int MSG_LOGIN_RESPONSE = 0x00; + public static final int MSG_HEARTBEAT_REQUEST = 0xF0; + public static final int MSG_HEARTBEAT_RESPONSE = 0xFF; + public static final int MSG_REPORT_ONCE = 0x90; + public static final int MSG_REPORT_INTERVAL = 0x93; + + public static final int MODE_GPRS = 0x30; + public static final int MODE_GPRS_SMS = 0x33; + private static final Pattern PATTERN = new PatternBuilder() - .text("[") - .expression(".") - .number("d{10}") - .expression(".") .text("(") .expression("[A-Z]+") .number("(dd)(dd)(dd)") // time @@ -45,25 +55,56 @@ public class Tk102ProtocolDecoder extends BaseProtocolDecoder { .number("(ddd)(dd.dddd)([EW])") // longitude .number("(ddd.ddd)") // speed .number("(dd)(dd)(dd)") // date (ddmmyy) - .number("d+") .any() .text(")") - .text("]").optional() .compile(); + private void sendResponse(Channel channel, int type, ChannelBuffer dataSequence, ChannelBuffer content) { + if (channel != null) { + ChannelBuffer response = ChannelBuffers.dynamicBuffer(); + response.writeByte('['); + response.writeByte(type); + response.writeBytes(dataSequence); + response.writeByte(content.readableBytes()); + response.writeBytes(content); + response.writeByte(']'); + channel.write(response); + } + } + @Override protected Object decode( Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - String sentence = (String) msg; + ChannelBuffer buf = (ChannelBuffer) msg; + + buf.skipBytes(1); // header + int type = buf.readUnsignedByte(); + ChannelBuffer dataSequence = buf.readBytes(10); + int length = buf.readUnsignedByte(); - if (sentence.startsWith("[!")) { + if (type == MSG_LOGIN_REQUEST || type == MSG_LOGIN_REQUEST_2) { - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, sentence.substring(14, 14 + 15)); - if (deviceSession != null && channel != null) { - channel.write("[”0000000001" + sentence.substring(13) + "]"); + ChannelBuffer data = buf.readBytes(length); + + String id; + if (type == MSG_LOGIN_REQUEST) { + id = data.toString(StandardCharsets.US_ASCII); + } else { + id = data.copy(1, 15).toString(StandardCharsets.US_ASCII); + } + + if (getDeviceSession(channel, remoteAddress, id) != null) { + ChannelBuffer response = ChannelBuffers.dynamicBuffer(); + response.writeByte(MODE_GPRS); + response.writeBytes(data); + sendResponse(channel, MSG_LOGIN_RESPONSE, dataSequence, response); } + } else if (type == MSG_HEARTBEAT_REQUEST) { + + sendResponse(channel, MSG_HEARTBEAT_RESPONSE, dataSequence, buf.readBytes(length)); + } else { DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); @@ -71,7 +112,7 @@ public class Tk102ProtocolDecoder extends BaseProtocolDecoder { return null; } - Parser parser = new Parser(PATTERN, sentence); + Parser parser = new Parser(PATTERN, buf.readBytes(length).toString(StandardCharsets.US_ASCII)); if (!parser.matches()) { return null; } @@ -92,6 +133,7 @@ public class Tk102ProtocolDecoder extends BaseProtocolDecoder { position.setTime(dateBuilder.getDate()); return position; + } return null; diff --git a/test/org/traccar/ProtocolTest.java b/test/org/traccar/ProtocolTest.java index 8211e9d6d..756393288 100644 --- a/test/org/traccar/ProtocolTest.java +++ b/test/org/traccar/ProtocolTest.java @@ -62,7 +62,7 @@ public class ProtocolTest extends BaseTest { } protected ChannelBuffer buffer(String... data) { - return ChannelBuffers.copiedBuffer(concatenateStrings(data), StandardCharsets.US_ASCII); + return ChannelBuffers.copiedBuffer(concatenateStrings(data), StandardCharsets.ISO_8859_1); } protected DefaultHttpRequest request(String url) { diff --git a/test/org/traccar/protocol/Tk102ProtocolDecoderTest.java b/test/org/traccar/protocol/Tk102ProtocolDecoderTest.java index 501466eeb..34ae1ab90 100644 --- a/test/org/traccar/protocol/Tk102ProtocolDecoderTest.java +++ b/test/org/traccar/protocol/Tk102ProtocolDecoderTest.java @@ -10,32 +10,41 @@ public class Tk102ProtocolDecoderTest extends ProtocolTest { Tk102ProtocolDecoder decoder = new Tk102ProtocolDecoder(new Tk102Protocol()); - verifyNothing(decoder, text( - "")); + verifyNothing(decoder, buffer( + "[\u00800000000000\u000821315452]")); - verifyNothing(decoder, text( - "[!0000000081r(353327023367238,TK102-W998_01_V1.1.001_130219,255,001,255,001,0,100,100,0,internet,0000,0000,0,0,255,0,4,1,11,00)")); + verifyNothing(decoder, buffer( + "[\u00f00000000000\u000821315452]")); + + verifyPosition(decoder, buffer( + "[\u00900100100001\u0036(ONE025857A2232.0729N11356.0030E000.02109110100000000)]")); + + verifyPosition(decoder, buffer( + "[\u00900100100001\u0036(ITV025857A2232.0729N11356.0030E000.02109110100000000)]")); + + verifyNothing(decoder, buffer( + "[\u00210000000081\u0072(353327023367238,TK102-W998_01_V1.1.001_130219,255,001,255,001,0,100,100,0,internet,0000,0000,0,0,255,0,4,1,11,00)]")); - verifyNothing(decoder, text( - "[L0000001323N(GSM,0,0,07410001,20120101162600,404,010,9261,130,0,2353,130,35,9263,130,33,1)")); + verifyNothing(decoder, buffer( + "[\u004c0000001323\u004e(GSM,0,0,07410001,20120101162600,404,010,9261,130,0,2353,130,35,9263,130,33,1)]")); - verifyNothing(decoder, text( - "[%0000000082\u001d(100100000000000600-30-65535)")); + verifyNothing(decoder, buffer( + "[\u00250000000082\u001d(100100000000000600-30-65535)]")); - verifyNothing(decoder, text( - "[#0000000004\u0018(062100000000000600-0-0)")); + verifyNothing(decoder, buffer( + "[\u00230000000004\u0018(062100000000000600-0-0)]")); - verifyPosition(decoder, text( - "[=00000000836(ITV013939A4913.8317N02824.9241E000.90018031310010000)")); + verifyPosition(decoder, buffer( + "[\u003d0000000083\u0036(ITV013939A4913.8317N02824.9241E000.90018031310010000)]")); - verifyPosition(decoder, text( - "[=00000000366(ITV012209A4913.8281N02824.9258E000.32018031310010000)")); + verifyPosition(decoder, buffer( + "[\u003d0000000036\u0036(ITV012209A4913.8281N02824.9258E000.32018031310010000)]")); - verifyPosition(decoder, text( - "[;00000000106(ONE200834A5952.8114N01046.0832E003.93212071305010000)")); + verifyPosition(decoder, buffer( + "[\u003b0000000010\u0036(ONE200834A5952.8114N01046.0832E003.93212071305010000)]")); - verifyPosition(decoder, text( - "[\u00930000000000F(ITV153047A1534.0805N03233.0888E000.00029041500000400&Wsz-wl001&B0000)]")); + verifyPosition(decoder, buffer( + "[\u00930000000000\u0046(ITV153047A1534.0805N03233.0888E000.00029041500000400&Wsz-wl001&B0000)]")); } |