-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdecoder.js
More file actions
70 lines (66 loc) · 3.41 KB
/
Copy pathdecoder.js
File metadata and controls
70 lines (66 loc) · 3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
function Decoder(bytes, port) {
/*
* Example decoder for some Netvox sensors with The Things Network
* FOR TESTING PURPOSES ONLY
* Paul Hayes - paul@alliot.co.uk
*/
var decoded = {};
// decode common header
decoded.battery_voltage = bytes[2]*0.0055+2.8;
decoded.battery_percentage = parseInt((bytes[2]/255)*100);
decoded.temperature = (bytes[3]*0.5)-44;
decoded.ack_token = bytes[4] >> 4;
// decode status
if (bytes[1] & 0x10) decoded.sos_mode = true;
if (bytes[1] & 0x08) decoded.tracking_state = true;
if (bytes[1] & 0x04) decoded.moving = true;
if (bytes[1] & 0x02) decoded.periodic_pos = true;
if (bytes[1] & 0x01) decoded.pos_on_demand = true;
decoded.operating_mode = bytes[1] >> 5;
// decode rest of message
if ((bytes[0] === 0x03) && ((bytes[4] & 0x0F) === 0x00)) { // position message & GPS type
var lat_raw = ((bytes[6] << 16) | (bytes[7] << 8) | bytes[8]);
lat_raw = lat_raw << 8;
if (lat_raw > 0x7FFFFFFF) {
lat_raw = lat_raw - 0x100000000;
}
decoded.latitude = lat_raw/10000000;
var lng_raw = ((bytes[9] << 16) | (bytes[10] << 8) | bytes[11]);
lng_raw = lng_raw << 8;
if (lng_raw > 0x7FFFFFFF) {
lng_raw = lng_raw - 0x100000000;
}
decoded.longitude = lng_raw/10000000;
decoded.accuracy = bytes[12]*3.9;
decoded.age = bytes[5]*8;
} else if ((bytes[0] === 0x03) && ((bytes[4] & 0x0F) === 0x09)) { // position message & wifi bssid type
decoded.bssid0 = bytes.slice(6, 12).map(function(b) { return ("0" + b.toString(16)).substr(-2); }).join(":");
decoded.bssid1 = bytes.slice(13, 19).map(function(b) { return ("0" + b.toString(16)).substr(-2); }).join(":");
decoded.bssid2 = bytes.slice(20, 26).map(function(b) { return ("0" + b.toString(16)).substr(-2); }).join(":");
decoded.bssid3 = bytes.slice(27, 33).map(function(b) { return ("0" + b.toString(16)).substr(-2); }).join(":");
decoded.rssi0 = (bytes[12] > 127 ? bytes[12] -256 : bytes[12]);
decoded.rssi1 = (bytes[19] > 127 ? bytes[19] -256 : bytes[19]);
decoded.rssi2 = (bytes[26] > 127 ? bytes[26] -256 : bytes[26]);
decoded.rssi3 = (bytes[33] > 127 ? bytes[33] -256 : bytes[33]);
} else if ((bytes[0] === 0x03) && ((bytes[4] & 0x0F) === 0x07)) { // position message & BLE macaddr type
decoded.macadr0 = bytes.slice(6, 12).map(function(b) { return ("0" + b.toString(16)).substr(-2); }).join(":");
decoded.macadr1 = bytes.slice(13, 19).map(function(b) { return ("0" + b.toString(16)).substr(-2); }).join(":");
decoded.macadr2 = bytes.slice(20, 26).map(function(b) { return ("0" + b.toString(16)).substr(-2); }).join(":");
decoded.macadr3 = bytes.slice(27, 33).map(function(b) { return ("0" + b.toString(16)).substr(-2); }).join(":");
decoded.rssi0 = (bytes[12] > 127 ? bytes[12] -256 : bytes[12]);
decoded.rssi1 = (bytes[19] > 127 ? bytes[19] -256 : bytes[19]);
decoded.rssi2 = (bytes[26] > 127 ? bytes[26] -256 : bytes[26]);
decoded.rssi3 = (bytes[33] > 127 ? bytes[33] -256 : bytes[33]);
} else if ((bytes[0] === 0x03) && ((bytes[4] & 0x0F) === 0x01)) { // position message & GPS timeout (failure)
decoded.gpstimeout = true;
} else if (bytes[0] === 0x09) { // shutdown message
decoded.shutdown = true;
} else if (bytes[0] === 0x0A) {
decoded.geoloc_start = true;
} else if (bytes[0] === 0x05) {
decoded.heartbeat = true;
decoded.reset_cause = bytes[5];
decoded.firmware_ver = bytes.slice(6, 9);
}
return decoded;
}