Weltweiter kostenloser Versand ab 120 € Bestellwert – Zahlung mit PayPal und Stripe – Hergestellt in Finnland

Maximale Bluetooth-Beacon-Dichte

Meme, das darauf hinweist, dass alles überwacht werden sollte
Finden wir die Grenzen dessen, was wir messen können

Wie viele Bluetooth-Beacons kann ich an einem Ort haben?

Immer wieder fragt jemand, wie viele RuuviTag Bluetooth-Sensor-Beacons er im Bereich eines einzelnen Gateways haben kann. Ist es machbar, jede Kiste in einem Lagerhaus zu überwachen? Jede einzelne Milchpackung in diesen Kisten?

Es stellt sich heraus, dass es keine exakte Antwort gibt, da die Daten in eigenständigen Paketen gesendet werden. Die Frage lautet: Mit welcher Rate können Bluetooth Low-Energy (BLE)-Pakete empfangen werden?

Theoretisches Maximum von Bluetooth-Beacons

Bluetooth-Advertisements werden auf drei separaten Frequenzkanälen gesendet, bekannt als 37, 38 und 39. Texas Instruments hat eine ausgezeichnete Einführung zu den Kanälen und zum Advertising, falls du an tiefergehenden Details interessiert bist.

Die minimale Größe eines Advertisement-Pakets beträgt 80 Bit (oder 10 Byte) und enthält:

  • Präambel: 1 Byte
  • Zugriffsadresse: 4 Byte
  • Header: 2 Byte
  • CRC: 3 Byte

Angenommen, wir wollen das Spektrum nur mit gültigen BLE-Advertisement-Daten füllen und irgendwie alle Geräte perfekt synchronisieren, könnten wir diese Pakete auf jedem Kanal senden und jeden Kanal separat empfangen. Der limitierende Faktor wäre die Datenrate von BLE 4, die
1 Mbit / s beträgt.

Insgesamt wären das 1.000.000 Bit / s geteilt durch 80 Bit / s mal 3 Kanäle, oder
37.500 Übertragungen pro Sekunde. Es gibt jedoch zahlreiche praktische Grenzen, angefangen bei unserem Gateway, das wahrscheinlich nur auf einem Kanal scannt.

Praktische Grenzen der Paketrate bei Bluetooth

Kanäle

Da die Sensor-Beacons als einzelne Komponente und nicht als integriertes System geliefert werden, müssen wir auf allen Kanälen werben, um sicherzustellen, dass wir den Kanal treffen, auf dem unser Gateway gerade lauscht. Da wir auf jedem Kanal dieselbe Werbung senden müssen, können wir kein Multiplexing über drei Kanäle verwenden, und die 37.500 Übertragungen werden durch drei auf 12.500 reduziert.

Datengröße

Unsere ursprüngliche Annahme war, dass die Datengröße eines Pakets 80 Bit beträgt. Das ist jedoch überhaupt nicht nützlich – diese 80 Bit enthalten nicht einmal die MAC-Adresse des Beacons. Seien wir vorsichtiger mit der Schätzung der Datengröße und verwenden wir die vollen 376 Bit eines BLE 4 Advertisements. Dies begrenzt uns auf 2.659 Pakete pro Sekunde.

Synchronisation

Bluetooth verfügt über keinen Mechanismus zur Synchronisierung der Beacons, um die Bandbreite gleichmäßig auf alle Geräte aufzuteilen. Die Beacons senden stattdessen zu zufälligen Zeitpunkten, in der Hoffnung, andere Störungen zumindest die meiste Zeit zu vermeiden. Natürlich sinkt die Wahrscheinlichkeit, andere Pakete zu verpassen, wenn der Datenverkehr in den Bändern zunimmt. Nordic Devzone hat eine ausgezeichnete Antwort zur Schätzung der Kollisionswahrscheinlichkeit: Im Wesentlichen gehen wir davon aus, dass, wenn zwei Pakete auf einem Kanal kollidieren, beide verloren gehen. Die Kollisionswahrscheinlichkeit wird zwischen zwei Advertisern basierend auf der Sendezeit eines Pakets und dem Übertragungsintervall berechnet.

Grafik, die anzeigt, dass ein einzelnes Paket in 650 Mikrosekunden übertragen wird
Ein einzelnes Paket wird in 650 Mikrosekunden übertragen.

Während das theoretische Modell, das auf der Modulationsgeschwindigkeit basiert, vorhersagt, dass eine einzelne Übertragung auf einem einzelnen Kanal 376 Mikrosekunden dauert, werden wir etwas praktischer und messen die Zeit vom Stromanstieg bis zum Stromabfall in einem Advertisement. Die Ergebnisse variieren etwas, da sie vom genauen Zeitpunkt der Probenahme abhängen, aber wir wählen 650 Mikrosekunden als unseren gemessenen Wert.

Wir wählen eine Sekunde als unser Intervall, da wir herausfinden wollen, wie viele Advertisements wir in einer Sekunde empfangen können. Unsere Wahrscheinlichkeit, Pakete zu kollidieren P(Treffer) beträgt 2 * 65e-5 / 1, was 0,13 % entspricht. Unsere Wahrscheinlichkeit, andere Pakete nicht zu treffen P(Verpassen) ist dann 1 – P(Treffer), oder 99,87 %.

Da die Beacons unabhängig sind, können wir die Wahrscheinlichkeit, keines der N Beacons zu treffen, als zusammengesetzte Wahrscheinlichkeit berechnen, ein Beacon nicht zu treffen: P(alle_verpassen) = P(verpassen)^N-1. Wir werden den Gesamtdurchsatz von Beacons, die Pakete einmal pro Sekunde senden, mit Scilab plotten.

N = 1:1:5000;
throughput = zeros(1, 5000);
Pmiss = 1 - (2*65*10^-5);
for i=1:1:length(N)
Pmiss_all = Pmiss^(i-1);
throughput(1, i) = i * Pmiss_all;
end
plot(N, throughput)
[v, i] = max(throughput)
a = gca();
a.font_size = 5;
a.x_label.text = string("Anzahl der Beacons") ;
a.x_label.font_size = 6;
a.y_label.text = "Durchsatz (N/s)";
a.y_label.font_size = 6;
e=gce();
p1=e.children(1);
t=datatipCreate(p1,769);
t.font_size = 5;
Grafik, die die Anzahl der verwendeten Beacons anzeigt
Unsere magische Zahl scheint 769 Übertragungen pro Sekunde zu sein, wobei etwa 2/3 der Pakete verloren gehen

Gateway und Hintergrundrauschen

Zusätzlich zu den Beacons selbst gibt es immer ein gewisses Hintergrundrauschen, das die Anzahl der Pakete begrenzt, die wir empfangen können. Ebenso könnte das Gateway selbst eine gemeinsame Antenne für Wi-Fi und Bluetooth verwenden. In der Praxis habe ich Gateways gesehen, die unter ansonsten guten Bedingungen 5 % bis 50 % Paketverlust aufweisen. Angenommen, das Gateway kann 100 % der Advertisements abhören und der Hintergrund ist ansonsten ruhig, könnten wir 95 % der nicht kollidierenden Pakete oder 268 Übertragungen pro Sekunde empfangen – ein ziemlicher Unterschied zum theoretischen Maximum von 37.500!

Backend und Konnektivität

Während die Bluetooth-Nutzdatenrate keineswegs extrem ist – im obigen Fall nur etwa 12 kB/s – kann der tatsächliche Internetverkehr viel höher sein, insbesondere wenn Daten mit separaten Verbindungen für jeden Datenpunkt geschrieben werden, anstatt ein paar tausend Punkte auf einmal zu übertragen. Die Leistung verschiedener Backend-Lösungen liegt jedoch außerhalb des Rahmens dieses Beitrags.

Wie viele Bluetooth-Beacons kann ich also letztendlich einsetzen?

Es gibt keine einfache Antwort, daher müssen wir sagen: „Es kommt darauf an“. Die obige Grafik deutet darauf hin, dass selbst bei 5.000 Beacons, die einmal pro Sekunde Daten senden, einige Daten durchkommen würden, aber die Wahrscheinlichkeit, dass eine Übertragung empfangen wird, beträgt nur 0,15 %. Im Durchschnitt würde eine von 668 Übertragungen empfangen – das sind 11 Minuten. Der limitierende Faktor wird, wie lange ich warten kann, um eine Übertragung mit ausreichend hoher Sicherheit zu empfangen.

Nehmen wir an, wir überwachen Temperatur und Luftfeuchtigkeit in einem Lagerhaus. 11 Minuten Wartezeit könnten völlig sicher sein, da sich diese Werte unter normalen Bedingungen nicht schnell ändern. Wenn die Beacons hingegen zur Bestandsverfolgung in einem Lagerhaus verwendet werden, haben wir möglicherweise nur 10 Sekunden in der Nähe des Gateways, bevor die Waren abtransportiert werden.

Wir wählen 2 Schwellenwerte für die Sicherheit der Erkennung eines Tags innerhalb einer bestimmten Zeit: strenge 99,99999 % für die mobile Bestandsverfolgung und viel entspanntere 99 % für die Verfolgung der Bedingungen eines statischen Assets. Legen wir auch die anderen Variablen fest.

  • Übertragungszeit: 650 Mikrosekunden
  • Intervall: 1 Sekunde
  • Gateway, Hintergrundrauschen: 5 % der Pakete gehen verloren

Als Nächstes berechnen wir eine Matrix der Erkennungswahrscheinlichkeiten innerhalb einer bestimmten Zeit, finden die erste Zeit, die eine größere Wahrscheinlichkeit als unser Schwellenwert aufweist, und plotten die Zeiten in Scilab.

Ttransmission = 65e-5;
Tinterval = 1;
Penvironment = 0.95;
Ntags = 1:1:5000;
Pmiss = 1 - (2*Ttransmission/Tinterval);
Pmiss_all = Pmiss^(Ntags - 1) * Penvironment;
Pnot_miss_all = 1-Pmiss_all;
Nbroadcasts = 1000;
for i=1:1:Nbroadcasts
Pnot_detect(i, :) = Pnot_miss_all^i;
end
Pdetect = 1 - Pnot_detect;

th1 = 0.99;
th2 = 0.9999999;
[idx, idy] = find(Pdetect > th1);
[uniq, map] = unique(idy);
plot(1:1:length(map), idx(map));
[idx2, idy2] = find(Pdetect > th2);
[uniq2, map2] = unique(idy2);
plot(1:1:length(map2), idx2(map2), 'g');

a = gca();
a.font_size = 5;
a.x_label.text = string("Anzahl der Beacons") ;
a.x_label.font_size = 6;
a.y_label.text = "Zeit bis zur Erkennung mit Wahrscheinlichkeit (s)";
a.y_label.font_size = 6;

hl = legend(["99 %", "99.99999 %"], 2);
hl.font_size = 5;
Grafik, die anzeigt, wie viele Beacons erkannt werden
Die Zeit zur Erkennung eines Beacons wächst nach etwa 2.000–3.000 Beacons rapide an.

Jetzt können wir einige Beispiele für Beacon-Dichten auswählen. In einem Lagerszenario, in dem wir die Beacon-Daten einmal pro Minute mit 99 %iger Sicherheit erkennen möchten, können wir etwa 1.900 Beacons haben, die einmal pro Sekunde senden.

In einem Szenario zur Bestandsverfolgung, in dem wir die Übertragung in 10 Sekunden mit 99,99999 %iger Sicherheit erkennen möchten, können wir 100 Beacons in Reichweite haben.

Überprüfung der Schätzungen

Jede gute Theorie kann auf ihre Richtigkeit überprüft werden. Die Überprüfung dieser Beispiele sollte nicht allzu schwierig sein, alles, was wir brauchen, ist ein Raspberry Pi und ein paar tausend RuuviTags.

Meme von Futurama Fry, der misstrauisch schaut
Vielleicht finden wir eine Abkürzung, die nicht so viel Hardware erfordert?

Glücklicherweise können wir die Zahlen etwas anpassen, um die Grundidee zu überprüfen, sodass wir nicht Tausende von Tags kaufen müssen. Wir beschleunigen alles und verwenden ein Intervall von 100 ms und prüfen, ob wir mindestens eine Übertragung pro Sekunde von den Tags erhalten.

Wir programmieren 16 Beacons so, dass sie in einem Intervall von 100 ms senden, und platzieren sie neben einem Raspberry Pi und einem ESP32-Dongle, die die Daten an InfluxDB weiterleiten. Der Raspberry Pi ist über Ethernet und der ESP32 über Wi-Fi verbunden.

Beispiel für die maximale Anzahl von Bluetooth-Beacons
RuuviTags mit verschiedenen Empfängern auslesen

Das Endergebnis ist ziemlich enttäuschend: Die Backend-Verbindung ist bei etwa 150 Samples pro Sekunde Spitzenwert gesättigt, und es können keine weiteren Daten empfangen werden.

Grafik, die einen nicht so erfolgreichen Versuch anzeigt
Der erste Versuch war nicht so erfolgreich

Unser nächster Versuch hat eine lokale Datenbank, die auf einem PC läuft, was den Backend-Engpass beseitigen sollte. Hier stoßen wir jedoch auf einen Engpass beim Scannen: Selbst wenn nur ein Tag aktiv ist, erhalten wir weniger als 10 % der Advertisements. Eine schnelle Suche im Internet zeigt, dass dies mit der Mac OSX BLE-Scanning-Firmware und -Hardware zusammenhängen könnte, die die Antenne mit Wi-Fi teilt und nicht 100 % der Zeit scannt.

Grafik, die anzeigt, dass es keine signifikante Verschlechterung der empfangenen Paketrate gibt
Es gibt keine signifikante Verschlechterung der empfangenen Paketrate, wenn wir 16 Beacons mit 100 ms senden lassen

Optisch scheint der Gesamtdurchsatz bei einem Tag 0,75, bei 8 Tags 4,5 und bei 16 Tags 11 zu betragen. Der Durchsatz eines einzelnen Tags war die ganze Zeit über ziemlich konstant 0,75.

Verfeinerung des Modells

Ein Vorteil unseres theoretischen Modells ist, dass es Gateway-Unvollkommenheiten berücksichtigt. Wir aktualisieren unsere Schätzungen mit einem Gateway-Verlust von 92 % und schätzen die Empfangsrate mit 51 Tags. Zur besseren Messung verwenden wir auch das tatsächliche durchschnittliche Übertragungsintervall von 105 ms, das die durchschnittliche zufällige Verzögerung in unserer Vorhersage berücksichtigt.

Ein erster Durchlauf zeigt, dass das Modell eine schnellere Kollisionszunahmerate aufweist, als wir sie bei einer Übertragungszeit von 650 Mikrosekunden sehen, und daher setzen wir die Übertragungszeit auf 450 Mikrosekunden, was etwas über der theoretischen Zeit liegt, die sich aus der Modulationsgeschwindigkeit ergibt. Nun stimmt unser Modell ziemlich gut mit dem Experiment überein, zumindest im Bereich von 1 bis 16 Beacons. Die Ergebnisse des ersten Durchlaufs lassen wir der Kürze halber weg.

N = 1:1:60;
throughput = zeros(1, length(N));
Tinterval = 0.105
Ttx = 65*10^-5
Pmiss = 1-(2*Ttx/Tinterval);
Penvironment = 0.080;
for i=1:1:length(N)
Pmiss_all = Pmiss^(i-1);
throughput(1, i) = i * Pmiss_all * Penvironment / Tinterval;
end
plot(N, throughput)
[v, i] = max(throughput)
a = gca();
a.font_size = 5;
a.x_label.text = string("Anzahl der Beacons") ;
a.x_label.font_size = 6;
a.y_label.text = "Durchsatz (N/s)";
a.y_label.font_size = 6;
e=gce();
p1=e.children(1);
t=datatipCreate(p1,1);
t.font_size = 5;
t=datatipCreate(p1,8);
t.font_size = 5;
t=datatipCreate(p1,16);
t.font_size = 5;
Grafik, die anzeigt, dass die geschätzten Werte mit den gemessenen Werten verglichen werden können
Die geschätzten Werte können mit den gemessenen Werten verglichen werden.

Jetzt haben wir ein verfeinertes Modell, das einigermaßen gut mit den gemessenen realen Daten übereinstimmt. Es ist Zeit zu sehen, wie sich das Modell verhält, wenn wir insgesamt 51 Tags hinzufügen.

Einundfünfzig RuuviTags auf einem Tisch
Einundfünfzig RuuviTags warten darauf, das Spektrum mit Daten zu füllen.

Die hier verwendeten Tags sind Fabrikausschuss, faire Vorführmuster usw. Bei diesem Experiment wurden keine Ruuvis beschädigt. Da einige der von uns zum Testen verwendeten Tags unsere Produktionstests nicht bestanden haben, sendeten zwei der Tags überhaupt nichts. Die endgültige Gesamtzahl der Sender betrug 49.

Grafik, die Daten zeigt
Und wir haben die Daten erhalten.
N = 1:1:60;
throughput = zeros(1, length(N));
throughput_single = zeros(1, length(N));
throughput_measured = [ 3, 6.5, 9.1, 11.2, 16.9, 20, 24.6, 27.2, 29.5, 31.9 ];
throughput_samples = [ 5, 10, 14, 18, 25, 30, 35, 40, 45, 49 ];
Tinterval = 0.105
Ttx = 45*10^-5
Pmiss = 1-(2*Ttx/Tinterval);
Penvironment = 0.080;
for i=1:1:length(N)
Pmiss_all = Pmiss^(i-1);
throughput(1, i) = i * Pmiss_all * Penvironment / Tinterval;
throughput_single(1, i) = Pmiss_all * Penvironment / Tinterval;
end
plot(N, throughput)
plot(throughput_samples, throughput_measured, 'g')
a = gca();
a.font_size = 5;
a.x_label.text = string("Anzahl der Beacons") ;
a.x_label.font_size = 6;
a.y_label.text = "Durchsatz (N/s)";
a.y_label.font_size = 6;
hl = legend(["Geschätzt", "Gemessen"], 2);
hl.font_size = 5;
Grafik, die anzeigt, dass unsere gemessene Datenrate nicht den gleichen Abfall wie die Schätzung zeigt
Unsere gemessene Datenrate zeigt nicht den gleichen Abfall wie die Schätzung

Merkwürdigerweise gibt es keinen merklichen Effekt, dass weniger Pakete empfangen werden, wenn wir mehr Beacons hinzufügen. Vielleicht begrenzt die Firmware meines Macbooks die Ergebnisse, wenn sie mit extremer Rate eingehen, und wir empfangen weiterhin Pakete mit der maximalen Rate, die von meiner Hardware unterstützt wird?

Wir können einen anderen Ansatz wählen, um die Zuverlässigkeit zu bestimmen. Wir lassen 46 Beacons über Nacht eingeschaltet und überprüfen die Anzahl der 10-Sekunden-Intervalle, in denen mindestens ein Beacon nicht gesehen wurde.

Grafik, die fehlende Beacons anzeigt
Ich zähle 70 fehlende Beacons, deine Zählung könnte abweichen.

Im Laufe von 10 Stunden gibt es 3.600 10-Sekunden-Intervalle, und wir haben 46 Beacons für insgesamt 165.600 Samples eines Beacons, das 10 Sekunden lang Daten sendet. Bei 70 dieser Samples wurden keine Daten empfangen.

Ein Zuverlässigkeitsrechner gibt uns eine 99,99%ige Sicherheit für eine 99,94%ige Zuverlässigkeit des Datenempfangs innerhalb eines 10-Sekunden-Intervalls. Wir werden dieses Ergebnis mit unserem früheren Zuverlässigkeitsschätzer überprüfen.

Ttransmission = 65e-5;
Tinterval = 0.1;
Penvironment = 0.95;
Ntags = 1:1:50;
Pmiss = 1 - (2*Ttransmission/Tinterval);
Pmiss_all = Pmiss^(Ntags - 1) * Penvironment;
Pnot_miss_all = 1-Pmiss_all;
Nbroadcasts = 1000;
for i=1:1:Nbroadcasts
Pnot_detect(i, :) = Pnot_miss_all^i;
end
Pdetect = 1 - Pnot_detect;

th1 = 0.9994;
[idx, idy] = find(Pdetect > th1);
[uniq, map] = unique(idy);
plot(1:1:length(map), idx(map));

a = gca();
a.font_size = 5;
a.x_label.text = string("Anzahl der Beacons") ;
a.x_label.font_size = 6;
a.y_label.text = "Zeit bis zur Erkennung mit Wahrscheinlichkeit (s)";
a.y_label.font_size = 6;

hl = legend(["99.94 %"], 2);
hl.font_size = 5;
Grafik, die die Zeit zur Anzeige von Beacons angibt
Die Schätzung stimmt überein, dass es 10 Sekunden dauert, um 46 Tags mindestens einmal mit 99,94 %iger Sicherheit zu scannen, wenn die Tags in einem Intervall von 100 ms senden und das Gateway die Übertragungen mit 95 %iger Sicherheit empfängt.

Merkwürdigerweise stimmt unser Zuverlässigkeitsschätzer genau mit den Messungen überein, während die Paketverlustrate stark abwich. Eine mögliche Ursache ist, dass die Macbook BLE-Firmware mehrere Übertragungen von derselben MAC-Adresse in einem Batch sammelt und nur ratenbegrenzte Ergebnisse an höhere Ebenen des Betriebssystems und der Anwendungen meldet.

Fazit

Die ursprüngliche Frage war: Wie viele Beacons kann ich in einem Bereich haben? Für die meisten Leute können wir mit Zuversicht sagen: Genug. Wir hatten bis zu 46 Beacons, die in einem Intervall von 100 ms sendeten, und wir konnten sie alle mit relativ hoher Geschwindigkeit und guter Zuverlässigkeit hören.

Wenn die Ergebnisse auf langsamere Intervalle und eine größere Anzahl von Beacons skaliert werden können, könnten wir schätzen, dass 460 Beacons, die in einem Intervall von 1 s senden, innerhalb von 100 Sekunden gehört werden könnten und 4.600 Beacons, die in einem Intervall von 10 s senden, innerhalb von 1.000 Sekunden mit ziemlich guter Zuverlässigkeit gehört werden könnten. Diese Schätzung wird jedoch nicht durch ein Experiment untermauert.

Modelle für Paketverluste konnten nicht verifiziert werden, da die meisten Pakete aus noch unbekannten Gründen nicht von unserer Empfangshardware empfangen wurden. Eine Nachuntersuchung mit dedizierter Scan-Hardware und -Software muss durchgeführt werden, um diese Schätzungen zu überprüfen.

Bleib dran für einen Folgebeitrag mit dedizierten nRF52-Scannern und Tags, die mehrere MAC-Adressen senden, um präzisere Ergebnisse zu den Grenzen der Sender in diesem Bereich zu erhalten.

Vielen Dank an Lauri Jämsä.