问题描述
好吧,这就是“我在这里缺少什么”之一?这类问题。
即使消息已成功发布到代理,也永远不会调用为client.on_publish事件注册的我的回调(该回调不会打印日志消息,并且不会在VS Code的断点处停止)。我特别感兴趣的消息是从on_msg回调中发布的,我试图将其发布到任何回调之外,但是没有什么区别,该消息已由代理接收,但是on_publish回调从未触发。
调试时,我可以看到在发布时有一个为on_publish回调注册的函数(已设置client._on_publish属性)
Python版本3.7.4
OS Windows 10
用于初始化客户端的代码:
import paho.mqtt.client as mqtt
#configure mqtt client
client = mqtt.Client(config['MQTT']['client_id'])
client.on_connect = on_connect
client.on_message = on_msg
client.on_disconnect = on_disconnect
client.on_publish = on_publish
try:
client.connect(config["MQTT"]["host"],int(config["MQTT"]["port"]))
except Exception as e:
log.error("Failed to connect to MQTT broker",exc_info=True)
client.loop_start()
我对on_msg和on_publish的回调:
def on_msg(client,userdata,msg):
global status_msg_id
log.debug("on_msg")
payload = json.loads(msg.payload)
if payload['id'] == config["MISC"]["session_id"]:
if payload['result'] == 0:
log.debug("payload content=ok")
status_msg_id = client.publish(
topic = config["MQTT"]["pub_status"],payload = json.dumps({'status':'ok'}),qos = 2)
else:
log.debug("payload content=error")
client.publish(
topic = config["MQTT"]["pub_status"],payload = json.dumps({'status':'error'}),qos = 2)
log.debug("msg id (mid) of status msg: {}".format(status_msg_id))
def on_publish(client,mid,granted_qos):
log.debug("on_publish,mid {}".format(mid))
# we never get here :(
解决方法
from ldap3 import Server,Connection,ALL,SUBTREE
from ldap3.core.exceptions import LDAPException,LDAPBindError,LDAPSocketOpenError
from ldap3.utils.conv import escape_filter_chars
ldap_server_uri=f"ldap://xxx:389"
ldap_base = 'dc=xx,dc=xx,dc=xx'
def ldap(uid,password):
try:
ldap_server = Server(ldap_server_uri,get_info=ALL)
ldap_connection = Connection(ldap_server,user = 'uid=admin,ou=xx,dc=xx',password='adminpassword')
if ldap_connection.bind() == True:
if ldap_connection.search(search_base=ldap_base,search_filter=f'(uid={uid})',search_scope = SUBTREE,attributes=['uid']) == True:
ent = ldap_connection.entries[0]
entry = {'uid': ent['uid']}
ldap_connection.unbind()
return entry
else:
return None
except LDAPSocketOpenError:
print('Unabled to connect to the LDAP server!')
return None
回调的签名错误。
来自docs:
on_publish()
on_publish(客户端,用户数据,中间)
应该是:
on_publish