全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
消息队列 MQ

Python 接入示例

更新时间:2018-01-23 21:00:41

本文主要介绍如何使用 Python 客户端收发 MQTT 消息,并给出示例代码供前期开发测试参考。包括资源创建、环境准备、示例代码、注意事项等。

注意:

本文给出的示例均基于 Eclipse Paho Python SDK 实现,SDK 下载请参见 MQTT 接入准备。如使用其他第三方的客户端,请适当修改。

1. 资源创建

使用 MQ 提供的 MQTT 服务,首先需要核实应用中使用的 Topic 资源是否已经创建。如果没有,请先去控制台创建 Topic,Group ID 等资源。

创建资源时需要根据需求选择对应的 Region,例如 MQTT 需要使用华北2的接入点,那么 Topic 等资源就在华北2 创建。资源创建具体请参见创建资源

注意: 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)
本文导读目录