mirror of
https://github.com/traccar/traccar.git
synced 2025-01-09 04:07:38 +08:00
Add support for Supermate protocol
This commit is contained in:
parent
97db54d0de
commit
afd02503a2
@ -303,5 +303,6 @@
|
||||
<entry key='fox.port'>5105</entry>
|
||||
<entry key='gnx.port'>5106</entry>
|
||||
<entry key='arknav.port'>5107</entry>
|
||||
<entry key='supermate.port'>5108</entry>
|
||||
|
||||
</properties>
|
||||
|
44
src/org/traccar/protocol/SupermateProtocol.java
Executable file
44
src/org/traccar/protocol/SupermateProtocol.java
Executable file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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.string.StringDecoder;
|
||||
import org.traccar.BaseProtocol;
|
||||
import org.traccar.CharacterDelimiterFrameDecoder;
|
||||
import org.traccar.TrackerServer;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class SupermateProtocol extends BaseProtocol {
|
||||
|
||||
public SupermateProtocol() {
|
||||
super("supermate");
|
||||
}
|
||||
|
||||
@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 CharacterDelimiterFrameDecoder(1024, "#"));
|
||||
pipeline.addLast("stringDecoder", new StringDecoder());
|
||||
pipeline.addLast("objectDecoder", new SupermateProtocolDecoder(SupermateProtocol.this));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
124
src/org/traccar/protocol/SupermateProtocolDecoder.java
Executable file
124
src/org/traccar/protocol/SupermateProtocolDecoder.java
Executable file
@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Copyright 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.
|
||||
* 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.buffer.ChannelBuffers;
|
||||
import org.jboss.netty.channel.Channel;
|
||||
import org.traccar.BaseProtocolDecoder;
|
||||
import org.traccar.helper.DateBuilder;
|
||||
import org.traccar.helper.Parser;
|
||||
import org.traccar.helper.PatternBuilder;
|
||||
import org.traccar.model.Event;
|
||||
import org.traccar.model.Position;
|
||||
|
||||
import java.net.SocketAddress;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Calendar;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class SupermateProtocolDecoder extends BaseProtocolDecoder {
|
||||
|
||||
public SupermateProtocolDecoder(SupermateProtocol protocol) {
|
||||
super(protocol);
|
||||
}
|
||||
|
||||
private static final Pattern PATTERN = new PatternBuilder()
|
||||
.number("d+:") // header
|
||||
.number("(d+):") // imei
|
||||
.number("d+:").text("*,")
|
||||
.number("(d+),") // command id
|
||||
.expression("([^,]{2}),") // command
|
||||
.expression("([AV]),") // validity
|
||||
.number("(xx)") // year
|
||||
.number("(xx)") // month
|
||||
.number("(xx),") // day
|
||||
.number("(xx)") // hours
|
||||
.number("(xx)") // minutes
|
||||
.number("(xx),") // seconds
|
||||
.number("(x)")
|
||||
.number("(x{7}),") // latitude
|
||||
.number("(x)")
|
||||
.number("(x{7}),") // longitude
|
||||
.number("(x{4}),") // speed
|
||||
.number("(x{4}),") // course
|
||||
.number("(x{12}),") // status
|
||||
.number("(x+),") // signal
|
||||
.number("(d+),") // power
|
||||
.number("(x{4}),") // oil
|
||||
.number("(x+)?") // odometer
|
||||
.any()
|
||||
.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());
|
||||
|
||||
String imei = parser.next();
|
||||
if (!identify(imei, channel, remoteAddress)) {
|
||||
return null;
|
||||
}
|
||||
position.setDeviceId(getDeviceId());
|
||||
|
||||
position.set("commandId", parser.next());
|
||||
position.set("command", parser.next());
|
||||
|
||||
position.setValid(parser.next().equals("A"));
|
||||
|
||||
DateBuilder dateBuilder = new DateBuilder()
|
||||
.setDate(parser.nextInt(16), parser.nextInt(16), parser.nextInt(16))
|
||||
.setTime(parser.nextInt(16), parser.nextInt(16), parser.nextInt(16));
|
||||
position.setTime(dateBuilder.getDate());
|
||||
|
||||
if (parser.nextInt(16) == 8) {
|
||||
position.setLatitude(-parser.nextInt(16) / 600000.0);
|
||||
} else {
|
||||
position.setLatitude(parser.nextInt(16) / 600000.0);
|
||||
}
|
||||
|
||||
if (parser.nextInt(16) == 8) {
|
||||
position.setLongitude(-parser.nextInt(16) / 600000.0);
|
||||
} else {
|
||||
position.setLongitude(parser.nextInt(16) / 600000.0);
|
||||
}
|
||||
|
||||
position.setSpeed(parser.nextInt(16) / 100.0);
|
||||
position.setCourse(parser.nextInt(16) / 100.0);
|
||||
|
||||
position.set(Event.KEY_STATUS, parser.next());
|
||||
position.set("signal", parser.next());
|
||||
position.set(Event.KEY_POWER, parser.nextDouble());
|
||||
position.set("oil", parser.nextInt(16));
|
||||
position.set(Event.KEY_ODOMETER, parser.nextInt(16));
|
||||
|
||||
if (channel != null) {
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
String content = String.format("#1:%s:1:*,00000000,UP,%02x%02x%02x,%02x%02x%02x#", imei,
|
||||
calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH),
|
||||
calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND));
|
||||
channel.write(ChannelBuffers.copiedBuffer(content, Charset.defaultCharset()));
|
||||
}
|
||||
|
||||
return position;
|
||||
}
|
||||
}
|
24
test/org/traccar/protocol/SupermateProtocolDecoderTest.java
Executable file
24
test/org/traccar/protocol/SupermateProtocolDecoderTest.java
Executable file
@ -0,0 +1,24 @@
|
||||
package org.traccar.protocol;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.traccar.ProtocolTest;
|
||||
|
||||
public class SupermateProtocolDecoderTest extends ProtocolTest {
|
||||
|
||||
@Test
|
||||
public void testDecode() throws Exception {
|
||||
|
||||
SupermateProtocolDecoder decoder = new SupermateProtocolDecoder(new SupermateProtocol());
|
||||
|
||||
verifyPosition(decoder, text(
|
||||
"2:359672050130411:1:*,00000000,XT,A,10031b,140b28,80ad4c72,81ba2d2c,06ab,238c,020204010000,12,0,0000,0003e6"));
|
||||
|
||||
verifyPosition(decoder, text(
|
||||
"2:359672050130411:2:*,00000000,UP,A,10031b,140a1c,80ad4bf6,81ba2dc3,0000,0000,020204000000,14,0,0000,0003e6"));
|
||||
|
||||
verifyPosition(decoder, text(
|
||||
"2:359672050130411:1:*,00000000,BJ,A,10031b,140c2f,80ad5012,81ba1f27,0f4c,2e18,020204014000,14,0,0000,0003ed"));
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user