Beaconscanner aber stationär

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.

Darstellung des Beaconscanner Flows innerhalb von Node Red.
Das ist der Flow innerhalb von Node Red

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.

kleine Zusammenfassung des Scanners

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.

iBeacon

Der Standart für die Ortung eines Bluetoothbeacons kann zum Beispiel der von Apple genutze iBeacon sein. Ihr findet hier ein paar Informationen wie dieser iBeacon genutzt werden kann.

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.

Beaconliste in Softwarelösung Tooltrack
Liste in der Softwarelösung Tooltrack

Wie die mobile Beaconscanner funktionieren zeige ich euch hier.

Ein Kommentar

Kommentare sind geschlossen.