开发者社区> 问答> 正文

Python 接入方法有哪几种?

本文主要介绍如何使用 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)

展开
收起
猫饭先生 2017-10-27 11:07:38 2202 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载