super(dataManager, protocol, properties);
}
private Position decodeNormalMessage(ChannelBuffer buf) throws Exception {
Position position = new Position();
ExtendedInfoFormatter extendedInfo = new ExtendedInfoFormatter(getProtocol());
buf.readByte(); // header
// Get device by identifier
String id = Long.valueOf(ChannelBufferTools.readHexString(buf, 10)).toString();
try {
position.setDeviceId(getDataManager().getDeviceByImei(id).getId());
} catch(Exception error) {
Log.warning("Unknown device - " + id);
//return null;
}
// Protocol and type
int version = ChannelBufferTools.readHexInteger(buf, 1);
int type = buf.readUnsignedByte() & 0xf;
buf.readBytes(2); // length
// Time
Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
time.clear();
time.set(Calendar.DAY_OF_MONTH, ChannelBufferTools.readHexInteger(buf, 2));
time.set(Calendar.MONTH, ChannelBufferTools.readHexInteger(buf, 2) - 1);
time.set(Calendar.YEAR, 2000 + ChannelBufferTools.readHexInteger(buf, 2));
time.set(Calendar.HOUR_OF_DAY, ChannelBufferTools.readHexInteger(buf, 2));
time.set(Calendar.MINUTE, ChannelBufferTools.readHexInteger(buf, 2));
time.set(Calendar.SECOND, ChannelBufferTools.readHexInteger(buf, 2));
position.setTime(time.getTime());
// Coordinates
int temp = ChannelBufferTools.readHexInteger(buf, 8);
double latitude = temp % 1000000;
latitude /= 60 * 10000;
latitude += temp / 1000000;
temp = ChannelBufferTools.readHexInteger(buf, 9);
double longitude = temp % 1000000;
longitude /= 60 * 10000;
longitude += temp / 1000000;
// Flags
byte flags = buf.readByte();
position.setValid((flags & 0x1) == 0x1);
if ((flags & 0x2) == 0) latitude = -latitude;
position.setLatitude(latitude);
if ((flags & 0x4) == 0) longitude = -longitude;
position.setLongitude(longitude);
// Speed
position.setSpeed((double) ChannelBufferTools.readHexInteger(buf, 2));
// Course
position.setCourse(buf.readUnsignedByte() * 2.0);
if (version == 1) {
extendedInfo.set("satellites", buf.readUnsignedByte());
// Power
extendedInfo.set("power", buf.readUnsignedByte());
buf.readByte(); // other flags and sensors
// Altitude
position.setAltitude((double) buf.readUnsignedShort());
extendedInfo.set("cell", buf.readUnsignedShort());
extendedInfo.set("lac", buf.readUnsignedShort());
extendedInfo.set("gsm", buf.readUnsignedByte());
} else if (version == 2) {
position.setAltitude(0.0);
int fuel = buf.readUnsignedByte() << 8;
extendedInfo.set("status", buf.readUnsignedInt());
extendedInfo.set("milage", buf.readUnsignedInt());
fuel += buf.readUnsignedByte();
extendedInfo.set("fuel", fuel);
}
position.setExtendedInfo(extendedInfo.toString());
return position;
}