Skip to content

Commit

Permalink
Implement AURU GPRS communication protocol
Browse files Browse the repository at this point in the history
  • Loading branch information
tananaev committed Dec 15, 2015
1 parent 4113e28 commit 0089c87
Show file tree
Hide file tree
Showing 5 changed files with 167 additions and 1 deletion.
1 change: 1 addition & 0 deletions debug.xml
Original file line number Diff line number Diff line change
Expand Up @@ -347,5 +347,6 @@
<entry key='watch.port'>5093</entry>
<entry key='t800x.port'>5094</entry>
<entry key='upro.port'>5095</entry>
<entry key='auru.port'>5096</entry>

</properties>
2 changes: 1 addition & 1 deletion src/org/traccar/helper/Parser.java
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public double nextCoordinate(CoordinateFormat format) {
break;
}

if (hemisphere != null && (hemisphere.equals("S") || hemisphere.equals("W"))) {
if (hemisphere != null && (hemisphere.equals("S") || hemisphere.equals("W") || hemisphere.equals("-"))) {
coordinate = -coordinate;
}

Expand Down
46 changes: 46 additions & 0 deletions src/org/traccar/protocol/AuruProtocol.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright 2015 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.traccar.protocol;

import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.traccar.BaseProtocol;
import org.traccar.CharacterDelimiterFrameDecoder;
import org.traccar.TrackerServer;

import java.util.List;

public class AuruProtocol extends BaseProtocol {

public AuruProtocol() {
super("auru");
}

@Override
public void initTrackerServers(List<TrackerServer> serverList) {
serverList.add(new TrackerServer(new ServerBootstrap(), this.getName()) {
@Override
protected void addSpecificHandlers(ChannelPipeline pipeline) {
pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024));
pipeline.addLast("stringDecoder", new StringDecoder());
pipeline.addLast("objectDecoder", new AuruProtocolDecoder(AuruProtocol.this));
}
});
}

}
95 changes: 95 additions & 0 deletions src/org/traccar/protocol/AuruProtocolDecoder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/*
* Copyright 2015 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.traccar.protocol;

import org.jboss.netty.channel.Channel;
import org.traccar.BaseProtocolDecoder;
import org.traccar.helper.BitUtil;
import org.traccar.helper.DateBuilder;
import org.traccar.helper.Parser;
import org.traccar.helper.PatternBuilder;
import org.traccar.helper.UnitsConverter;
import org.traccar.model.Event;
import org.traccar.model.Position;

import java.net.SocketAddress;
import java.util.regex.Pattern;

public class AuruProtocolDecoder extends BaseProtocolDecoder {

public AuruProtocolDecoder(AuruProtocol protocol) {
super(protocol);
}

private static final Pattern PATTERN = new PatternBuilder()
.number("M(dddd)") // index
.number("Td+") // phone
.number("I(d+)") // imei
.number("Ed+W")
.text("*****")
.number("d{8}d{4}") // local time
.expression(".{8}#.{8}")
.number("d{10}") // status
.number("([-+])(ddd)(dd)(dddd)") // longitude
.number("([-+])(ddd)(dd)(dddd)") // latitude
.number("(dd)(dd)(dddd)") // date
.number("(dd)(dd)(dd)") // time
.number("(ddd)") // course
.number("d{6}")
.number("(ddd)") // speed
.number("d")
.number("(dd)") // battery
.expression("([01])") // charging
.compile();

@Override
protected Object decode(
Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {

Parser parser = new Parser(PATTERN, (String) msg);
if (!parser.matches()) {
return null;
}

Position position = new Position();
position.setProtocol(getProtocolName());

position.set(Event.KEY_INDEX, parser.nextInt());

if (!identify(parser.next(), channel, remoteAddress)) {
return null;
}
position.setDeviceId(getDeviceId());

position.setValid(true);
position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN_MIN));
position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN_MIN));

DateBuilder dateBuilder = new DateBuilder()
.setDateReverse(parser.nextInt(), parser.nextInt(), parser.nextInt())
.setTime(parser.nextInt(), parser.nextInt(), parser.nextInt());
position.setTime(dateBuilder.getDate());

position.setCourse(parser.nextDouble());
position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble()));

position.set(Event.KEY_BATTERY, parser.nextInt());
position.set(Event.KEY_CHARGE, parser.nextInt() == 1);

return position;
}

}
24 changes: 24 additions & 0 deletions test/org/traccar/protocol/AuruProtocolDecoderTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.traccar.protocol;

import org.junit.Test;
import org.traccar.ProtocolTest;

public class AuruProtocolDecoderTest extends ProtocolTest {

@Test
public void testDecode() throws Exception {

AuruProtocolDecoder decoder = new AuruProtocolDecoder(new AuruProtocol());

verifyPosition(decoder, text(
"M0028T0000816398975I357325031465123E00001W*****110620150437000068DA#RD01DA240000000001+100408425+013756121100620152137231112240330004400"));

verifyPosition(decoder, text(
"M0029T0000816398975I357325031465123E00001W*****110620150439000068DA#RD01DA240000000001+100407886+013755936100620152138221952123100003400"));

verifyPosition(decoder, text(
"M0030T0000816398975I357325031465123E00001W*****110620150441000068DA#RD01DA240000000000+100408391+013756125100620152140102362238320034400"));

}

}

0 comments on commit 0089c87

Please sign in to comment.