UWP技术问题:如何检测配对BLE设备向当前设备的传入请求?
如何检测配对BLE设备的传入请求与数据
嘿,我来帮你梳理清楚这个问题的解决方向~你提到的“检测传入请求”其实可以拆成两种场景:监听连接/配对请求,以及监听设备连接后发来的数据,这两种场景在UWP里都有对应的API可以实现,不需要你手动搭建复杂的GATT服务器,下面我给你详细讲讲:
一、监听BLE设备的连接/配对请求
如果你想捕获配对设备发起的连接请求(比如设备试图和你的UWP设备建立连接),可以直接用BluetoothAdapter的相关事件:
- 首先获取默认的蓝牙适配器,然后注册对应事件:
var adapter = await BluetoothAdapter.GetDefaultAsync(); if (adapter != null) { // 监听设备连接请求 adapter.DeviceConnectionRequested += Adapter_DeviceConnectionRequested; // 监听设备配对完成事件 adapter.DevicePaired += Adapter_DevicePaired; } // 连接请求触发的回调 private void Adapter_DeviceConnectionRequested(BluetoothAdapter sender, BluetoothDeviceConnectionRequestedEventArgs args) { var requestingDevice = args.Device; // 这里可以处理连接请求,比如打印设备信息、允许连接等 Debug.WriteLine($"收到来自{requestingDevice.Name}的连接请求"); } // 配对完成触发的回调 private void Adapter_DevicePaired(BluetoothAdapter sender, BluetoothDevicePairingEventArgs args) { Debug.WriteLine($"设备{args.Device.Name}配对完成"); }
二、监听连接后传入的数据
你之前觉得GATT Server不是你需要的,其实是个小误解——BLE设备之间的数据传输本质上都是基于GATT特性的交互,但你不需要手动创建自定义服务,只需要发现配对设备已经能识别的GATT服务和特性,然后监听数据变化事件即可:
- 先获取配对的BLE设备,并监听连接状态:
// 替换成你配对设备的ID,可以通过设备管理器或者蓝牙设置获取 string targetDeviceId = "你的BLE设备ID"; var bleDevice = await BluetoothLEDevice.FromIdAsync(targetDeviceId); if (bleDevice != null) { // 监听设备连接状态变化 bleDevice.ConnectionStatusChanged += BleDevice_ConnectionStatusChanged; } private async void BleDevice_ConnectionStatusChanged(BluetoothLEDevice sender, object args) { if (sender.ConnectionStatus == BluetoothConnectionStatus.Connected) { Debug.WriteLine($"设备{sender.Name}已连接,开始监听数据"); // 发现设备的GATT服务并监听数据 await DiscoverGattCharacteristics(sender); } }
- 发现GATT特性并注册数据接收事件:
private async Task DiscoverGattCharacteristics(BluetoothLEDevice device) { var servicesResult = await device.GetGattServicesAsync(); if (servicesResult.Status == GattCommunicationStatus.Success) { foreach (var service in servicesResult.Services) { var charsResult = await service.GetCharacteristicsAsync(); if (charsResult.Status == GattCommunicationStatus.Success) { foreach (var characteristic in charsResult.Characteristics) { // 检查特性是否支持写入或通知(根据对方设备的传输方式选择) var properties = characteristic.CharacteristicProperties; if ((properties & GattCharacteristicProperties.Write) != 0 || (properties & GattCharacteristicProperties.Notify) != 0) { // 注册数据变化事件,有数据传入时触发 characteristic.ValueChanged += Characteristic_ValueChanged; // 如果是通知类型的特性,需要先启用通知 if ((properties & GattCharacteristicProperties.Notify) != 0) { var status = await characteristic.WriteClientCharacteristicConfigurationDescriptorAsync( GattClientCharacteristicConfigurationDescriptorValue.Notify); } } } } } } } // 数据传入时的回调,在这里解析数据 private void Characteristic_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args) { // 将收到的Buffer转成字节数组 byte[] receivedData = new byte[args.CharacteristicValue.Length]; DataReader.FromBuffer(args.CharacteristicValue).ReadBytes(receivedData); // 示例:转成UTF-8字符串 string dataString = Encoding.UTF8.GetString(receivedData); Debug.WriteLine($"收到数据:{dataString}"); // 在这里添加你的数据解析和业务逻辑 }
总结实现路径
- 若要监听连接/配对请求:使用
BluetoothAdapter的DeviceConnectionRequested和DevicePaired事件。 - 若要监听连接后的传入数据:通过
BluetoothLEDevice获取配对设备,发现GATT服务与特性,注册GattCharacteristic的ValueChanged事件来捕获并解析数据。
内容的提问来源于stack exchange,提问作者4L3X
相关产品推荐
相关产品推荐

