You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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服务和特性,然后监听数据变化事件即可:

  1. 先获取配对的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);
    }
}
  1. 发现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}");
    
    // 在这里添加你的数据解析和业务逻辑
}

总结实现路径

  1. 若要监听连接/配对请求:使用BluetoothAdapter的DeviceConnectionRequested和DevicePaired事件。
  2. 若要监听连接后的传入数据:通过BluetoothLEDevice获取配对设备,发现GATT服务与特性,注册GattCharacteristic的ValueChanged事件来捕获并解析数据。

内容的提问来源于stack exchange,提问作者4L3X

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:01:25