簡體   English   中英

BLE ValueChanged停止在C#應用程序中觸發

[英]BLE ValueChanged stops firing in C# app

我正在運行Windows版本10.0.16299.0,並在Visual Studio C#2017上構建。我可以從Windows Forms應用程序成功連接到未配對的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事件在短時間后不再觸發,並且我想不出問題所在,我無法弄清楚我還必須“緩存”什么以防止對象被處置。

問題在於,由於嵌套了每個迭代,因此您將feature_changed_event附加到多個特征。 這會導致不必要的行為。

最好的方法是通過UUID選擇包含所需特征的服務,然后從該服務中通過UUID選擇特征。

如果您堅持要通過所需的描述符屬性句柄進行過濾,請在附加feature_changed_event之前完成所有“ for each-es”的操作。

要附加的特性可能是_characteristics列表中的第一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM