首页 > 解决方案 > Pydbus 更多通知同时处理

问题描述

我想通过使用 pydbus 的通知从 BLE 设备接收传感器数据。我正在使用带有主循环的 GLib 链接了我的代码的一部分:

def sensor1_handler(iface, prop_changed, prop_removed):
    if 'Value' in prop_changed:
       
        """Handle values"""
       
def sensor2_handler(iface, prop_changed, prop_removed):
    if 'Value' in prop_changed:
       """Handle values"""

sensor1=bus.get("org.bluez", "/org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX/serviceYYYY/charYYYY")
sensor2=bus.get("org.bluez", "/org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX/serviceYYYY/charYYYY")
sensor1.onPropertiesChanged = sensor1_handler
sensor2.onPropertiesChanged = sensor2_handler

sensor2.StartNotify()
sensor1.StartNotify()

当我想接收通知时,两个信号几乎同时到达,并且只有一个(第一个到达的通知)通知回调函数运行。

我该如何解决这个问题?我在想一个消息队列。

编辑:

传感器1功能:

def sensor1_handler(iface, prop_changed, prop_removed):
    if 'Value' in prop_changed:
        temperatureLSB = prop_changed['Value'][1]
        temperatureMSB = prop_changed['Value'][0]
        humidityLSB = prop_changed['Value'][3]
        humidityMSB = prop_changed['Value'][2]
        temperature = temperatureLSB | (temperatureMSB << 8)
        humidity = humidityLSB | (humidityMSB << 8)
        print(-45+175*(temperature/(pow(2,16)-1)))
        print(100*(humidity/(pow(2,16)-1)))

传感器2功能:

def sensor2_handler(iface, prop_changed, prop_removed):
    if 'Value' in prop_changed:
        iaqLSB = prop_changed['Value'][1]
        iaqMSB = prop_changed['Value'][0]
        iaq = iaqLSB | (iaqMSB << 8)
        print(iaq)

sensor2 数据在 sensor1 之前发送,因此 sensor2 数据首先到达。这两个数据来自同一个设备,我还没有添加其他设备。

标签: python-3.xglibdbus

解决方案


感谢您的每一次帮助!

经过多次尝试,我注意到问题出在我的服务器端。两个传感器数据是从一台设备发送的,相差约 10 毫秒,并且消息发送不是处于通知模式而是指示模式。

我以前没有注意到它,因为我只发送了 1 个相差 2 秒的传感器数据,但是当我尝试几乎同时发送 2 条消息时出现了问题。

将其设置为通知后,服务器可以快速发送消息(不需要确认)。

我知道这个错误最终不是由 pydbus 引起的,而是我的错。我希望如果有人发现类似的问题,他们也应该检查发件人(服务器)端。


推荐阅读