python-3.x - 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 数据首先到达。这两个数据来自同一个设备,我还没有添加其他设备。
解决方案
感谢您的每一次帮助!
经过多次尝试,我注意到问题出在我的服务器端。两个传感器数据是从一台设备发送的,相差约 10 毫秒,并且消息发送不是处于通知模式而是指示模式。
我以前没有注意到它,因为我只发送了 1 个相差 2 秒的传感器数据,但是当我尝试几乎同时发送 2 条消息时出现了问题。
将其设置为通知后,服务器可以快速发送消息(不需要确认)。
我知道这个错误最终不是由 pydbus 引起的,而是我的错。我希望如果有人发现类似的问题,他们也应该检查发件人(服务器)端。
推荐阅读
- multithreading - 为什么线程从 jmeter 测试中掉线?
- javascript - Angular 11 - 无法读取未定义的属性“示例”
- javascript - 视频完成时在 Hooktube 中检测?
- firebase-cloud-messaging - 自定义声音在后台模式下无法在 Android 上运行
- json - 通过管道将多个 jq 值传递给“while read -r”循环
- amazon-web-services - AWS sam 部署失败:Waiter ChangeSetCreateComplete 失败:超过最大尝试次数
- kubernetes - 重置后如何更改 Velero 凭据
- reactjs - 如何将 scss 文件中的变量导入 react/next.js 组件
- python - 排除未来信号
- javascript - 反应:在有效的时间间隔内缺少依赖警告