GattCharacteristic.ValueChanged 停止被调用

Posted

技术标签:

【中文标题】GattCharacteristic.ValueChanged 停止被调用【英文标题】:GattCharacteristic.ValueChanged stops getting called 【发布时间】:2015-02-05 01:31:05 【问题描述】:

我正在尝试使用 Adafruit Bluefruit LE(蓝牙 4 模块)与 arduino 通信,一切都已设置并配对等等,但我的 GattCharacteristic 上的 ValueChanged 事件遇到问题,它在之后停止触发大约在 30 到 40 次之间。

下面是这个的设置代码:

public class Bluetooth

    async public void Initialize()
    
        var devices = await DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromUuid(new Guid("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")), null);

        GattDeviceService firstService = await GattDeviceService.FromIdAsync(devices[0].Id);

        GattCharacteristic rxCharacteristic = firstService.GetCharacteristics(new Guid("6E400003-B5A3-F393-E0A9-E50E24DCCA9E")).First();

        await rxCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);

        rxCharacteristic.ValueChanged += rxCharacteristicValueChanged;
    

    private void rxCharacteristicValueChanged(GattCharacteristic characteristic, GattValueChangedEventArgs e)
    
        Console.WriteLine(e.CharacteristicValue.ToArray()[6]);
    

我需要清除某种缓冲区或类似的东西吗?它看起来不像它的缓冲区相关,因为如果我将发送的数据减半,我不会得到两次调用,但我可能是错的。 Arduino 报告它仍在发送数据(通过串行链接,我可以看到蓝牙库仍在尝试发送数据,无论如何。我不确定如何验证数据是否实际被发送)

我们将不胜感激任何帮助,甚至是关于检查事项的建议。

【问题讨论】:

你的程序还有什么?请显示可靠地证明问题的a minimal, complete code example。对于它的价值,我做了类似的事情,并且没有注意到通知中有任何中断,即使在很长一段时间之后也是如此。在我的代码中,我确实在更改配置之前而不是之后订阅了 ValueChanged 事件,但我不明白为什么这很重要。我能想到的是,在您的程序中,您执行了一些其他代码,这些代码会以某种方式干扰/禁用通知。 @PeterDuniho 代码中不应该有任何其他干扰。这是一个相当标准的 openTK 设置。我将努力获得一个最小的示例,但我这里有大量不相关的代码,因此可能需要一些时间。 @PeterDuniho 好吧,这很奇怪,注释掉了相当多的代码,现在它可以工作了。这里不应该有任何干扰。我猜那是消除的过程。 是的……这是一个最小的、完整的代码示例的主要价值。它迫使你经历消除的过程。如果做得正确,它通常会导致有问题的人自己解决问题。在那些没有的情况下,那么您至少会得到一个很好的代码示例来提出您的问题,并且您的问题可以比“为什么这不起作用”更具体,即您可以准确地指向导致问题的代码部分并寻求该部分的帮助。 @leppie 你是一位绅士和学者,这就是问题所在。让它成为一个答案,我会接受它。 【参考方案1】:

根据您的代码,听起来 GC 相关。

firstService 或其他东西设为字段级实例。

【讨论】:

嗨。您的代码的更改版本是什么?制作字段级实例是什么意思? 我的意思是如果我使用具有相同值更改事件的多台设备,我该如何使用字段级实例? 嗨@Patrick 我有类似的问题你能给我什么建议吗?【参考方案2】:

这是范围界定问题,似乎 GattCharacteristic 对象在未知时间后被处置...

使您的特征成为一个全局的、已解决的问题。

“您可能会发现您的应用程序在一段时间后停止接收来自设备的更新。这是一个范围界定问题,其中不应该处理对象。这是因为 GattCharacteristic 在它应该被处理之前就被处理掉了,将特征设置为全局而不是依赖于它被复制进来。”

【讨论】:

很遗憾,这样做并没有解决问题。如果约 2 秒内没有通知,则停止调用该事件。如果通知继续流动,则事件将继续被调用。定期将GattClientCharacteristicConfigurationDescriptorValue.Notify 发送到CharacteristicProperties修复问题。看起来更像是 Win10 的问题?

以上是关于GattCharacteristic.ValueChanged 停止被调用的主要内容,如果未能解决你的问题,请参考以下文章