如何在 Windows 10 上控制蓝牙 LE 连接?

Posted

技术标签:

【中文标题】如何在 Windows 10 上控制蓝牙 LE 连接?【英文标题】:How to control a Bluetooth LE connection on Windows 10? 【发布时间】:2017-01-21 01:19:51 【问题描述】:

我需要开发一个通过低功耗蓝牙与设备通信的应用程序。一旦应用程序通过蓝牙连接到设备,它就会使用 gatt 服务接收和发送数据。

应用程序需要在 Windows 10 环境中运行。到目前为止,我能够使用以下 UWP 类开发和试用该应用程序:

DeviceWatcher

BluetoothLEDevice

一旦设备被发现并配对,通信就会开始。我遇到的主要问题是我无法控制与设备的连接/断开连接,也就是说,一旦设备正确且先前配对,连接就会自动启动,但我没有找到任何连接()/断开连接( ) 方法。

有没有办法控制与特定蓝牙 LE 设备的连接?是否有其他 API 允许在不使用 UWP 框架的情况下使用蓝牙并且提供对蓝牙的更多控制?

【问题讨论】:

【参考方案1】:

设备配对后,只要它靠近 Windows 10 机器打开,它就会尝试连接。这是蓝牙中定义的行为,因为外围设备在打开时总是会发出连接请求。

您可以注册一个 DeviceWatcher 后台任务,以便在您的蓝牙设备连接时触发您的应用。你可以找到some sample code here。

有没有办法控制与特定蓝牙 LE 设备的连接?

是的。启动连接:当您通过FromBluetoothAddressAsyncFromIdAsync 创建BluetoothLEDevice 时,系统将尝试启动与该外围设备的连接,如果它尚未保持连接。

// Connects to a Bluetooth device, given some string deviceId
BluetoothLEDevice bleDevice = await BluetoothLEDevice.FromIdAsync(deviceId);

要释放连接,请在 BluetoothLEDevice 上调用 close 方法。如果您的应用程序是唯一拥有外围设备句柄的实体,这将导致系统断开连接。但是,如果另一个应用程序或系统服务拥有外围设备的句柄,则不会关闭连接。

// Will disconnect from the BTLE device, if you hold the only handle
bleDevice.close()

这些取自BluetoothLEDevice documentation here.

还有其他 API 吗?

没有任何其他内置于 Windows 10 的 API 可提供对蓝牙的更多控制。 UWP API 提供了 Windows 10 当前提供的最大控制。您可以使用备用蓝牙堆栈,但这些堆栈必须单独安装,并且可能会破坏 Windows 10 上的其他蓝牙行为。

【讨论】:

如果我有一个deviceId 列表并且我需要在一个无限循环中一个接一个地连接到它们中的每一个怎么办?我应该创建BluetoothLEDevice,获取它的服务,发送和传输数据,最后关闭设备,然后再转到下一个吗?以这种方式连接到每个设备会不会有问题?有没有更好的方法来做到这一点? 如果您稍后再打开连接,为什么还要关闭它?你能描述一下你想要完成什么吗? 是否可以同时保持与多个设备的连接?我需要向/从所有这些设备发送和接收数据。 是的,您可以一次保持与多个设备的连接,但根据您主机的无线电硬件有一个限制(在某些主机上可能低至 7 个)。 有时有效,有时无效。您对连接并没有真正的控制权。微软的一个非常糟糕的实现。

以上是关于如何在 Windows 10 上控制蓝牙 LE 连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Mac 连接到蓝牙 4.0/蓝牙 LE 设备?

使用 .Net Core 在 Raspberry Pi 上使用蓝牙 LE

有啥方法可以从 Windows 10 中的 c# 桌面应用程序使用蓝牙 LE?

使用 CoreBluetooth 通过 iOS 设备连接到 Windows 10

蓝牙双 LE 和经典模式标志

蓝牙 LE - 安卓上的 L2CAP CO 通道