diff options
4 files changed, 74 insertions, 19 deletions
diff --git a/src/org/traccar/Server.java b/src/org/traccar/Server.java index b6ad73db1..ad59a1c70 100644 --- a/src/org/traccar/Server.java +++ b/src/org/traccar/Server.java @@ -52,6 +52,7 @@ import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.SimpleChannelHandler; +import org.traccar.protocol.xexun2.Xexun2ProtocolDecoder; /** * Server @@ -501,6 +502,57 @@ public class Server implements DataManager { serverList.add(server); } } + + /** + * Xexun 2 pipeline factory + */ + protected class Xexun2PipelineFactory implements ChannelPipelineFactory { + + private TrackerServer server; + private Server serverCreator; + private Integer resetDelay; + + public Xexun2PipelineFactory( + TrackerServer server, Server serverCreator, Integer resetDelay) { + this.server = server; + this.serverCreator = serverCreator; + this.resetDelay = resetDelay; + } + + public ChannelPipeline getPipeline() { + ChannelPipeline pipeline = Channels.pipeline(); + pipeline.addLast("openHandler", new OpenChannelHandler(server)); + if (serverCreator.isLoggerEnabled()) { + pipeline.addLast("logger", new LoggingHandler("logger")); + } + byte delimiter[] = { (byte) '\r', (byte) '\n' }; + pipeline.addLast("frameDecoder", + new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("objectDecoder", new Xexun2ProtocolDecoder(serverCreator, resetDelay)); + pipeline.addLast("handler", new TrackerEventHandler(serverCreator)); + return pipeline; + } + } + + /** + * Init Xexun 2 server + */ + public void initXexun2Server(Properties properties) throws SQLException { + + boolean enable = Boolean.valueOf(properties.getProperty("xexun2.enable")); + if (enable) { + + TrackerServer server = new TrackerServer( + Integer.valueOf(properties.getProperty("xexun2.port"))); + + String resetDelay = properties.getProperty("xexun2.resetDelay"); + server.setPipelineFactory(new Xexun2PipelineFactory( + server, this, (resetDelay == null) ? 0 : Integer.valueOf(resetDelay))); + + serverList.add(server); + } + } /** * Start diff --git a/src/org/traccar/protocol/xexun2/Xexun2ProtocolDecoder.java b/src/org/traccar/protocol/xexun2/Xexun2ProtocolDecoder.java index 678d4c283..f7ff9f528 100644 --- a/src/org/traccar/protocol/xexun2/Xexun2ProtocolDecoder.java +++ b/src/org/traccar/protocol/xexun2/Xexun2ProtocolDecoder.java @@ -59,19 +59,28 @@ public class Xexun2ProtocolDecoder extends OneToOneDecoder { * Regular expressions pattern */ static private Pattern pattern = Pattern.compile( + "\\d+," + + "\\+\\d+," + "GPRMC," + - "([\\d]{2})([\\d]{2})([\\d]{2}).([\\d]{3})," + // Time (HHMMSS.SSS) + "(\\d{2})(\\d{2})(\\d{2}).(\\d{3})," + // Time (HHMMSS.SSS) "([AV])," + // Validity - "([\\d]{2})([\\d]{2}.[\\d]{4})," + // Latitude (DDMM.MMMM) + "(\\d{2})(\\d{2}.\\d{4})," + // Latitude (DDMM.MMMM) "([NS])," + - "([\\d]{3})([\\d]{2}.[\\d]{4})," + // Longitude (DDDMM.MMMM) + "(\\d{3})(\\d{2}.\\d{4})," + // Longitude (DDDMM.MMMM) "([EW])," + - "([\\d]+.[\\d]+)," + // Speed - "([\\d]+.[\\d]+)?," + // Course - "([\\d]{2})([\\d]{2})([\\d]{2})," + // Date (DDMMYY) + "(\\d+.\\d+)," + // Speed + "(\\d+.\\d+)?," + // Course + "(\\d{2})(\\d{2})(\\d{2})," + // Date (DDMMYY) ".*imei:" + - "([\\d]+),"); // IMEI - + "([\\d]+)," + // IMEI + "\\d+," + + "\\d+.\\d+," + + "F:(\\d+.\\d+)V," + // Power + ".*"); + + //"111111120009,+436763737552,GPRMC,120009.590,A,4639.6774,N,01418.5737,E,0.00,0.00,111111" + //",,,A*68,F,, imei:012207000694569,04,481.2,F:4.15V,0,139,2689,232,03,2725,0576" + /** * Decode message */ @@ -137,6 +146,9 @@ public class Xexun2ProtocolDecoder extends OneToOneDecoder { // Get device by IMEI String imei = parser.group(index++); position.setDeviceId(dataManager.getDeviceByImei(imei).getId()); + + // Power + position.setPower(Double.valueOf(parser.group(index++))); return position; } diff --git a/test/org/traccar/protocol/gps103/Gps103ProtocolDecoderTest.java b/test/org/traccar/protocol/gps103/Gps103ProtocolDecoderTest.java index 8cdebcb88..99255fbe8 100644 --- a/test/org/traccar/protocol/gps103/Gps103ProtocolDecoderTest.java +++ b/test/org/traccar/protocol/gps103/Gps103ProtocolDecoderTest.java @@ -45,7 +45,7 @@ public class Gps103ProtocolDecoderTest { "imei:353451042861763,tracker,1106132241,,F,144114.000,A,2301.9052,S,04909.3676,W,0.13,")); assertNotNull(decoder.decode(null, null, - "imei:359587010124900,tracker,0809231929,13554900601,F,112909.397,A,2234.4669,N,11354.3287,E,0.11,321.53,;")); + "imei:359587010124900,tracker,0809231929,13554900601,F,112909.397,A,2234.4669,N,11354.3287,E,0.11,321.53,")); } diff --git a/test/org/traccar/protocol/xexun2/Xexun2ProtocolDecoderTest.java b/test/org/traccar/protocol/xexun2/Xexun2ProtocolDecoderTest.java index 444e4e910..6fa2a7430 100644 --- a/test/org/traccar/protocol/xexun2/Xexun2ProtocolDecoderTest.java +++ b/test/org/traccar/protocol/xexun2/Xexun2ProtocolDecoderTest.java @@ -33,16 +33,7 @@ public class Xexun2ProtocolDecoderTest { Xexun2ProtocolDecoder decoder = new Xexun2ProtocolDecoder(new TestDataManager(), 0); assertNotNull(decoder.decode(null, null, - "GPRMC,150120.000,A,3346.4463,S,15057.3083,E,0.0,117.4,010911,,,A*76,F,imei:351525010943661,")); - - assertNotNull(decoder.decode(null, null, - "GPRMC,010203.000,A,0102.0003,N,00102.0003,E,1.02,1.02,010203,,,A*00,F,,imei:10000000000000,")); - - assertNotNull(decoder.decode(null, null, - "GPRMC,233842.000,A,5001.3060,N,01429.3243,E,0.00,,210211,,,A*74,F,imei:354776030495631,")); - - assertNotNull(decoder.decode(null, null, - "GPRMC,080303.000,A,5546.7313,N,03738.6005,E,0.56,160.13,100311,,,A*6A,L,imei:354778030461167,")); + "111111120009,+436763737552,GPRMC,120009.590,A,4639.6774,N,01418.5737,E,0.00,0.00,111111,,,A*68,F,, imei:012207000694569,04,481.2,F:4.15V,0,139,2689,232,03,2725,0576")); } |