I use some similar like this one: Best practices when sending GPS location data
this for the encoder:
int32_t lat = latitude * 10000;
int32_t lon = longitude * 10000;
int16_t alt = altitudeGps * 100;
int8_t hdev = hdopGps * 10;
if (ret == SUCCESS) {
AppData[0] = lat;
AppData[1] = lat >> 8;
AppData[2] = lat >> 16;
AppData[3] = lon;
AppData[4] = lon >> 8;
AppData[5] = lon >> 16;
AppData[6] = alt;
AppData[7] = alt >> 8;
AppData[8] = hdev;
AppDataSize = 9;
and this for the decoder:
function Decoder(b, port) {
var decoded = {};
switch (port) {
case 2:
var lat = (b[0] | b[1]<<8 | b[2]<<16 | (b[2] & 0x80 ? 0xFF<<24 : 0)) / 10000.0;
var lon = (b[3] | b[4]<<8 | b[5]<<16 | (b[5] & 0x80 ? 0xFF<<24 : 0)) / 10000.0;
var alt = (b[6] | b[7]<<8 | (b[7] & 0x80 ? 0xFFFF<<16 : 0)) / 100.0;
var hdop = b[8] / 10.0;
decoded = {
"location": {
"latitude": lat,
"longitude": lon,
"altitude": alt,
"hdop": hdop
},
};
break;
case 3:
var bat = (b[0] | b[1]<<8 | (b[1] & 0x80 ? 0xFFFF<<16 : 0)) * 10.0;
decoded ={
"battery":{
"bat":bat
}
};
break;
case 4:
var aX = (b[0] | b[1]<<8 | (b[1] & 0x80 ? 0xFFFF<<16 : 0)) / 10.0;
var aY = (b[2] | b[3]<<8 | (b[3] & 0x80 ? 0xFFFF<<16 : 0)) / 10.0;
var aZ = (b[4] | b[5]<<8 | (b[5] & 0x80 ? 0xFFFF<<16 : 0)) / 10.0;
decoded ={
"acceleration":{
"aX":aX,
"aY":aY,
"aZ":aZ,
}
};
break;
}
return decoded;
}
Tested in Salamanca (where I have negative longitude) and Budapest (all positive) and good results