Heute habe ich den lokalen Beaconscanner fertiggestellt und damit den nächsten Meilenstein erreicht. Neben der mobilen Lösung Bluetooth Beacons zu orten, kommt heute die lokale Variante dazu. Meine eingesetzte Hardware ist dabei ein Raspberry Pi. Und Node Red setze ich als Softwaretool ein um Beacondaten an meine Software zu übermitteln. Der Beaconcanners kann nun die Beacons finden und anschließend in einem JSON aufbereiten. Das JSON übergebe ich dann per HTTP Request an meinen neuen API Endpunkt in der Trackingsoftware.
Klingt kompliziert? Eigentlich ist es recht einfach. Mit Hilfe des Flows in Node Red bin ich in der Lage recht einfach sämtliche Bluetoothsignale zu erfassen. Ich muss mich im Flow eigentlich nur darum kümmern die msg.payload zu bearbeiten bzw. zu formatieren.
Die größte Herausforderung war die Reduzierung der Bluetoothdaten. Da jeder Sensor einen Sendeintervall zwischen 1sec und 10sec hat, kommen sehr schnell viele Daten zusammen. Ich habe mich entschieden einmal pro Minute die Daten an meinen Server zu übermitteln, also brauchte ich eine Trick die Beacons nur einmal zu sammeln. Das Zauberwort heißt globale Variable „Flow“.
In der gloablen Variable speicher ich mir die UUID zwischen und prüfe bei jedem weiteren Datenpaket ob ich die UUID nicht schon vorhanden ist.
var count = flow.get('count') || 0;
var major_data = msg.payload.iBeacon.major.toString(16);
var minor_data = msg.payload.iBeacon.minor.toString(16);
var uuid_data = msg.payload.iBeacon.uuid.replace('-','').replace('-','').replace('-','').replace('-','');
var signal_data = msg.payload.rssi;
var gotit = flow.get('UUIDDATA') || [];
if (!gotit.includes(uuid_data)) {
flow.set('UUIDDATA['+count+']',uuid_data);
flow.set('count',count +1);
var newMsg = {payload:{uuid:uuid_data,major:major_data,minor:minor_data,signalstrength:signal_data}};
return newMsg;
}
Das funktioniert super. Man muss sich am Ende einer Periode noch eine „delete“ Sequenz des Arrays überlegen, um die globale Variable für den nächsten Aufruf frei zu bekommen.
Am Ende sieht mein Payload für die Übertragung an meine Software dann so aus:
{
"devices":[
{
"imei":496872031335436,
"tracked_at":1626206415,
"latitude":51.38606918544733,
"longitude":8.163097368862485,
"beacons":[
{
"uuid":"4E540056575748564551550000000010",
"major":"4e49",
"minor":"4742",
"signalstrength":-83
},
{
"uuid":"4E540056575748564551550000000011",
"major":"4e49",
"minor":"4742",
"signalstrength":-88
},
{
"uuid":"4E540056575748564551550000000001",
"major":"4e49",
"minor":"5657",
"signalstrength":-79
}
]
}
]
}
Nachdem die Daten mittels HTTP REQUEST über eine REST API an meinen Server übermittelt wurden, lassen sich die UUID und das Device einem Namen zuordnen.
Wie die mobile Beaconscanner funktionieren zeige ich euch hier.
Ein Kommentar
Kommentare sind geschlossen.