Hello World zum Empfang von Daten von einem Bluetooth-Gerät (BLE) über C #

    Guten Tag.

    Vor ein paar Wochen bin ich auf das Problem gestoßen, dass es keinen normalen und modernen Artikel über den ersten Datenempfang von Bluetooth gibt . Und ich musste basteln, um zu verstehen, wo ich anfangen sollte und wie es im Allgemeinen zu tun ist. Und damit die Leute meine Fehler nicht wiederholen, finden Sie hier einen kurzen Aufsatz, wie dies möglich ist.



    Aber zuerst ein paar anmaßende Worte, für die es im Allgemeinen benötigt wird. Die moderne Welt taucht zunehmend in die Ideologie des Internets der Dinge ein. Jetzt interagieren alle 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 Tonometer, Herzfrequenz-Messgeräte und Thermometer können Daten schon lange über Bluetooth übertragen. Und das ist alles, was Sie brauchen, um sich irgendwie in ein einzelnes Netzwerk einzubinden. Und das Schlüsselelement in diesem Netzwerk ist, was immer man sagen mag, ein Computer. In dieser Hinsicht entstand 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 erschwerte. Und wir hatten eine Anwendung auf .NET Core geschrieben . Was die Essenz der Anwendung ausmacht, ist nicht wichtig. Zur Vereinfachung gehen wir davon aus, dass wir nur eine Konsole für .Net Core haben. Nun wird das Gerät den Buchstaben nennen N .

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

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

    Übrigens findet sie in ihrer letzten Lebensmittelausgabe sogar Bluetooth-Geräte, aber nicht den BLE-Standard [wie sich später herausstellte]. Beispielsweise wurde derselbe OnePlus 5T stabil durchsucht, das erforderliche Gerät N jedoch nicht. Zur gleichen Zeit wurde die offizielle Antwort des Autors gefunden, dass seine Bibliothek grundsätzlich nicht mit der BLE interagiert und es keinen Sinn hat, dies zu versuchen. Es gibt zwar eine vorläufige Version von InTheHand.Devices.Bluetooth auf Github, was BLE unterstützen sollte, aber es wurde so viel daran geändert, und es gibt überhaupt keine Dokumentation, dass selbst das Erstellen eines Projekts mit Ideen aus 32feet.NET nicht funktioniert hat.

    Neue Forschungen haben mich zu mehr Standardlösungen geführt, nämlich der Universal Windows Platform ( UWP ). Bei der Entwicklung dieser Plattform hat Microsoft von der Idee der Universalität und einer einzigen Anwendung für Computer und Telefon überzeugt, die Interaktion mit Bluetooth auszuprobieren. Und hier funktioniert alles gut, aber ... Wir haben ein Projekt auf .Net Core ... Und Sie können nichts dagegen tun.

    Ich werde sofort sagen , dass Lösungen für die Interaktion von UWP- Bibliotheken mit .Net Corees konnte nicht gefunden werden und das Projekt musste auf 4.7.1 umgestellt werden . ist der Nutzen nicht schwer. Es gab zwar Überlegungen, wie das Projekt auf .Net Core belassen werden sollte und beispielsweise ein separater Windows-Dienst mit der Übertragung von Daten über eine Named Pipe oder durch Aufnehmen eines WCF- Dienstes und Herstellen einer Interaktion mit diesem erstellt werden sollte, aber in unserem Fall war dies nicht sinnvoll.



    Am Ende haben wir also vor dem Start:

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

    Zuerst müssen Sie ein paar Bibliotheken mit Ziehpunkten 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, die weitere Arbeit mit dem Gerät wird ohne Probleme dokumentiert.
    Interagieren Sie mit BLE über die BluetoothLEAddressWatcher-Klasse.
    Sie müssen jedoch daran denken, dass ohne die API des Geräts selbst nichts sinnvolles möglich ist.

    Hier ist mein Beispielcode für das Abrufen von Daten vom Gerät.

    Dieser Code ist darauf ausgelegt, dass das Gerät bereits hinzugefügt (verbunden) wurde.

    publicclassBluetoothObserver
      {
        BluetoothLEAdvertisementWatcher Watcher { get; set; }
        publicvoidStart()
        {
          Watcher = new BluetoothLEAdvertisementWatcher()
          {
            ScanningMode = BluetoothLEScanningMode.Active
          };
          Watcher.Received += Watcher_Received;
          Watcher.Stopped += Watcher_Stopped;
          Watcher.Start();
        }
        privatebool isFindDevice { get; set; } = false;
        privateasyncvoidWatcher_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 = newbyte[reader.UnconsumedBufferLength];
                        reader.ReadBytes(input);
                        //Читаем input
                      }
                    }
                  }
                }
              }
            }
          }
        }
        privatevoidCharacteristic_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args)
        {
          var reader = DataReader.FromBuffer(args.CharacteristicValue);
          byte[] input = newbyte[reader.UnconsumedBufferLength];
          reader.ReadBytes(input);
          //Читаем input
        }
        privatevoidWatcher_Stopped(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementWatcherStoppedEventArgs args)
        {
          ;
        }
      }

    Vielen Dank für Ihre Aufmerksamkeit.

    Jetzt auch beliebt: