Hallo Welt für den Empfang von Daten von einem Bluetooth (BLE) -Gerät über C #

Guten Tag.

Vor ein paar Wochen hatte ich das Problem, dass es einfach keinen normalen und modernen Artikel zum ersten Empfang von Daten mit Bluetooth gibt . Und ich musste daran basteln, um zu verstehen, wo ich anfangen soll und wie ich es überhaupt machen soll. Und damit die Leute meine Fehler nicht wiederholen, finden Sie hier einen kurzen Aufsatz darüber, wie das geht.



Aber zuerst ein paar pathetische Worte, für die dies im Allgemeinen notwendig ist. Die moderne Welt taucht zunehmend in die Ideologie des Internet der Dinge ein. Jetzt interagiert alles miteinander, ein Kühlschrank mit Herd, ein Bügeleisen mit Staubsauger usw. Durch das EKG in der Apple Watch wurde viel Lärm erzeugt, aber moderne Blutdruckmessgeräte, Herzfrequenzmesser und Thermometer können seit langem Daten über Bluetooth übertragen. Und das alles muss irgendwie mit einem einzigen Netzwerk verbunden sein. Und das Schlüsselelement in diesem Netzwerk ist, was auch immer man sagen mag, ein Computer. In diesem Zusammenhang ergab sich die Aufgabe, Daten von einem bestimmten Gerät über Bluetooth zu empfangen.

Zunächst einmal, was wir bereits hatten und was die Suche nach einer Lösung verschärfte. Und wir hatten eine Anwendung in .Net Core geschrieben . Was das Wesentliche der Anwendung ist, ist unwichtig. Der Einfachheit halber nehmen wir an, dass wir nur eine Konsole auf .Net Core haben . Nun, das Gerät wird der Buchstabe N genannt.

Die ersten Versuche, etwas zu finden, das mit Bluetooth über C # funktioniert, führen zur 32-Fuß- Bibliothek.

In NuGet-Paketen klingt es wie 32feet.NET .

Übrigens findet sie in ihrer neuesten Produktausgabe sogar Bluetooth-Geräte, aber nicht den BLE-Standard [wie sich viel später herausstellte]. Zum Beispiel wurde derselbe OnePlus 5T stabil durchsucht, das erforderliche Gerät N jedoch nicht. Parallel dazu wurde in der offiziellen Antwort des Autors festgestellt, dass seine Bibliothek im Prinzip nicht mit BLE interagiert und es keinen Sinn macht, es zu versuchen. Obwohl es auf Github eine vorläufige Version von InTheHand.Devices.Bluetooth gibt , die BLE unterstützen sollte, wurde alles so stark geändert und es gibt überhaupt keine Dokumentation, dass es nicht einmal funktioniert hat, das Projekt mit Ideen aus 32feet.NET zu kompilieren.

Neue Forschungsergebnisse führten mich zu mehr Standardlösungen, nämlich der Universal Windows Platform ( UWP ). Bei der Entwicklung dieser Plattform hat Microsoft , das von der Idee der Vielseitigkeit und einer einzigen Anwendung für Computer und Telefon überzeugt ist, versucht, mit Bluetooth zu interagieren. Und hier funktioniert einfach alles gut, aber ... Wir haben ein Projekt zu .Net Core ... und es gibt nichts zu tun.

Ich muss sofort sagen , dass wir keine Lösungen für die Interaktion von UWP- Bibliotheken mit .Net Core finden konnten und das Projekt auf 4.7.1 umgestellt werden musste . ist der Nutzen nicht schwer. Es gab zwar Überlegungen, das Projekt auf .Net Core zu belassen und beispielsweise einen separaten Windows-Dienst mit Datenübertragung über Named Pipes (Named Pipe) zu erstellen oder einen WCF- Dienst zu eröffnen und eine Interaktion mit ihm herzustellen, aber in unserem Fall war dies nicht sinnvoll.



Am Ende haben wir also vor dem Start:

  • Projekt am 4.7.1.
  • Win10 wurde auf Version 10.0.17134 Build 17134 aktualisiert .

Zuerst müssen Sie ein paar Bibliotheken mit Stiften verbinden, nämlich

  • "Windows von der universellen Windows-Plattform"
    C: \ Programme (x86) \ Windows Kits \ 10 \ UnionMetadata \ 10.0.17134.0 \ Windows.winmd
  • "System.Runtime.WindowsRuntime"
    C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework \ .NETCore \ v4.5 \ System.Runtime.WindowsRuntime.dll

Und eigentlich alles, dann geht die Arbeit mit dem Gerät selbst problemlos durch die Dokumentation.
Interagieren Sie mit BLE über die BluetoothLEAdvertisementWatcher-Klasse
Wir dürfen jedoch nicht vergessen, dass ohne die API des Geräts selbst etwas Sinnvolles nicht funktioniert.

Hier ist mein Beispielcode zum Abrufen von Daten von einem Gerät.

Dieser Code soll sicherstellen, dass das Gerät bereits hinzugefügt (verbunden) wurde.

public class BluetoothObserver { BluetoothLEAdvertisementWatcher Watcher { get; set; } public void Start() { Watcher = new BluetoothLEAdvertisementWatcher() { ScanningMode = BluetoothLEScanningMode.Active }; Watcher.Received += Watcher_Received; Watcher.Stopped += Watcher_Stopped; Watcher.Start(); } private bool isFindDevice { get; set; } = false; private async void Watcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args) { if (isFindDevice) return; if (args.Advertisement.LocalName.Contains("deviceName")) { isFindDevice = true; BluetoothLEDevice bluetoothLeDevice = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress); GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesAsync(); if (result.Status == GattCommunicationStatus.Success) { var services = result.Services; foreach (var service in services) { if (!service.Uuid.ToString().StartsWith("serviceName")) { continue; } GattCharacteristicsResult characteristicsResult = await service.GetCharacteristicsAsync(); if (characteristicsResult.Status == GattCommunicationStatus.Success) { var characteristics = characteristicsResult.Characteristics; foreach (var characteristic in characteristics) { if (!characteristic.Uuid.ToString().StartsWith("characteristicName")) { continue; } GattCharacteristicProperties properties = characteristic.CharacteristicProperties; if (properties.HasFlag(GattCharacteristicProperties.Indicate)) { characteristic.ValueChanged += Characteristic_ValueChanged; GattWriteResult status = await characteristic.WriteClientCharacteristicConfigurationDescriptorWithResultAsync(GattClientCharacteristicConfigurationDescriptorValue.Indicate); return; } if (properties.HasFlag(GattCharacteristicProperties.Read)) { GattReadResult gattResult = await characteristic.ReadValueAsync(); if (gattResult.Status == GattCommunicationStatus.Success) { var reader = DataReader.FromBuffer(gattResult.Value); byte[] input = new byte[reader.UnconsumedBufferLength]; reader.ReadBytes(input); // input } } } } } } } } private void Characteristic_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args) { var reader = DataReader.FromBuffer(args.CharacteristicValue); byte[] input = new byte[reader.UnconsumedBufferLength]; reader.ReadBytes(input); // input } private void Watcher_Stopped(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementWatcherStoppedEventArgs args) { ; } } 

Vielen Dank für Ihre Aufmerksamkeit.

Source: https://habr.com/ru/post/de423893/


All Articles