Megastek Protocol Decoder
Megastek Protocol Decoder
import io.netty.channel.Channel;
import org.traccar.BaseProtocolDecoder;
import org.traccar.session.DeviceSession;
import org.traccar.Protocol;
import org.traccar.helper.DateBuilder;
import org.traccar.helper.Parser;
import org.traccar.helper.PatternBuilder;
import org.traccar.model.CellTower;
import org.traccar.model.Network;
import org.traccar.model.Position;
import java.net.SocketAddress;
import java.util.regex.Pattern;
position.setValid(parser.next().equals("A"));
position.setLatitude(parser.nextCoordinate());
position.setLongitude(parser.nextCoordinate());
position.setSpeed(parser.nextDouble(0));
position.setCourse(parser.nextDouble(0));
dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0),
parser.nextInt(0));
position.setTime(dateBuilder.getDate());
return true;
}
// Detect type
boolean simple = sentence.charAt(3) == ',' || sentence.charAt(6) == ',';
// Split message
String id;
String location;
String status;
if (simple) {
int beginIndex = sentence.indexOf(',') + 1;
int endIndex = sentence.indexOf(',', beginIndex);
id = sentence.substring(beginIndex, endIndex);
beginIndex = endIndex + 1;
endIndex = sentence.indexOf('*', beginIndex);
if (endIndex != -1) {
endIndex += 3;
} else {
endIndex = sentence.length();
}
location = sentence.substring(beginIndex, endIndex);
beginIndex = endIndex + 1;
if (beginIndex > sentence.length()) {
beginIndex = endIndex;
}
status = sentence.substring(beginIndex);
} else {
int beginIndex = 3;
int endIndex = beginIndex + 16;
id = sentence.substring(beginIndex, endIndex).trim();
beginIndex = endIndex + 2;
endIndex = sentence.indexOf('*', beginIndex) + 3;
if (endIndex < 0) {
return null;
}
location = sentence.substring(beginIndex, endIndex);
beginIndex = endIndex + 1;
status = sentence.substring(beginIndex);
if (simple) {
position.addAlarm(decodeAlarm(parser.next()));
position.setAltitude(parser.nextDouble(0));
position.set(Position.KEY_BATTERY_LEVEL, parser.nextDouble(0));
if (parser.hasNext(4)) {
position.setNetwork(new Network(CellTower.from(
parser.nextInt(0), parser.nextInt(0),
parser.nextHexInt(0), parser.nextHexInt(0))));
}
} else {
} else {
position.setNetwork(new Network(CellTower.from(parser.nextInt(0),
parser.nextInt(0),
parser.nextHexInt(0), parser.nextHexInt(0),
parser.nextInt(0))));
position.set(Position.KEY_BATTERY_LEVEL, parser.nextDouble());
position.set(Position.KEY_FLAGS, parser.next());
position.set(Position.KEY_INPUT, parser.next());
position.set(Position.KEY_OUTPUT, parser.next());
position.set(Position.PREFIX_ADC + 1, parser.next());
position.set(Position.PREFIX_ADC + 2, parser.next());
position.set(Position.PREFIX_ADC + 3, parser.next());
position.addAlarm(decodeAlarm(parser.next()));
}
}
return position;
}
if (parser.next().equals("S")) {
position.set(Position.KEY_ARCHIVE, true);
}
position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS));
position.setValid(parser.next().equals("A"));
position.setLatitude(parser.nextCoordinate());
position.setLongitude(parser.nextCoordinate());
position.set(Position.KEY_SATELLITES, parser.nextInt(0));
position.set(Position.KEY_HDOP, parser.nextDouble(0));
position.setSpeed(parser.nextDouble(0));
position.setCourse(parser.nextDouble(0));
position.setAltitude(parser.nextDouble(0));
if (parser.hasNext()) {
position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000);
}
if (parser.hasNext(5)) {
int mcc = parser.nextInt();
int mnc = parser.nextInt();
Integer lac = parser.nextHexInt();
Integer cid = parser.nextHexInt();
Integer rssi = parser.nextInt();
if (lac != null && cid != null) {
CellTower tower = CellTower.from(mcc, mnc, lac, cid);
if (rssi != null) {
tower.setSignalStrength(rssi);
}
position.setNetwork(new Network(tower));
}
}
if (parser.hasNext(6)) {
position.set(Position.KEY_HEART_RATE, parser.nextInt());
position.set(Position.KEY_INPUT, parser.nextBinInt(0));
position.set(Position.KEY_OUTPUT, parser.nextBinInt(0));
for (int i = 1; i <= 3; i++) {
position.set(Position.PREFIX_ADC + i, parser.nextInt(0));
}
}
if (parser.hasNext(5)) {
position.set(Position.KEY_HEART_RATE, parser.nextInt());
position.set(Position.KEY_STEPS, parser.nextInt());
position.set("activityTime", parser.nextInt());
position.set("lightSleepTime", parser.nextInt());
position.set("deepSleepTime", parser.nextInt());
}
position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next());
if (parser.hasNext()) {
position.set(Position.KEY_CHARGE, parser.nextInt() > 0);
}
if (parser.hasNext()) {
position.set("belt", parser.nextInt());
}
if (parser.hasNext()) {
position.addAlarm(decodeAlarm(parser.next()));
}
return position;
}
@Override
protected Object decode(
Channel channel, SocketAddress remoteAddress, Object msg) throws
Exception {
if (sentence.contains("$MG")) {
return decodeNew(channel, remoteAddress, sentence);
} else {
return decodeOld(channel, remoteAddress, sentence);
}
}