
# 设备数据上云
#### MQTT broker
终端设备可以通过MQTT协议与IEF云端进行通信，您也可以通过发送/订阅消息控制终端设备。
边缘节点上有一个**内置MQTT broker** ，内置MQTT broker使用8883端口与终端设备通信，与内置MQTT broker通信需要经过安全认证，具体请参见[使用证书进行安全认证](https://support.huaweicloud.com/usermanual-ief/ief_01_0034_0.html)。
另外，边缘节点还支持与**外置MQTT broker** 通信，即在边缘节点上安装一个MQTT broker（如开源的[Mosquitto](https://mosquitto.org/)，默认使用1883端口通信）。
![](https://support.huaweicloud.com/usermanual-ief/public_sys-resources/note_3.0-zh-cn.png)
如使用外置MQTT broker，请注意需要保证外置MQTT broker通信的端口能正常使用。
#### MQTT Topic
终端设备与边缘节点、IEF的通信都是通过给MQTT broker中转消息实现的，在MQTT broker中，默认提供如[表1]所示的Topic（消息主题），上报状态、控制终端设备状态都是通过发送/订阅消息实现的。
应用程序编写完后，可以通过应用部署功能，将应用从IEF中部署到边缘节点，详情请参见[容器应用管理](https://support.huaweicloud.com/usermanual-ief/ief_01_0008_0.html)。
 表1IEF提供的默认Topic 
| 名称                                                                             | 使用类型 | Topic                                                                                   | 说明                                                                                                                                                                     |
|:---|:---|:---|:---|
| [设备孪生变更](https://support.huaweicloud.com/usermanual-ief/ief_01_0038_0.html)    | 订阅   | $hw/events/device/{device_id}/twin/update/document                                      | 设备孪生更新文档，当孪生变化时，反映孪生变化前、变化后的区别。                                                                                                                                        |
| [设备孪生delta](https://support.huaweicloud.com/usermanual-ief/ief_01_0039_0.html) | 订阅   | $hw/events/device/{device_id}/twin/update/delta                                         | 设备孪生delta事件，当孪生变化时，反映期望值与真实值不一致的孪生信息。                                                                                                                                  |
| [设备成员变更](https://support.huaweicloud.com/usermanual-ief/ief_01_0040_0.html)    | 订阅   | $hw/events/node/{node_id}/membership/updated                                            | 绑定终端设备关系变化。                                                                                                                                                            |
| [设备属性变更](https://support.huaweicloud.com/usermanual-ief/ief_01_0041_0.html)    | 订阅   | $hw/events/device/{device_id}/updated                                                   | 终端设备属性更新。                                                                                                                                                              |
| [设备成员获取](https://support.huaweicloud.com/usermanual-ief/ief_01_0042_0.html)    | 发布   | $hw/events/node/{node_id}/membership/get                                                | 绑定终端设备关系获取。                                                                                                                                                            |
| [设备成员获取结果](https://support.huaweicloud.com/usermanual-ief/ief_01_0043_0.html)  | 订阅   | $hw/events/node/{node_id}/membership/get/result                                         | 绑定终端设备关系获取结果。                                                                                                                                                          |
| [设备孪生获取](https://support.huaweicloud.com/usermanual-ief/ief_01_0044_0.html)    | 发布   | $hw/events/device/{device_id}/twin/get                                                  | 设备孪生获取。                                                                                                                                                                |
| [设备孪生获取结果](https://support.huaweicloud.com/usermanual-ief/ief_01_0045_0.html)  | 订阅   | $hw/events/device/{device_id}/twin/get/result                                           | 设备孪生获取结果。                                                                                                                                                              |
| [设备孪生更新](https://support.huaweicloud.com/usermanual-ief/ief_01_0046_0.html)    | 发布   | $hw/events/device/{device_id}/twin/update                                               | 设备孪生更新。                                                                                                                                                                |
| [设备孪生更新结果](https://support.huaweicloud.com/usermanual-ief/ief_01_0047_0.html)  | 订阅   | $hw/events/device/{device_id}/twin/update/result                                        | 设备孪生更新结果。                                                                                                                                                              |
| [请求加密数据](https://support.huaweicloud.com/usermanual-ief/ief_01_0052_0.html)    | 发布   | $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/decrypt   | 发布获取加密数据请求。                                                                                                                                                            |
| [获取加密数据](https://support.huaweicloud.com/usermanual-ief/ief_01_0053_0.html)    | 订阅   | $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/plaintext | 订阅获取加密数据。                                                                                                                                                              |
| [添加告警](https://support.huaweicloud.com/usermanual-ief/ief_01_0055_0.html)      | 发布   | $hw/alarm/{appname}/add                                                                 | 向AOM发送告警。                                                                                                                                                              |
| [清除告警](https://support.huaweicloud.com/usermanual-ief/ief_01_0056_0.html)      | 发布   | $hw/alarm/{appname}/clear                                                               | 清除AOM中告警。                                                                                                                                                              |
| [自定义Topic](https://support.huaweicloud.com/usermanual-ief/ief_01_0050_0.html)  | 发布   | {project_id}/nodes/{node_id}/user/{custom_topic}                                        | 自定义Topic，Topic根据您的需要自行定义。 您可以将终端设备数据发送到边缘节点MQTT broker的自定义Topic中，IEF会将这些数据转发到DIS通道或APIG后端地址。数据转发到DIS通道或者APIG后端地址后，您可以提取这些数据，并对数据进行处理分析。 |
   
接下来将介绍如何在边缘侧获取终端设备信息，接收云上的控制消息，以及如何将终端设备数据上报到云端。MQTT收发消息的示例代码请参见[Go语言代码样例](https://support.huaweicloud.com/usermanual-ief/ief_01_0034_0.html#ief_01_0034_0__section165493412456)和[Java语言代码样例](https://support.huaweicloud.com/usermanual-ief/ief_01_0034_0.html#ief_01_0034_0__section9292111804517)。
 #### 获取节点关联的终端设备成员
1. 向[设备成员获取](https://support.huaweicloud.com/usermanual-ief/ief_01_0042_0.html)发送获取终端设备成员消息的请求。
   
   **Topic**：$hw/events/node/{node_id}/membership/get
   **Payload**：{"event_id":"自定义ID"}
   示例如下：
   ```
   $hw/events/node/{node_id}/membership/get
   {"event_id":""}
   ```
   
   
2. 向[设备成员获取结果](https://support.huaweicloud.com/usermanual-ief/ief_01_0043_0.html)订阅终端设备成员的返回结果。
   
   **Topic**：$hw/events/node/{node_id}/membership/get/result
   返回结果示例如下：
   ```
   {
       "event_id": "",
       "timestamp": 1554986455386,
       "devices": [
           {
               "id": "2144773f-13f1-43f5-af07-51991d4fd064",
               "name": "equipmentA",
               "state": "unknown",
               "attributes": {
                   "name": {
                       "value": "a",
                       "optional": true,
                       "metadata": {
                           "type": "string"
                       }
                   }
               }
           }
       ]
   }
   ```
   
   
 
 #### 获取设备孪生
1. 向[设备孪生获取](https://support.huaweicloud.com/usermanual-ief/ief_01_0044_0.html)发送请求获取设备孪生。
   
   **Topic**：$hw/events/device/{device_id}/twin/get
   **Payload**：{"event_id":"自定义id"}
   
   
2. 向[设备孪生获取结果](https://support.huaweicloud.com/usermanual-ief/ief_01_0045_0.html)订阅设备孪生的返回结果。
   
   Topic：$hw/events/device/{dvice_id}/twin/get/result
   获取的结果如下：
   ```
   {
       "event_id": "",
       "timestamp": 1554988425592,
       "twin": {
           "humidity": {
               "expected": {
                   "value": "0",
                   "metadata": {
                       "timestamp": 1554988419529
                   }
               },
               "optional": true,
               "metadata": {
                   "type": "int"
               }
           },
           "temperature": {
               "expected": {
                   "value": "0",
                   "metadata": {
                       "timestamp": 1554988419529
                   }
               },
               "optional": true,
               "metadata": {
                   "type": "int"
               }
           }
       }
   }
   ```
   
   
 
#### 监听设备孪生事件
通过[获取节点关联的终端设备成员]和[获取设备孪生]以后，即可获取到节点绑定的终端设备ID，随后即可监听该终端设备的事件。
在云端更新设备孪生属性，设置期望值从而达到控制边侧终端设备的目的。
例如某个设备有两个孪生属性，humidity和temperature。
图1孪生属性   
![](https://support.huaweicloud.com/usermanual-ief/zh-cn_image_0000001214562814.png "点击放大")
在"设备孪生"页签中编辑孪生属性，将humidity由9改为10。属性修改完成以后，在端侧可收到两个事件："设备孪生变更事件"和"设备孪生delta事件"。
- **设备孪生变更事件**：包含变更前和变更后的设备孪生信息详情。
- **设备孪生delta** **事件**：包含设备孪生的详情信息以及设备孪生属性期望值与实际值不一致的delta部分。
订阅这两个Topic，就可以收到变更设备孪生的消息。
1. 订阅[设备孪生变更](https://support.huaweicloud.com/usermanual-ief/ief_01_0038_0.html)。
   
   **Topic**：$hw/events/device/{device_id}/twin/update/document
   在边侧收到变更消息如下：
   ```
   {
       "event_id": "0f921313-4074-46a2-96f6-aac610721059",
       "timestamp": 1555313685831,
       "twin": {
           "humidity": {
               "last": {
                   "expected": {
                       "value": "9",
                       "metadata": {
                           "timestamp": 1555313665978
                       }
                   },
                   "optional": true,
                   "metadata": {
                       "type": "int"
                   }
               },
               "current": {
                   "expected": {
                       "value": "10",
                       "metadata": {
                           "timestamp": 1555313685831
                       }
                   },
                   "optional": true,
                   "metadata": {
                       "type": "int"
                   }
               }
           },
           "temperature": {
               "last": {
                   "expected": {
                       "value": "0",
                       "metadata": {
                           "timestamp": 1555313665978
                       }
                   },
                   "actual": {
                       "value": "2",
                       "metadata": {
                           "timestamp": 1555299457284
                       }
                   },
                   "optional": true,
                   "metadata": {
                       "type": "int"
                   }
               },
               "current": {
                   "expected": {
                       "value": "0",
                       "metadata": {
                           "timestamp": 1555313685831
                       }
                   },
                   "actual": {
                       "value": "2",
                       "metadata": {
                           "timestamp": 1555299457284
                       }
                   },
                   "optional": true,
                   "metadata": {
                       "type": "int"
                   }
               }
           }
       }
   }
   ```
   
   
2. 订阅[设备孪生delta](https://support.huaweicloud.com/usermanual-ief/ief_01_0039_0.html)。
   
   **Topic**：$hw/events/device/{device_id}/twin/update/delta
   在边侧收到变更消息如下：
   ```
   {
       "event_id": "60fb5baf-d4ad-47b0-a21e-8b57b52d0978",
       "timestamp": 1555313685837,
       "twin": {
           "humidity": {
               "expected": {
                   "value": "10",
                   "metadata": {
                       "timestamp": 1555313685831
                   }
               },
               "optional": true,
               "metadata": {
                   "type": "int"
               }
           },
           "temperature": {
               "expected": {
                   "value": "0",
                   "metadata": {
                       "timestamp": 1555313685831
                   }
               },
               "actual": {
                   "value": "2",
                   "metadata": {
                       "timestamp": 1555299457284
                   }
               },
               "optional": true,
               "metadata": {
                   "type": "int"
               }
           }
       },
       "delta": {
           "humidity": "10",
           "temperature": "0"
       }
   }
   ```
   
   
 
#### 上报设备属性实际值
1. 发布终端设备孪生更新事件。 
   **Topic**：$hw/events/device/{device_id}/twin/update
   **Payload**：{"event_id":"", "timestamp":0, "twin":{"属性":{"actual":{"value":"设备实际值"}}}}
   示例如下：
   ```
   {
       "event_id": "",
       "timestamp": 0,
       "twin": {
           "temperature": {
               "actual": {
                   "value": "2"
               }
           }
       }
   }
   ```
   发布后，在云端可以观察到设备孪生的实际值发生了相应的变化，如[图2]所示。
   图2孪生属性值发生变化   
   ![](https://support.huaweicloud.com/usermanual-ief/zh-cn_image_0000001258962711.png "点击放大")
   
   
2. 在边缘侧订阅[设备孪生更新结果](https://support.huaweicloud.com/usermanual-ief/ief_01_0047_0.html)，能收到设备孪生更新事件的结果。
   
   **Topic**：$hw/events/device/{device_id}/twin/update/result
   更新的结果如下所示。
   ```
   {
       "event_id": "",
       "timestamp": 1554992093859,
       "twin": {
           "temperature": {
               "actual": {
                   "value": "2",
                   "metadata": {
                       "timestamp": 1554992093859
                   }
               },
               "optional": true,
               "metadata": {
                   "type": "int"
               }
           }
       }
   }
   ```
   
   
 
