本文主要介绍如何使用 Python 客户端收发 MQTT 消息,并给出示例代码供前期开发测试参考。包括资源申请、环境准备、示例代码、注意事项等。
注意:
本文给出的示例均基于 Eclipse Paho Python SDK 实现,SDK 下载请参见 MQTT 接入准备。如使用其他第三方的客户端,请适当修改。
1. 资源申请
使用 MQ 提供的 MQTT 服务,首先需要核实应用中使用的 Topic 资源是否已经申请。如果没有,请先去控制台申请 Topic,Group ID 等资源。
申请资源时需要根据需求选择对应的 Region,例如 MQTT 需要使用华北2的接入点,那么 Topic 等资源就在华北2 申请。资源申请具体请参见申请 MQ 资源。
注意:MQTT 使用的多级子 Topic 不需要申请,代码里直接使用即可,没有限制。
2. 环境准备
本示例使用 Python 语言编写, Python 客户端依赖的添加可以自行搜索。一般采用 pip 包管理器来处理,具体安装步骤请参考 paho 官方文档。
官方版本目前不支持 SNI。如果需要使用 SSL 加密的连接方式,请参考以下步骤安装 patch 以支持 SNI,后续等官方更新 SDK 的版本:
pip install git+https://github.com/exosite/paho.mqtt.python.git@openssl_sni_support --upgrade
3. MQTT 收发消息
本段示例代码演示如何使用 MQTT Python 客户端发送和接收消息。
#!/usr/bin/env python
import hmac
import base64
from hashlib import sha1
import time
from paho.mqtt.client import MQTT_LOG_INFO, MQTT_LOG_NOTICE, MQTT_LOG_WARNING, MQTT_LOG_ERR, MQTT_LOG_DEBUG
from paho.mqtt import client as mqtt
#accessKey get from aliyun account console
accessKey = 'XXXXXX'
#secretKey get from aliyun account console
secretKey = 'XXXXX'
#MQTT GroupID,get from mq console
groupId = 'GID_XXX'
client_id=groupId+'@@@'+'TEST00001'
# Topic
topic = 'XXXX/python/test'
#MQTT endPoint get from mq console
brokerUrl='XXXXXXXXX'
def on_log(client, userdata, level, buf):
if level == MQTT_LOG_INFO:
head = 'INFO'
elif level == MQTT_LOG_NOTICE:
head = 'NOTICE'
elif level == MQTT_LOG_WARNING:
head = 'WARN'
elif level == MQTT_LOG_ERR:
head = 'ERR'
elif level == MQTT_LOG_DEBUG:
head = 'DEBUG'
else:
head = level
print('%s: %s' % (head, buf))
def on_connect(client, userdata, flags, rc):
print('Connected with result code ' + str(rc))
def on_message(client, userdata, msg):
print(msg.topic + ' ' + str(msg.payload))
def on_disconnect(client, userdata, rc):
if rc != 0:
print('Unexpected disconnection %s' % rc)
client = mqtt.Client(client_id, protocol=mqtt.MQTTv311)
client.on_log = on_log
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect
password = base64.b64encode(hmac.new(secretKey.encode(), groupId.encode(), sha1).digest()).decode()
client.username_pw_set(accessKey, password)
client.connect(brokerUrl, 1883, 60)
client.subscribe(topic, 0)
for i in range(1, 11):
print(i)
rc = client.publish(topic, str(i), qos=0)
print ('rc: %s' % rc)
time.sleep(0.1)
client.loop_forever()
4. SSL 方式连接服务
使用 Python 客户端通过 SSL 方式来连接服务,需要客户端支持 SNI。
如果是 Paho 提供的客户端,请根据 Release Note 确认是否支持 SNI。如果没有,请按照本文第2步-环境准备的说明安装 patch。
相比标准方式,使用 SSL 方式时需要注意以下两点:
加密端口应设置为8883。
需要导入服务端公钥证书,并配置 TLS 参数。证书下载链接如下:ca.crt
同理,代码上需要在连接之前导入证书文件,并设置连接的 broker 地址。
client.tls_set('XXX.crt', server_hostname='XXXXXXX')
client.connect(brokerUrl, 8883, 60)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。