BSS-Testuite

Die BSS (Binary Sensor Service) Testsuit kann einen Client und einen Server simulieren. Die Testsuit läuft auf Windows 11und ist eine WPF DotNET Applikatioon. Linke Seite ist die Client (Central) Funktionalität implementiert und auf der rechten Seite ein Server (Peripheral).
Damit kann man eine Verbindung zum Peripheral, in unserem Falle ein XIAO-NRF52840-nosSens, aufbauen und die Kommunikation der BSS Spezifikation testen. Aber natürlich auch die Fensterüberwachung prüfen ob sie funktioniert.
BSS Implementation .NET
BSS Brief
BSS ist eine Spezifikation mit der man ein Binary Sensor Modul standardmäsig ansprechen kann. Das BSS unterstützt drei Arten von Sensor Typen, Ein/Aus Sensor, Vibration erkannt Sensor, und Person erkannt Sensor. Eingentlich ideal für eine Fensterüberwachung, da Fenster offen/zu benötigen, Vibration erkennt, wenn jemand an die Scheibe klopft, und Person erkannt wenn er durch die Fensteröffnung steigt.
Die BSS stellt den GATT Service ‚BinarySensor‘ mit UUID =0x183B zur Verfügung und hat zwei Charakter :
- bssControlPointChar mit UUID = 0x2B2B
- bssResponseChar mit UUID =0x2B2C.
Im Prinzip wird ControlPoint von den Centrals zum Senden von Befehlen verwendet und ResponseCharacteristic vom Perihperal für die Amtwort oder das Reporting. Es gibt dazu 6 Befehle die gemäss unten im Interface dargestellt zu implementieren sind.
Wie schon gesagt gib es 3 Sensor Typen, und diese 2 mal, nämlich als single oder als multiple. Die Spezifkation unterscheidet zwischen einem einzelnen Sensor oder eben mehrere gleiche. je nach Sensormodul wird die Implementation dann einfacher, wenn nur ein Sensor vorhanden ist. In meinem Falle sind alle multiple implementiert und wenn nur einer vorhanden ist schaltet es selber auf single um.
internal interface IBSS {
// All BSS message types
byte[] CreateGetSensorStatusCommand(byte sensorType);
byte[] CreateGetSensorStatusResponse(BSSensorType sensorType, List<Sensor> sensorList);
byte[] CreateSettingSensorCommand(byte sensorType, byte status, string[] names);
byte[] CreateSettingSensorResponse(List<Sensor> sensorList);
byte[] CreateSensorStatusEvent(BSSensorType sensorType, List<Sensor> sensorList);
byte[] CreateStopSensorStatusEvent();
MsgType? BuildMessageFromStream( byte[] msg); // fills the message struct from received stream
// for disassembling incomming messages
BSSensorType DisaGetStatusCommand( MsgType msg);
List<Sensor> DisaStatusResponse( MsgType msg);
SetSensorCmd DisaSetSensorCommand( MsgType msg);
SetSensorCmd DisaSetSensorRespons( MsgType msg);
SensorStatus DisaSensorStatusEvent(MsgType msg);
byte GetNextSensortyp(byte sensorType); // for iterate over all Sensortype by the initialisation
}
Nebst den 6 Befehlen die den Datenstream zusammenbauen und senden, gibt es noch 5 disassembling Methoden , welche den erhaltenen Datenstream wieder in Objekte und Felder zuerlegen.
Dabie ist zu erwähnen, dass die Meldungsgrösse nicht grösser als 256 Byte sein kann. Darum wird der Meldung vorab ein Split Header Byte gesendet. Das eine fortlaufende Sequennummer und end of Message Bit enthält. Die SenderMethoden müssen die Meldung in Fragmente aufteilen und die Empfänger vor der Bearbeitung wieder zusammen setzen. Unahhängig der Meldungsgrösse ist immer ein Splittheader das erste Byte.

Ein Besipiel wie ein Bytestream zwischen Central und Peripheral hin und her gesendet wird. Hier ein SetSensorComand mit 2 Sensoren OCL und Namen und die entsprechende Antwort dazu. Beachte, wenn es Namen oder Werte hat werden oder müssen immer alleu und in der gleichen Reihefolge gesendet werden. Wenn keine Namen vorhanden sind werden keine gesendet, gilt für alle Sensoren eines Typs.
BLE Implementation .NET
Wenn Du das erste mal mit .Net und Bluetooth LE arbeitest, dann ist es eine gute Idee das Microsoft Sample herunterzuladen und im Visual Studio zu bilden und zu starten. Dann hat man mindestens einen Ansatz und kann sich das wo man braucht heruas koppieren.
/// <summary>
/// Starts the watcher which is looking for avaiable BLE Devices.
/// This Code is from Microsoft Sample BluetoothLE and modified for my need.
/// Property strings are documented here https://msdn.microsoft.com/en-us/library/windows/desktop/ff521659(v=vs.85).aspx
/// </summary>
public void StartBleDeviceWatcher() {
ActualDevicesList.Clear(); // make sure the devicelist is empty
string[] requestedProperties = ["System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected", "System.Devices.Aep.Bluetooth.Le.IsConnectable"];
string aqsAllBluetoothLEDevices = "(System.Devices.Aep.ProtocolId:=\"{bb7bb05e-5972-42b5-94fc-76eaa7084d49}\")";
deviceWatcher = DeviceInformation.CreateWatcher(aqsAllBluetoothLEDevices, requestedProperties, DeviceInformationKind.AssociationEndpoint);
deviceWatcher.Added += DeviceWatcher_Added; // Register event handlers before starting the watcher.
deviceWatcher.Updated += DeviceWatcher_Updated;
deviceWatcher.Removed += DeviceWatcher_Removed;
deviceWatcher.EnumerationCompleted += DeviceWatcher_EnumerationCompleted;
deviceWatcher.Stopped += DeviceWatcher_Stopped;
deviceWatcher.Start();
// Start the watcher. Active enumeration is limited to approximately 30 seconds.
// This limits power usage and reduces interference with other Bluetooth activities.
// To monitor for the presence of Bluetooth LE devices for an extended period,
// use the BluetoothLEAdvertisementWatcher runtime class. See the BluetoothAdvertisement
// sample for an example.
}
Copy of subset from MS Lern
Protocol or network device type | Id |
---|---|
Wi-Fi Direct | {0407d24e-53de-4c9a-9ba1-9ced54641188} |
Bluetooth | {e0cbf06c-cd8b-4647-bb8a-263b43f0f974} |
Bluetooth LE | {bb7bb05e-5972-42b5-94fc-76eaa7084d49} |
Network Camera | {b8238652-b500-41eb-b4f3-4234f7f5ae99} |
BSS Testsuite Einführung

Bedienungsablauf:
- Mit dem Toggle Button Client einschalten.
- Pheripheral Advertising Name eingeben. Dies kann man mit den Nordic Tool „NRF Connect“ für IOS oder Android herausfinden.
- Bluetooth Watcher starten. Es wird nur connected wenn der Watcher den Namen findet.
- Wenn der Device gefunden ist und man wie im Beispiel die GATT Device Information Characteristic definiert hat wird hier die Device Information eingeragen.
- Dann ruft man die GetSensorStatusCommand, die vom Peripheral die Sensor Konfirguration verlangt, auf. Es werden alle 6 Sensortypen abgefragt.
- Die gefundenen Sensoren werden hier in den Listen angezeigt. Es werden auch die Zustände der Sensoren aktualisiert. Rot ist aktiv grau ist off oder open.
- Für die Settings muss man vorab wählen , welchen Sensortyp es betreffen soll.
- Wenn man will , kann oder muss man das Reporting aktivieren. oder deaktivieren. (je nach dem wie der Peripheral reporting automatisch eingeschalen hat.
- Dann kann man hier die Settings schreiben. Es werden die Namen und das Reporting Flag gesendet ( vorher kann man die Namen ändern von <noname> nach irgend etwas. Der Server antwortet mit den Namen. diese werden von der Testsuit verglichen und im Log sieht man ob sie richtig zurückgekommen sind. Achtung Namen werden auf 31 Zeichen gekürzt da die Spez. die Namen auf max. 31 Zeichen festgelegt hat.
- Hat die Batterie Characteristic im Peripheral einen Wert (floating A0 da keine Batterie angeschlossen ist,), dann wird hier mit Farbe den Level angzeigt.
- Die Uhr muss laufen sonst hängt die Testsuit irgendwo.
- Auf das Loge clicken, wenn man das Logfenster ein/ausblenden will.
- Mit diesem Balken kann man die GetSensorStatusCommand für den entsprechenden Sensortyp Senden.

Klickt man oben rechts auf das Logo schiebt sich von unten ein Logger Fenster ein . Das Loge wechselt sein Bild. Klickt man ein weiteres mal so verschwindet der logger wieder. Die Logdaten bleiben erhalten.
Das Logger Fenster macht Logeinträge mit folgender struktur:
Cli oder Srv; Zeit, EventNr; Text. Drückt man rechts auf X werden die Logeinträge gelöscht.

Programmbeschreibung
Das Programm macht mehr oder weniger nichts anderes als die Sensoren eines Peripheral (Sensormodul) gemäss den Bluetooth BSS SpezifikationV1.0 konfigurieren und anzeigen. Es gibt eine Komponente ‚Central‘ die zusammn mit dem Viemodel die Businesslogik enthält. Ein Model das die konfigurierten und aktuellen Werten der Sensoren des Peripheral abspeichert. Und die ‚BSS‘ Komponente die das Protokoll zwischen Central und Peripheral ist. Die Komponente View ist WPF XAML und das Binding zwischen Viewmodel und View ist mit der Komponene Community VMMV-Toolkit von MS implemteniert.
Um die Doppelspurigkeit etwas zu reduzieren ist der Code gut kommentiert. Darum macht es sinn sich den Code herunter zu laden und anzusehen. Um es allen Entwickler bzw. Newbie zu erleichtern ist der Code immer in English kommentiert. Im Abschnitt VS Explorer sieht man in welcher Ordnern man welche Sourcecode man finden kann.

VS Explorer (Ordnerstruktur)
Businesslogic: | enthält BLE Central Komponente, |
Content | enthält die benötigten Bilder |
Model | enthält die 3 Sensorenliste , BLE Device Information, und BLE Konstanten (alle UUIDs der Bluetoothspez. |
Util: | enthält Die Bluetooth BSS Implementation, Helper, Globale Variablen. |
View | enthält XAML GUI mit Code behind (entry point) |
Viewmodel | enthält das Viewmodel (nach VMMV Toolkit) |
Es gibt zwei mal Sensorlisten, im Model als Root und im Viewmodel als observable Objekt, das mit dem View gekoppelt ist. Das ist nicht so schön aber aus der Sicht des Models, könnte man hier die DB-Schnittstelle ansetzen.
Goodies
Goodies
Link auf testsuit
Develope Info
Windows 11 Pro, 64Bit HP Elitdesk
- Visual Studio 2022
- Community Toolkit 8.2.2
- C#
- WPF MaterialDesign
- RabbitMQ 3.13 dotNet Client
- BSS nach Bluetooth Binary Sensor Service Specification V1.0 , Rev. 2019-07-02
Challenges
- MVVM
Mit dem Modle View ViewModel Pattern kann man sich viel Zeit und Arbeit sparen, wnn man das Communit Toolkit von MS zur Hilfe nimmt. Ständig werden namen und Begriffe verändert, so dass man immer wieder verwirrt wird wenn man im Internet nach Infos und Hilfe sucht. Früher hiess das Paket MVVM Toolkit, jetzt Community Toolkit. Es gibt noch andere Tools wie MVVMLight und viele andere, aber für diese einfache App reicht es das erst beste zu verwenden. - BLE
Ohne Sample von Microsoft, weiss man nicht wie man mit BLE anfangen soll. Man arbeitet nicht mit einer Bluetooth Komponente, sondern mit Windows. Device, mit dem Bluetooth Teil. Man muss viel mehr verstehen über devices in .net als bloss BL. - Doc
Das Dokumentiren von untertschiedlichen IDE, kann nicht einheitlich erfolgen. Da wird viel zu viel generiert das niemand lesen wird. - Webdoc
Die Webseite mit WordPress und Divi hab ich mir einfacher vorgestellt. Das ganze wird sich mit der Zeit wahrscheinlich viel verändert. - Internet Hilfe
Die Kunst Spreu von Weizen trrennen gilt auch im Internet. Stackoverflow ist immer noch mein Favorit , wenn ich Antworten auf ein Problem suche.
Lession learned
- Der Einstieg in Bluetotooth mit Windows gelingt nur, wenn man ein entsprechendes Testumfeld hat.
- BSS portierung vom arduino c++ war eigentlich eine Neuprogrammierung.
- Dokuemtation von Code und ItPprojekten muss ich mir noch einmal überdenken.
Release notes
- V1.0-0 Testsuite build 18.03. 20224
Testsuite .net for Windows with- BSS Bluetotth Specification 1.0 for HOBRO Project
- Advertisment reading for Hobro IOT devices
- Battery level display
- Reading of Characteristics
- A client and a server (BLE Peripheral, BLE Server)
- V1.1-0 Testsuite build 27.10.2024
Testsuite with HOBRO Eventlogger integration via RabbitMQ.- Extended the BSS Specification with reset of Senssor (non BL standar) reportstatus:
- 10: Value defined for reset sensor ,
- 20 : Value for reset counter.
- Rename Eventlognumber for consistency with other app in HOBRO
- Update GUI with reset buton
- Extended the BSS Specification with reset of Senssor (non BL standar) reportstatus:
Questions
Hier sind Fragen aufgeführt, für die ich noch eine Antwort suche.
- nothing yet
Hier ended die Seite