本文介绍如何调用Python语言的Paho MQTT类库,将设备接入阿里云物联网平台并进行消息收发。
前提条件
已在物联网平台控制台,对应实例下,创建产品和设备,并获取MQTT接入域名和设备证书信息(ProductKey、DeviceName和DeviceSecret)。具体操作,请参见:
准备开发环境
推荐使用Python 3.6版本。
Linux系统
可通过如下命令进行安装:
重要本操作命令以普通用户权限为例。如果您在操作过程中涉及到管理员权限才能执行的操作,可尝试使用sudo命令执行。
sudo add-apt-repository ppa:deadsnakes/ppa sudo apt-get update sudo apt-get install python3.6 wget https://bootstrap.pypa.io/get-pip.py sudo python3.6 get-pip.py python3.6 -m pip install --upgrade pip setuptools wheel sudo apt-get install python3.6-venv
Windows系统
可根据系统类型选择安装包:
macOS系统
可直接下载安装包:python-3.6.7-macosx10.9.pkg。
下载Python语言的Paho MQTT库
请访问Eclipse Paho Downloads了解Paho项目和支持的开发语言详情。
执行以下命令安装Python语言版本的Paho MQTT库,您也可访问Paho-MQTT,查看更多信息。
pip install paho-mqtt==1.6.1
本示例Demo暂不支持使用2.0.0版本的Paho MQTT库。
接入物联网平台
使用
MqttSign.py
文件定义用于计算设备接入物联网平台的MQTT连接参数的函数,您开发的设备端接入物联网平台程序需调用该函数。函数说明如下:
功能:用于计算设备接入物联网平台的MQTT连接参数mqttUsername、mqttPassword和mqttClientId。
输入参数说明如下:
参数
类型
说明
productKey
String
设备所属产品的ProductKey,该设备在物联网平台上的身份证书信息之一。
deviceName
String
设备名称,该设备在物联网平台上的身份证书信息之一。
deviceSecret
String
设备密钥,该设备在物联网平台上的身份证书信息之一。
clientId
String
设备的Client ID信息,可自定义,长度在64个字符以内。建议使用您设备的MAC地址或SN码,方便您识别区分不同的设备。
timeStamp
String
当前时间的毫秒值时间戳,可选。
输出设备接入物联网平台的MQTT连接参数,详细说明如下:
参数
类型
说明
mqttUsername
String
MQTT连接所需的用户名。
mqttPassword
String
MQTT连接所需的密码。
mqttClientId
String
MQTT客户端ID。
添加实现设备接入物联网平台的程序文件。
您需编写程序调用
MqttSign.py
文件计算MQTT连接参数,实现设备接入物联网平台并进行通信。开发说明和代码示例如下:
设置设备信息。
# set the device info, include product key, device name, and device secret productKey = "a1LhUsK***" deviceName = "python***" deviceSecret = "bdd043d193782d11***" # set timestamp, clientid, subscribe topic and publish topic timeStamp = str((int(round(time.time() * 1000)))) clientId = "192.168.****" subTopic = "/" + productKey + "/" + deviceName + "/user/get" pubTopic = "/" + productKey + "/" + deviceName + "/user/update"
设置MQTT连接信息。
调用
MqttSign.py
中定义的calculate_sign_time
函数,根据传入的参数clientId、 productKey、deviceName、deviceSecret和timeStamp,计算出mqttUsername、mqttPassword和mqttClientId。同时本示例采用TLS直连模式,需要下载根证书,进行配置。
# set host, port host = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" # instanceId = "***" # host = instanceId + ".mqtt.iothub.aliyuncs.com" port = 1883 # set tls crt, keepalive tls_crt = "root.crt" keepAlive = 300 # calculate the login auth info, and set it into the connection options m = AuthIfo() m.calculate_sign_time(productKey, deviceName, deviceSecret, clientId, timeStamp) client = mqtt.Client(m.mqttClientId) client.username_pw_set(username=m.mqttUsername, password=m.mqttPassword) client.tls_set(tls_crt)
调用MQTT的
connect()
函数,将设备接入物联网平台。def on_connect(client, userdata, flags, rc): if rc == 0: print("connect success!") else: print("connect failed... error code is:" + str(rc)) def connect_mqtt(): client.on_connect = on_connect client.connect(host, port, keepAlive) return client
调用Publish接口发布消息。您需指定发布消息的目标Topic和消息payload。
def publish_message(): # publish 5 messages to pubTopic("/a1LhUsK****/python***/user/update") for i in range(5): message = "ABC" + str(i) client.publish(pubTopic, message) print("publish msg:" + str(i)) time.sleep(2)
通信Topic介绍,请参见什么是Topic。
调用Subscribe接口订阅Topic,接收云端下发的消息。
def subscribe_topic(): # subscribe to subTopic("/a1LhUsK****/python***/user/get") and request messages to be delivered client.subscribe(subTopic)
关于设备、服务器和物联网平台的通信方式介绍,请参见通信方式概述。
运行项目。
示例代码
使用示例代码程序将设备接入物联网平台。
下载示例代码包:aiot-python-demo.zip,然后解压缩为文件
aiot-python-demo
,其中包含以下文件:文件
说明
MqttSign.py
该文件包含以MQTT方式接入物联网平台的连接参数计算代码,通过
calculate_sign_time
函数,计算出连接参数mqttUsername、mqttPassword和mqttClientId。iot.py
该文件包含设备与物联网平台连接和通信的逻辑代码。
root.crt
物联网平台的根证书,是设备接入物联网平台的必须证书。
在文件
iot.py
中,修改设备信息为您的设备信息。将productKey、deviceName和deviceSecret替换为您的设备证书信息。
# set the device info, include product key, device name, and device secret productKey = "a1LhUsK***" deviceName = "python***" deviceSecret = "bdd043d193782d11***"
(可选)替换timeStamp和clientId,clientId值可以替换为您的实际设备的SN码和MAC地址。
说明若不替换也能接入物联网平台,在实际场景中,建议您替换为实际信息。
修改代码
host = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"
中的值为对应接入域名。详细说明,请参见接入物联网平台的步骤2。
运行程序文件
iot.py
。如果运行成功,接入物联网平台的本地日志如下:
Connect aliyun IoT Cloud Sucess subscribe topic: /a1LhUsK***/python***/user/get publish msg: 0 publish msg: ABC0 publish msg: 1 publish msg: ABC1 publish msg: 2 publish msg: ABC2 publish msg: 3 publish msg: ABC3 publish msg: 4 publish msg: ABC4
登录物联网平台控制台,在对应实例下,可查看设备状态和日志。
错误码
如果设备通过MQTT协议接入物联网平台失败,请根据错误码排查问题。服务端错误码说明,请参见错误排查。