无法取消注册 ble 通知的 dbus 信号

Posted

技术标签:

【中文标题】无法取消注册 ble 通知的 dbus 信号【英文标题】:unable to unregister dbus signal for ble notifications 【发布时间】:2019-07-18 13:20:54 【问题描述】:

我正在使用 python dbus 库来注册从设备接收 ble 数据包。但是,在断开连接并重新连接后,我收到了多个回调。我尝试取消注册信号,但它似乎没有效果 - 以下是我目前正在做的 -

class Gatt(object):
dbus_if = 'org.bluez.GattCharacteristic1'

    def __init__(self, bus, char_path):
        self.char_path = char_path
        self.bus = bus
        prop_man = dbus.Interface(bus.get_object(BLUEZ_SERV_NAME, self.char_path),
                                  'org.freedesktop.DBus.Properties')
        props = prop_man.GetAll(self.dbus_if)
        self.uuid = props[dbus.String('UUID')]
        self.notifying = props[dbus.String('Notifying')]
        nom = dbus.Interface(bus.get_object(BLUEZ_SERV_NAME, char_path), 'org.freedesktop.DBus.Properties')
        self.signal_on_property_changed = nom.connect_to_signal('PropertiesChanged', self.on_char_property_changed)
        print('New Gatt Device '.format(str(self.uuid)))
        self.dbus_if_handle = dbus.Interface(self.bus.get_object(BLUEZ_SERV_NAME, self.char_path),
                       self.dbus_if)

def clear_signal(self):
    self.bus.remove_signal_receiver(self.on_char_property_changed, self.signal_on_property_changed)

此时我怀疑 remove_signal_receiver() 有错误的参数,因此默默地失败而没有给我正确的结果。

非常感谢任何建议。 TIA。

【问题讨论】:

【参考方案1】:

要删除self.signal_on_property_changed = nom.connect_to_signal(...)创建的信号匹配,您需要保存此函数创建的信号,然后在此信号上调用remove()方法。

例子:

# Create signal
self.signal_on_property_changed = nom.connect_to_signal(...)
....
# Remove signal
self.signal_on_property_changed.remove()

【讨论】:

忘记标记为答案。这是删除信号的最简单方法:-)。谢谢

以上是关于无法取消注册 ble 通知的 dbus 信号的主要内容,如果未能解决你的问题,请参考以下文章

Azure 通知中心和 Apple APNS 推送通知取消注册设备

在 iOS 8 中取消注册推送通知

演示前取消通知

安卓 4.3 BLE

我无法使用 cordova 本地通知插件取消通知

谷歌云消息“未注册”失败并取消订阅最佳做法?