更新时间:2024-04-29 GMT+08:00

Python Demo使用说明

概述

本文以Python语言为例,介绍通过MQTTS/MQTT协议接入平台,基于平台接口实现“属性上报”“订阅接收命令”等功能。

本文中使用的代码为样例代码,仅用于体验平台通信功能,如需进行商用,可以参考资源获取获取对应语言的IoT Device SDK进行集成。

前提条件

准备工作

  • 安装python
    1. 访问python官网,选择合适系统的版本下载并安装。(本文以windows系统为例,安装python3.8.2)。

    2. 下载完成后,运行exe文件进行安装。
    3. 勾选“Add python 3.8 to PAYTH”(如无勾选,需手动配置环境变量),单击“Customize installation”,按照界面提示安装。

    4. 检查python是否安装成功。

      Win键 + r -->输入 cmd-->回车,进入命令行窗口,输入python –V,回车后显示python版本即表示安装成功。

  • 安装Pycharm。(如已安装,请跳过此步骤)
    1. 访问Pycharm官网,选择合适的版本单击“Download”下载。

      注:推荐使用专业版。

    2. 运行exe文件,按照界面提示安装。

导入代码样例

  1. 下载QuickStart(Python)样例。
  2. 运行PyCharm,单击Open,选择步骤1中下载的样例。

  3. 完成代码导入。

    代码目录简述:

    • IoT_device_demo使用MQTT协议的demo文件;

      message_sample.py:设备发送消息和接收平台消息的demo;

      command_sample.py:响应平台下发命令的demo;

      properties_sample.py:属性上报等的demo;

    • IoT_device/client对paho-mqtt进行了封装;

      IoT_client_config.py:配置客户端信息,如设备id、密钥等;

      IoT_client.py:提供mqtt协议相关功能,如连接、订阅、发布和响应等;

    • IoT_device/Utils工具方法,如获取时间戳、密钥加密等;
    • IoT_device/resources存放证书;

      DigiCertGlobalRootCA.crt.pem:设备校验平台身份的证书,用于设备侧接入物联网平台登录鉴权使用,可以在资源获取中下载证书文件

    • IoT_device/request对设备相关属性进行封装,如命令、消息和属性等。

  4. (可选)安装paho-mqtt库,paho-mqtt是python使用mqtt协议的第三方库(如已安装,可跳过)。可参考如下两种安装方式:

    • 方法一:在命令行下采用pip工具安装(安装python时,已自带该工具)

      进入命令行界面输入命令:pip install paho-mqtt回车,提示 Succefully installed paho-mqtt 表示安装成功。(若提示pip不是内部或外部命令,请检查python环境变量的配置),如下图所示:

    • 方法二:通过PyCharm安装
      1. 打开PyCharm,选择 File > Setting > Project Interpreter ,单击右侧 + 号搜索“paho-mqtt”

      2. 单击左下角 Install Package进行安装。

建立连接

设备或网关在接入物联网平台时首先需要和平台建立连接,从而将设备或网关与平台进行关联。开发者通过传入设备信息,将设备或网关连接到物联网平台。

  1. IoTClientConfig类主要提供配置客户端相关信息的功能,在建立连接之前,先修改以下参数。
    1
    2
    3
    4
    # 客户端配置
    client_cfg = IoTClientConfig(server_ip='iot-mqtts.cn-north-4.myhuaweicloud.com', device_id='5e85a55f60b7b804c51ce15c_py123', secret='******', is_ssl=True)
    # 创建设备 
    iot_client = IotClient(client_cfg)
    
    • server_ip物联网平台的设备对接地址,可参考平台对接信息获取(获取的是域名信息,可通过在cmd命令框中执行“ping 域名”,获取IP地址);
    • device_idsecret在成功注册设备后获取;
    • is_ssl设置为True 时建立MQTTS连接,False时建立MQTT连接。
  2. 调用 connect 方法进行连接。
    iot_client.connect()

    如果连接成功会打印:

     -----------------Connection successful !!!

    注:如果连接失败,在retreat_reconnection函数中已实现退避重连,代码样例如下:

    # 退避重连
    def retreat_reconnection(self):
    	print("---- 退避重连")
    	global retryTimes
    	minBackoff = 1
    	maxBackoff = 30
    	defaultBackoff = 1
    	low_bound = (int)(defaultBackoff * 0.8)
    	high_bound = (int)(defaultBackoff * 1.2)
    	random_backoff = random.randint(0, high_bound - low_bound)
    	backoff_with_jitter = math.pow(2.0, retryTimes) * (random_backoff + low_bound)
    	wait_time_until_next_retry = min(minBackoff + backoff_with_jitter, maxBackoff)
    	print("the next retry time is ", wait_time_until_next_retry, " seconds")
    	retryTimes += 1
    	time.sleep(wait_time_until_next_retry)
    	self.connect()
    

订阅Topic

订阅某Topic的设备才能接收broker发布的关于该Topic的消息,关于平台预置Topic可参考Topic定义

在message_sample.py文件中提供了订阅Topic、取消订阅Topic和设备消息上报等功能。

订阅命令下发Topic方式如下:

1
 iot_client.subscribe(r'$oc/devices/' + str(self.__device_id) + r'/sys/commands/#')

如果订阅成功会打印(Topic为自定义的Topic,如上Topic_1):

 ------You have subscribed:  topic

响应命令下发

在command_sample.py文件中提供了响应平台下发命令的功能。详细接口信息请参考命令下发接口

1
2
3
4
5
# 响应平台下发的命令
def command_callback(request_id, command):
    # result_code:设置为0命令下发成功,为1下发命令失败    
    iot_client.respond_command(request_id, result_code=0)
iot_client.set_command_callback(command_callback)

属性上报

属性上报是指设备主动向平台上报自己的属性。更多接口信息请参考设备属性上报

在properties_sample.py文件中实现了设备属性上报、响应平台设置与查询设备属性的功能。

如下代码实现了设备每隔10秒向平台上报属性的功能,service_property为设备属性对象,具体可在services_propertis.py文件查看。

1
2
3
4
5
6
7
# 定时上报属性
while True:
    # 按照产品模型设置属性
    service_property = ServicesProperties()
    service_property.add_service_property(service_id="Battery", property='batteryLevel', value=1)
    iot_client.report_properties(service_properties=service_property.service_property, qos=1)
    time.sleep(10) 

设备上报属性成功后可在设备详情页面查看到上报的属性。

如果在“设备详情”页面没有最新上报数据,请修改产品模型中服务和属性的内容,确保设备上报的服务/属性和产品模型中的服务/属性一致,或者进入产品 > 模型定义页面,删除所有服务。

消息上报

消息上报是指设备向平台上报消息。message_sample.py文件中提供了消息上报的功能。

1
2
# 设备向平台发送消息,系统默认topic
iot_client.publish_message('raw message: Hello Huawei cloud IoT')

消息上报成功后会打印:

 Publish success---mid = 1

由于是同步命令需要端侧回复响应可参考接口