- mqtt的python包,回调函数比较复杂,每次在连接之前,需要先实现回调函数,回调函数的传入参数固定
def on_connect(client, userdata, flages, rc):
print("connect with " + str(rc))
将回调函数赋给主函数
client.on_connect = on_connect
- 分析一下源代码
2.1 首先查看client类的on_connect定义
self._on_connect = None
直接定义为空,即需要外部实现
将on_connect设置为属性,也没什么奇怪
@property
def on_connect(self):
return self._on_connect
@on_connect.setter
def on_connect(self, func):
with self._callback_mutex:
self._on_connect = func
2.2 在_handle_connack函数中,发现了一些异常
with self._callback_mutex:
if self.on_connect:
flags_dict = {}
flags_dict['session present'] = flags & 0x01
with self._in_callback_mutex:
try:
self.on_connect(self, self._userdata, flags_dict, result)
except Exception as err:
self._easy_log(MQTT_LOG_ERR, 'Caught exception in on_connect: %s', err)
此处即为调用外部传入的on_connect函数
- 再看下_handle_connack这个函数什么情况下调用
def _packet_handle(self):
elif cmd == CONNACK:
return self._handle_connack()
在_packet_handle函数中调用
----> _packet_read ----> loop_read ----> loop ----> loop.start
这个路数就清楚了
先定义回调函数,然后loop.start后,开始执行。
网友评论