use of org.traccar.helper.Parser in project traccar by tananaev.
the class Gl100ProtocolDecoder method decode.
@Override
protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
String sentence = (String) msg;
if (sentence.contains("AT+GTHBD=") && channel != null) {
String response = "+RESP:GTHBD,GPRS ACTIVE,";
response += sentence.substring(9, sentence.lastIndexOf(','));
response += '\0';
// heartbeat response
channel.write(response);
}
Parser parser = new Parser(PATTERN, sentence);
if (!parser.matches()) {
return null;
}
Position position = new Position(getProtocolName());
DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next());
if (deviceSession == null) {
return null;
}
position.setDeviceId(deviceSession.getDeviceId());
position.setValid(parser.nextInt(0) == 0);
position.setSpeed(parser.nextDouble(0));
position.setCourse(parser.nextDouble(0));
position.setAltitude(parser.nextDouble(0));
position.setLongitude(parser.nextDouble(0));
position.setLatitude(parser.nextDouble(0));
position.setTime(parser.nextDateTime());
return position;
}
use of org.traccar.helper.Parser in project traccar by tananaev.
the class Gl200TextProtocolDecoder method decodeWif.
private Object decodeWif(Channel channel, SocketAddress remoteAddress, String sentence) {
Parser parser = new Parser(PATTERN_WIF, sentence);
Position position = initPosition(parser, channel, remoteAddress);
if (position == null) {
return null;
}
getLastLocation(position, null);
Network network = new Network();
// count
parser.nextInt();
Matcher matcher = Pattern.compile("([0-9a-fA-F]{12}),(-?\\d+),,,,").matcher(parser.next());
while (matcher.find()) {
String mac = matcher.group(1).replaceAll("(..)", "$1:");
network.addWifiAccessPoint(WifiAccessPoint.from(mac.substring(0, mac.length() - 1), Integer.parseInt(matcher.group(2))));
}
position.setNetwork(network);
position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt());
return position;
}
use of org.traccar.helper.Parser in project traccar by tananaev.
the class Gl200TextProtocolDecoder method decodeInf.
private Object decodeInf(Channel channel, SocketAddress remoteAddress, String sentence) {
Parser parser = new Parser(PATTERN_INF, sentence);
Position position = initPosition(parser, channel, remoteAddress);
if (position == null) {
return null;
}
switch(parser.nextHexInt()) {
case 0x16:
case 0x1A:
case 0x12:
position.set(Position.KEY_IGNITION, false);
position.set(Position.KEY_MOTION, true);
break;
case 0x11:
position.set(Position.KEY_IGNITION, false);
position.set(Position.KEY_MOTION, false);
break;
case 0x21:
position.set(Position.KEY_IGNITION, true);
position.set(Position.KEY_MOTION, false);
break;
case 0x22:
position.set(Position.KEY_IGNITION, true);
position.set(Position.KEY_MOTION, true);
break;
case 0x41:
position.set(Position.KEY_MOTION, false);
break;
case 0x42:
position.set(Position.KEY_MOTION, true);
break;
default:
break;
}
position.set(Position.KEY_RSSI, parser.nextInt());
// odometer or external power
parser.next();
position.set(Position.KEY_BATTERY, parser.nextDouble());
position.set(Position.KEY_CHARGE, parser.nextInt() == 1);
position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt());
position.set(Position.PREFIX_TEMP + 1, parser.next());
position.set(Position.PREFIX_ADC + 1, parser.next());
position.set(Position.PREFIX_ADC + 2, parser.next());
position.set(Position.KEY_INPUT, parser.next());
position.set(Position.KEY_OUTPUT, parser.next());
getLastLocation(position, parser.nextDateTime());
position.set(Position.KEY_INDEX, parser.nextHexInt());
return position;
}
use of org.traccar.helper.Parser in project traccar by tananaev.
the class Gl200TextProtocolDecoder method decodeBasic.
private Object decodeBasic(Channel channel, SocketAddress remoteAddress, String sentence, String type) {
Parser parser = new Parser(PATTERN_BASIC, sentence);
Position position = initPosition(parser, channel, remoteAddress);
if (position == null) {
return null;
}
int hdop = parser.nextInt();
position.setValid(hdop > 0);
position.set(Position.KEY_HDOP, hdop);
position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0)));
position.setCourse(parser.nextDouble(0));
position.setAltitude(parser.nextDouble(0));
if (parser.hasNext(2)) {
position.setLongitude(parser.nextDouble());
position.setLatitude(parser.nextDouble());
} else {
getLastLocation(position, null);
}
if (parser.hasNext(6)) {
position.setTime(parser.nextDateTime());
}
if (parser.hasNext(4)) {
position.setNetwork(new Network(CellTower.from(parser.nextInt(), parser.nextInt(), parser.nextHexInt(), parser.nextHexInt())));
}
decodeDeviceTime(position, parser);
switch(type) {
case "PNA":
position.set(Position.KEY_ALARM, Position.ALARM_POWER_ON);
break;
case "PFA":
position.set(Position.KEY_ALARM, Position.ALARM_POWER_OFF);
break;
case "EPN":
position.set(Position.KEY_ALARM, Position.ALARM_POWER_RESTORED);
break;
case "EPF":
position.set(Position.KEY_ALARM, Position.ALARM_POWER_CUT);
break;
case "BPL":
position.set(Position.KEY_ALARM, Position.ALARM_LOW_BATTERY);
break;
case "STT":
position.set(Position.KEY_ALARM, Position.ALARM_MOVEMENT);
break;
case "SWG":
position.set(Position.KEY_ALARM, Position.ALARM_GEOFENCE);
break;
case "TMP":
case "TEM":
position.set(Position.KEY_ALARM, Position.ALARM_TEMPERATURE);
break;
case "JDR":
case "JDS":
position.set(Position.KEY_ALARM, Position.ALARM_JAMMING);
break;
default:
break;
}
return position;
}
use of org.traccar.helper.Parser in project traccar by tananaev.
the class Gl200TextProtocolDecoder method decodeFri.
private Object decodeFri(Channel channel, SocketAddress remoteAddress, String sentence) {
Parser parser = new Parser(PATTERN_FRI, sentence);
if (!parser.matches()) {
return null;
}
DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next());
if (deviceSession == null) {
return null;
}
LinkedList<Position> positions = new LinkedList<>();
String vin = parser.next();
Integer power = parser.nextInt();
Parser itemParser = new Parser(PATTERN_LOCATION, parser.next());
while (itemParser.find()) {
Position position = new Position(getProtocolName());
position.setDeviceId(deviceSession.getDeviceId());
position.set(Position.KEY_VIN, vin);
decodeLocation(position, itemParser);
positions.add(position);
}
Position position = positions.getLast();
decodeLocation(position, parser);
if (power != null && power > 10) {
// only on some devices
position.set(Position.KEY_POWER, power * 0.001);
}
if (parser.hasNext()) {
position.set(Position.KEY_ODOMETER, parser.nextDouble() * 1000);
}
position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt());
if (parser.hasNext()) {
position.set(Position.KEY_ODOMETER, parser.nextDouble() * 1000);
}
position.set(Position.KEY_HOURS, parser.next());
position.set(Position.PREFIX_ADC + 1, parser.next());
position.set(Position.PREFIX_ADC + 2, parser.next());
position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt());
decodeStatus(position, parser);
position.set(Position.KEY_RPM, parser.nextInt());
position.set(Position.KEY_FUEL_LEVEL, parser.nextInt());
decodeDeviceTime(position, parser);
if (ignoreFixTime) {
positions.clear();
positions.add(position);
}
return positions;
}
Aggregations