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);
Vielen Dank für Ihre Aufmerksamkeit.