Hello World,用于通过C#从Bluetooth(BLE)设备接收数据

下午好

几周前,我遇到了一个问题,那就是在首次使用Bluetooth接收数据时,根本没有普通而现代的文章。 而且我不得不修补它,以了解从哪里开始以及如何做。 为了使人们不再重复我的错误,这里有一篇简短的文章介绍如何做到这一点。



但是首先,有几个悲哀的词,对此通常是必须的。 现代世界越来越沉浸在物联网的意识形态中。 现在,所有事物彼此相互作用,一个带炉子的冰箱,一个带吸尘器的熨斗,等等。 Apple Watch中的ECG引起了很大的噪音,但是现代的血压计,心率监测器,温度计早已能够通过蓝牙传输数据。 所有这些都需要以某种方式连接到单个网络。 不管怎么说,该网络中的关键要素都是计算机。 在这方面,出现了通过蓝牙从特定设备接收数据的任务。

首先,我们已经拥有的东西以及加剧寻找解决方案的原因。 我们有一个用.Net Core编写的应用程序。 该应用程序的本质并不重要,为简单起见,我们将假定我们仅在.Net Core上具有一个控制台。 好吧,该设备将被称为字母N。

首次尝试通过C#查找与Bluetooth配合使用的内容的尝试将进入32feet库。

在NuGet软件包中,听起来像32feet.NET

顺便说一下,她在最新产品版本中甚至找到了蓝牙设备,但找不到BLE标准(后来证明了)。 例如,稳定地搜索了相同的OnePlus 5T,但不是必需的设备N。 与此同时,作者的官方回答是,他的库原则上不与BLE交互,因此没有任何尝试的意义。 尽管Github上有一个支持BLE的InTheHand.Devices.Bluetooth初步版本,但一切都发生了很大变化,并且根本没有文档说明它甚至无法使用32feet.NET的思想来编译该项目。

新的研究使我找到了更多的标准解决方案,即通用Windows平台UWP )。 在开发该平台时, Microsoft出于对多功能性和适用于计算机和电话的单一应用程序的想法,尝试与蓝牙进行交互。 在这里一切都运行良好,但是...我们在.Net Core上有一个项目...对此无可奈何。

我必须马上说,我们找不到UWP库与.Net Core交互的解决方案,因此该项目必须切换到4.7.1。 ,好处并不难。 尽管有人考虑过如何将项目保留在.Net Core上 ,例如制作一个单独的Windows服务,并通过命名管道(命名管道)进行数据传输,或者引发WCF服务并与其建立交互,但是在我们看来,这没有任何意义。



所以最后我们要开始了:

  • 4.7.1上进行项目
  • Win10已更新至版本10.0.17134 Build 17134。

首先,您需要用笔连接几个库,即

  • “来自通用Windows平台的Windows”
    C:\ Program Files(x86)\ Windows Kits \ 10 \ UnionMetadata \ 10.0.17134.0 \ Windows.winmd
  • “ System.Runtime.WindowsRuntime”
    C:\ Program Files(x86)\ Reference Assemblys \ Microsoft \ Framework \ .NETCore \ v4.5 \ System.Runtime.WindowsRuntime.dll

实际上,所有事情,然后使用设备本身进行的工作都会毫无问题地贯穿整个文档。
通过BluetoothLEAdvertisementWatcher类与BLE交互
但是我们不能忘记,没有设备本身的API,明智的做法是行不通的。

这是有关如何从设备获取数据的示例代码。

此代码旨在确保已添加(连接)设备。

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) { ; } } 

谢谢您的关注。

Source: https://habr.com/ru/post/zh-CN423893/


All Articles