BLE ValueChanged在C#app中停止触发

时间:2018-02-21 20:09:13

标签: c# windows bluetooth-lowenergy bluetooth-gatt

我正在运行Windows版本10.0.16299.0,并在Visual Studio C#2017上构建。我可以从Windows窗体应用程序成功连接到未配对的BLE设备,并获取ValueChanged事件(每秒1次),但不是很久了我通常会在40秒或更短的时间内停止接收这些事件 - 通常更少。

我意识到这可能是一个处置/ GC问题,但我不知道如何。设备,服务,特征和描述符都作为成员变量存储在主窗体中,不应收集:

public partial class Form1 : Form
{
    private BluetoothLEDevice _device;
    private List<GattDeviceService> _services;
    private List<GattDescriptor> _descriptors = new List<GattDescriptor>();
    private List<GattCharacteristic> _characteristics = new List<GattCharacteristic>();

    private async void button1_Click(object sender, EventArgs e)
    {
        _device = await BluetoothLEDevice.FromIdAsync("BluetoothLE#BluetoothLE00:xx:xx:xx:xx:xx:xx:xx:xx:xx");

        var services = await _device.GetGattServicesAsync();
        foreach (var service in services.Services)
        {
            var chars = await service.GetCharacteristicsAsync();
            foreach (var ch in chars.Characteristics)
            {
                var descriptors = await ch.GetDescriptorsAsync();
                foreach (var desc in descriptors.Descriptors)
                {
                    if (desc.AttributeHandle == 15 || desc.AttributeHandle == 26)
                    {
                        _services.Add(service);
                        _descriptors.Add(desc);
                        _characteristics.Add(ch);

                        var writer = new DataWriter();
                        writer.WriteBytes(new byte[] { 1, 0 });
                        var buf = writer.DetachBuffer();

                        await desc.WriteValueAsync(buf);
                    }

                    ch.ValueChanged += ChOnValueChanged;
                }
            }
        }
    }

在我的示例中,我单击按钮以建立连接并订阅事件。在你说写入描述符不是你怎么做之前 - 我知道。设备使用非标准描述符ID,这就是我必须直接写入它们的原因。

请注意,一切正常,包括写入 - 我没有错误。只是在短时间内不再触发ValueChanged事件,我无法弄清楚我还需要什么&#34;缓存&#34;为了防止物体被丢弃,假设问题是什么。

1 个答案:

答案 0 :(得分:0)

问题在于,由于每次迭代都嵌套,因此将characteristic_changed_event附加到多个特征。这会导致不必要的行为。

最好的方法是通过UUID选择包含所需特征的服务,然后从该服务中选择UUID的特征。

如果你坚持用想要的描述符属性句柄过滤, 完成所有&#34;为每个&#34;在附加characteristic_changed_event之前。

附加的特征可能首先出现在_characteristics列表中。