一、问题引入:
1、在连接MQTT时,需要携带证书的,如何用python实现?
2、python连接MQTT时,报错:ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)
二、python解决带证书的连接问题:
-
配置ca证书
cafile = “C:/Users/Desktop/cafile/ca.crt” -
配置ssl版本号
tls_version=ssl.PROTOCOL_TLSv1_2
关键python代码配置如下
import ssl
cafile = "C:/Users/Desktop/cafile/ca.crt"
client.tls_set(ca_certs=cafile,cert_reqs=False,tls_version=ssl.PROTOCOL_TLSv1_2)
python全部实现代码如下:
import paho.mqtt.client as mqtt
import json
import ssl
HOST = "101.10.10.214"
PORT = 1683
client_id = "ytest001" #client id
Q_topic="persistent://test/topic01" #请求的topic
D_topic="persistent://test/topic02" #订阅topic
cafile = "C:/Users/Desktop/cafile/ca.crt"
# 连接成功回调
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe(D_topic) #设置订阅topic
# 消息推送回调函数
def on_message(client, userdata, msg):
print("主题:"+msg.topic+" 消息:"+str(msg.payload.decode('utf-8')))
# 订阅回调函数
def on_subscribe(client, userdata, mid, granted_qos):
print("On Subscribed: qos = %d" % granted_qos)
# 断开连接回调
def on_disconnect(client, userdata, rc):
if rc==0:
print("connect success !")
else :
print("connect error: rc=%s"% rc)
data = {
"msg_id": "111",
"type": 3,
"topic": "topic01",
"content": {
"id": 1
},
"from": 1,
"to": -1
}
param = json.dumps(data)
client = mqtt.Client(client_id)
client.username_pw_set("username", "password")
client.tls_set(ca_certs=cafile,cert_reqs=False,tls_version=ssl.PROTOCOL_TLSv1_2)
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.on_disconnect = on_disconnect
client.connect(HOST, PORT, 60)
client.publish(Q_topic, payload=param, qos=0) # 发送消息
client.loop_forever()
首次连接mqtt内容的学习参照第一篇文章:https://blog.csdn.net/yangyaner__/article/details/132437188?spm=1001.2014.3001.5502
查看运行结果:
消息发送成功,返回回调内容: