I am having trouble with a packet decoder in TTN right now that I cannot figure out. I’m sure I’m doing something wrong, but any help would be appreciated. My data is put into a 16-byte message on a LoRaWAN Arduino device. They are all 16-bit uint16_t
except for one uint32_t
and I encode them like so:
dataSender[0] = ft >> 8;
dataSender[1] = ft & 0xFF;
dataSender[2] = fh >> 8;
dataSender[3] = fh & 0xFF;
dataSender[4] = co & 0xFF;
dataSender[5] = (co >> 8) & 0xFF;
dataSender[6] = (co >> 16) & 0xFF;
dataSender[7] = (co >> 24) & 0xFF;
dataSender[8] = pm10 >> 8;
dataSender[9] = pm10 & 0xFF;
dataSender[10] = pm25 >> 8;
dataSender[11] = pm25 & 0xFF;
dataSender[12] = pm100 >> 8;
dataSender[13] = pm100 & 0xFF;
dataSender[14] = batt >> 8;
dataSender[15] = batt & 0xFF;
I then have a decoder on TTN that is:
function Decoder(bytes, port) {
var decoded = {};
decoded.temp_c = ((bytes[0] << 8) | bytes[1]) / 100; // temperature ºC
decoded.humidity = ((bytes[2] << 8) | bytes[3]) / 100; // humidity %
decoded.co2 = ((bytes[4]) + // co2 is a 4-byte value
((bytes[5]) << 8)
+ ((bytes[6]) << 16)
+ ((bytes[7]) << 24) );
decoded.pm10 = ((bytes[8] << 8) | bytes[9]);
decoded.pm25 = (bytes[10] << 8) | bytes[11];
decoded.pm100 = (bytes[12] << 8) | bytes[13];
decoded.batt = (bytes[14] << 8) | bytes[15];
return decoded;
}
Which should work, right? It doesn’t. Everything works ok except that the decoded.batt
is incorrect.
I even went to far as to add this debug to the Arduino:
SerialUSB.print("Decoded temp: ");
SerialUSB.println(((dataSender[0] << 8) | dataSender[1]) / 100);
SerialUSB.print("Decoded hum: ");
SerialUSB.println(((dataSender[2] << 8) | dataSender[3]) / 100);
SerialUSB.print("Decoded CO2: ");
SerialUSB.println((dataSender[4]) + ((dataSender[5]) << 8) + ((dataSender[6]) << 16) + ((dataSender[7]) << 24) );
SerialUSB.print("Decoded pm10: ");
SerialUSB.println(((dataSender[8] << 8) | dataSender[9]));
SerialUSB.print("Decoded pm25: ");
SerialUSB.println(((dataSender[10] << 8) | dataSender[11]));
SerialUSB.print("Decoded pm100: ");
SerialUSB.println(((dataSender[12] << 8) | dataSender[13]));
SerialUSB.print("Decoded Batt: ");
SerialUSB.println(((dataSender[14] << 8) | dataSender[15]));
// Prepare upstream data transmission at the next possible time.
LMIC_setTxData2(1, dataSender, sizeof(dataSender) - 1, 0);
And lo and behold that prints all the correct values.
But when I copy the payload 0A1F0E050107000000030003000302
out and enter it into the Uplink Payload Test I get:
{
"batt": 512,
"co2": 1793,
"humidity": 35.89,
"pm10": 3,
"pm100": 3,
"pm25": 3,
"temp_c": 25.91
}
But batt
is actually 623 on the uplink side. In fact, no matter what the payload is, the batt
value is always 512.
So, please, point out my bone-headed move here please?
Thanks!
dg