如何在 Windows 桌面应用程序中配对和搜索手机上的蓝牙低功耗服务?

Posted

技术标签:

【中文标题】如何在 Windows 桌面应用程序中配对和搜索手机上的蓝牙低功耗服务?【英文标题】:How to pair and search Bluetooth Low Energy services on phone in windows desktop application? 【发布时间】:2018-09-19 15:47:58 【问题描述】:

我们得到了托管 GATT 服务器的手机应用程序,该服务器具有服务和特性。从桌面应用程序中,我们尝试使用 DeviceWatcher 使用 UWP API 搜索它。

var deviceWatcher = DeviceInformation.CreateWatcher(
        BluetoothLEDevice.GetDeviceSelectorFromPairingState(false),
        new List<string>(),
        DeviceInformationKind.AssociationEndpoint);

然后我们尝试从设备获取服务

var serviceResult = await device.GetGattServicesForUuidAsync(ServiceId);

但是这种方法很不稳定。查找并连接到设备需要 30-60 秒。有时它没有找到设备或找到设备但无法获得服务。

我们还尝试将设备与 PC 配对并仅检查已配对或连接的设备

var deviceWatcher = DeviceInformation.CreateWatcher(
        BluetoothLEDevice.GetDeviceSelectorFromPairingState(true),
        new List<string>(),
        DeviceInformationKind.AssociationEndpoint);

但是这个观察者没有找到任何东西。我们尝试了不同的 AQS 过滤器并得到了相同的结果。

我们还尝试使用 32feet 库来仅获取已配对的连接设备。

var client = new BluetoothClient();
var paired = client.DiscoverDevices(5, true, true, false);
foreach (var bluetoothDeviceInfo in paired)

   var addressBytes = bluetoothDeviceInfo.DeviceAddress.ToByteArray();
   var addr = BitConverter.ToUInt64(addressBytes, 0);
   var device = await BluetoothLEDevice.FromBluetoothAddressAsync(addr));
   var serviceResult = await device.GetGattServicesForUuidAsync(ServiceId);

它可以快速找到手机,但找到的设备不包含我们的 GATT 服务,并且它的蓝牙地址与 DeviceWatcher 找到的设备不同。看起来一部手机上有两个蓝牙设备:第一个设备有我们的 BLE 服务,第二个设备已配对但没有服务。

有什么方法可以配对正确的 BLE 设备并只搜索配对?

【问题讨论】:

你试试官方BluetoothLE的代码吗?在我的测试中,当服务器启动时,客户端可以快速找到它。您能否提供一个最小的复制样本来帮助我查看您的问题? @BreezeLiu-MSFT 您好,我们发现了为什么要花这么长时间才能找到正确的设备。获取服务 device.GetGattServicesForUuidAsync(ServiceId) 需要很多时间。我们发现我们可以直接通过 BluetoothLEAdvertisementWatcher 搜索服务 【参考方案1】:

最后我发现了如何使用 BluetoothLEAdvertisementWatcher 直接搜索服务。

_watcher = new BluetoothLEAdvertisementWatcher();
_watcher.ScanningMode = BluetoothLEScanningMode.Active;
_watcher.SignalStrengthFilter = new BluetoothSignalStrengthFilter
                                    
                                         InRangeThresholdInDBm = -75,
                                         OutOfRangeThresholdInDBm = -76,
                                         OutOfRangeTimeout  = TimeSpan.FromSeconds(2),
                                         SamplingInterval = TimeSpan.FromSeconds(2)
                                    ;
_watcher.AdvertisementFilter =
     new BluetoothLEAdvertisementFilter
         
              Advertisement =
                  new BluetoothLEAdvertisement
                      
                            ServiceUuids =
                                
                                        BLEHelper.ServiceId
                                
                       
        ;
_watcher.Received += OnWatcherOnReceived;
_watcher.Start();

在 OnWatcherOnReceived 中我们可以获取蓝牙地址以连接服务并获取特征

    private void OnWatcherOnReceived(BluetoothLEAdvertisementWatcher w, BluetoothLEAdvertisementReceivedEventArgs a)
    
        // use a.BluetoothAddress to connect to device
    

【讨论】:

以上是关于如何在 Windows 桌面应用程序中配对和搜索手机上的蓝牙低功耗服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改桌面 Windows 应用程序图标以进行颤振?

什么是手机配对,

如何让我的应用通过 NFC 发送蓝牙配对请求

手机蓝牙怎样配对

win7系统下如何调出虚拟键盘

如何创建桌面快捷图标