
# Python Demo使用说明
#### 概述
本文以Python语言为例，介绍通过MQTTS/MQTT协议接入平台，基于[平台接口](https://support.huaweicloud.com/api-iothub/iot_06_v5_3002.html)实现"属性上报"、"订阅接收命令"等功能。
![](https://support.huaweicloud.com/devg-iothub/public_sys-resources/note_3.0-zh-cn.png)
本文中使用的代码为样例代码，仅用于体验平台通信功能，如需进行商用，可以参考[资源获取](https://support.huaweicloud.com/devg-iothub/iot_02_1004.html)获取对应语言的IoT Device SDK进行集成。
#### 前提条件
- 已安装python，若未安装请参考[安装python]。
- 已安装开发工具（本文以Pycharm为例），若未安装请参考[安装Pycharm]。
- 已在[管理控制台](https://console.huaweicloud.com/iotdm/#/dm-portal/home)获取设备接入地址。获取地址的操作步骤，请参考[平台对接信息](https://support.huaweicloud.com/devg-iothub/iot_02_1004.html#section0)。
- 已在[管理控制台](https://console.huaweicloud.com/iotdm/#/dm-portal/home)创建产品和设备。创建产品和设备的具体操作细节，请参考[创建产品](https://support.huaweicloud.com/usermanual-iothub/iot_01_0054.html)、[注册单个设备](https://support.huaweicloud.com/usermanual-iothub/iot_01_0031.html)或[批量注册设备](https://support.huaweicloud.com/usermanual-iothub/iot_01_0032.html)。
 
#### 准备工作
- 安装python
  1. 访问[python官网](https://www.python.org/downloads/windows/)，选择合适系统的版本下载并安装。（本文以windows系统为例，安装python3.8.2）。
     ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0241958961.png "点击放大")
     
  
  2. 下载完成后，运行exe文件进行安装。
  
  3. 勾选"Add python 3.8 to PATH"（如无勾选，需手动配置环境变量），单击"Customize installation"，按照界面提示安装。 ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0241958962.png "点击放大")
     
  
  4. 检查python是否安装成功。 Win键 + r --\>输入 cmd--\>回车，进入命令行窗口，输入python --V，回车后显示python版本即表示安装成功。
     ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0241958963.png "点击放大")
     
   
- 安装Pycharm。（如已安装，请跳过此步骤）
  1. 访问[Pycharm官网](https://www.jetbrains.com/pycharm/download/#section=windows)，选择合适的版本单击"Download"下载。
     ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0241958964.png "点击放大")
     注：推荐使用专业版。
     
  
  2. 运行exe文件，按照界面提示安装。
   
 
#### 导入代码样例
1. 下载[QuickStart（Python）](https://developer.obs.cn-north-4.myhuaweicloud.com:443/manage/south/quickStart/quickStart(python).zip)样例。
2. 运行PyCharm，单击Open，选择步骤[1]中下载的样例。
   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0241478864.png)
   
   
3. 完成代码导入。
   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0241479065.png "点击放大")
   **代码目录简述：**
   - **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：设备校验平台身份的证书，用于设备侧接入物联网平台登录鉴权使用，可以在资源获取中[下载证书文件](https://support.huaweicloud.com/devg-iothub/iot_02_1004.html#section3)。
     
   
   - **IoT_device/request** **：**对设备相关属性进行封装，如命令、消息和属性等。
   
   
   
   
4. （可选）安装paho-mqtt库，paho-mqtt是python使用mqtt协议的第三方库（如已安装，可跳过）。可参考如下两种安装方式： 
   - 方法一：在命令行下采用pip工具安装（安装python时，已自带该工具） 进入命令行界面输入命令：pip install paho-mqtt回车，提示 Successfully installed paho-mqtt 表示安装成功。（若提示pip不是内部或外部命令，请检查python环境变量的配置），如下图所示：
     ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0241989844.png "点击放大")
     
   
   - 方法二：通过PyCharm安装
     1. 打开PyCharm，选择 "File \> Setting \> Project Interpreter" ，单击右侧 + 号搜索"paho-mqtt"。 ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0241990572.png "点击放大")
        
     
     2. 单击左下角 Install Package进行安装。 ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0241991027.png "点击放大")
        
      
   
   
   
   
 
#### 建立连接
设备或网关在接入物联网平台时首先需要和平台建立连接，从而将设备或网关与平台进行关联。开发者通过传入设备信息，将设备或网关连接到物联网平台。
1. IoTClientConfig类主要提供配置客户端相关信息的功能，在建立连接之前，先修改以下参数。
   ```
   # 客户端配置
   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** **：** 物联网平台的设备对接地址，可参考[平台对接信息](https://support.huaweicloud.com/devg-iothub/iot_02_1004.html#section0)获取（获取的是域名信息，可通过在cmd命令框中执行"ping 域名"，获取IP地址）；
   
   - **device_id** 和**secret** **：** 在成功[注册设备](https://support.huaweicloud.com/usermanual-iothub/iot_01_0031.html)后获取；
   
   - **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定义](https://support.huaweicloud.com/api-iothub/iot_06_v5_3004.html)。
在message_sample.py文件中提供了订阅Topic、取消订阅Topic和设备消息上报等功能。
订阅命令下发Topic方式如下：
```
iot_client.subscribe(r'$oc/devices/' + str(self.__device_id) + r'/sys/commands/#')
```
如果订阅成功会打印（Topic为自定义的Topic，如上Topic_1）：
```
------You have subscribed:  topic
```
#### 响应命令下发
在command_sample.py文件中提供了响应平台下发命令的功能。详细接口信息请参考[命令下发接口](https://support.huaweicloud.com/api-iothub/iot_06_v5_3014.html)。
```
# 响应平台下发的命令
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)
```
#### 属性上报
属性上报是指设备主动向平台上报自己的属性。更多接口信息请参考[设备属性上报](https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html)。
在properties_sample.py文件中实现了设备属性上报、响应平台设置与查询设备属性的功能。
代码实现了设备每隔10秒向平台上报属性的功能，service_property为设备属性对象，具体可在services_properties.py文件查看。
```
# 定时上报属性
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)
```
设备上报属性成功后可在设备详情页面查看到上报的属性。
图1查看上报数据-Battery_batteryLevel   
![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0000001981607237.png "点击放大")
![](https://support.huaweicloud.com/devg-iothub/public_sys-resources/note_3.0-zh-cn.png)
如果在"设备详情"页面没有最新上报数据，请确认设备上报的服务/属性和产品模型中的服务/属性一致。
#### 消息上报
消息上报是指设备向平台上报消息。message_sample.py文件中提供了消息上报的功能。
```
# 设备向平台发送消息，系统默认topic
iot_client.publish_message('raw message: Hello Huawei cloud IoT')
```
消息上报成功后会打印：
```
Publish success---mid = 1
```
![](https://support.huaweicloud.com/devg-iothub/public_sys-resources/note_3.0-zh-cn.png)
由于是同步命令需要端侧回复响应可[参考接口](https://support.huaweicloud.com/api-iothub/iot_06_v5_3014.html#section4)。
