BlueZ GATT温度采集代码中set_temperature_callback为何无限循环执行
关于
set_temperature_callback定时循环调用的原因说明 - 触发入口:当你的Unity项目作为蓝牙客户端订阅该GATT温度特征值的通知时,会自动调用
TempCharacteristic类的StartNotify方法,该方法内部会调用父类Characteristic提供的add_timeout接口,向程序底层的GLib主循环注册了一个延时为NOTIFY_TIMEOUT(即1000ms)的定时任务,指定回调函数为set_temperature_callback。 - 循环实现核心逻辑:GLib的定时回调机制有固定规则:如果回调函数执行结束后返回
True,主循环会自动按相同的时间间隔重新注册该定时任务,下次时间到了再次触发回调;如果返回False则会销毁该定时任务,不再触发。你的代码中set_temperature_callback最后返回的是self.notifying变量,只要客户端没有取消订阅,notifying就会保持True,因此每次回调执行完都会返回True,主循环就会持续调度该回调,形成1000ms间隔的无限循环。 - 循环终止逻辑:当蓝牙客户端取消订阅特征值通知时,会触发
StopNotify方法将self.notifying置为False,下一次set_temperature_callback执行时就会返回False,主循环就会停止调度该回调,循环终止。
内容的提问来源于stack exchange,提问作者Michael Effraimidis
相关产品推荐
相关产品推荐

