
# 使用MQTT.fx调测
本文档以MQTT.fx为例，介绍以MQTT原生协议接入物联网平台。MQTT.fx是目前主流的MQTT客户端，可以快速验证是否可以与物联网平台服务交互发布或订阅消息。
#### 前提条件
- 已注册华为云官方账号。未注册可单击[注册页面](https://reg.huaweicloud.com/registerui/public/custom/register.html#/register)完成注册。
- 已完成实名制认证。未完成可在华为云上单击[实名认证](https://account.huaweicloud.com/usercenter/#/accountindex/realNameAuth)完成认证，否则无法使用设备接入功能。
- 已开通设备接入服务。未开通则访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，单击"管理控制台"后开通该服务。
 
 #### 获取设备接入信息
1. 访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，单击"管理控制台"进入设备接入控制台。选择您的实例，单击实例卡片进入。
2. 单击左侧导航栏的"总览"，单击"当前实例 -\> 接入信息"查看设备接入信息，记录域名和端口。
   
   图1总览-获取接入信息   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0000002510383014.png "点击放大")
   ![](https://support.huaweicloud.com/devg-iothub/public_sys-resources/note_3.0-zh-cn.png)
   针对不支持用域名接入的设备，通过在cmd命令框中执行"ping 域名"获取IP地址，用IP地址接入平台。由于IP地址不固定，您需要将IP地址做成可配置项。
   
   
 
#### 创建产品
1. 创建MQTT协议产品。如果已有MQTT协议产品，可跳过此步骤。
2. 登录[管理控制台](https://console.huaweicloud.com/iotdm/#/dm-portal/home)，单击左侧导航栏"产品"，单击页面左侧的"创建产品"。
3. 根据页面提示填写参数，然后单击"创建"。 
   表1创建产品信息参数 
   |                                                                       基本信息                                                                       ||
   |---|---|
   | 所属资源空间 | 平台自动将新创建的产品归属在默认资源空间下。如需归属在其他资源空间下，下拉选择所属的资源空间。如无对应的资源空间，请先创建[资源空间](https://support.huaweicloud.com/usermanual-iothub/iot_01_0006.html)。 |
   | 产品名称   | 自定义。支持字母、数字、下划线（_）、连字符（-）的字符组合。                                                                                                          |
   | 协议类型   | 选择MQTT。                                                                                                                                  |
   | 数据格式   | 选择JSON。                                                                                                                                  |
   | 所属行业   | 请根据实际情况选择。                                                                                                                               |
   | 设备类型   | 请根据实际情况选择。                                                                                                                               |
   | 高级配置                                                                                                                                             ||
   | 产品ID   | 定制ProductID，用于唯一标识一个产品。如果携带此参数，平台将产品ID设置为该参数值；如果不携带此参数，产品ID在物联网平台创建产品后由平台分配获得。                                                           |
      
   图2创建MQTT产品-标准类型   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0000001950347286.png "点击放大")
   
   
 
#### 连接鉴权
参考[连接鉴权](https://support.huaweicloud.com/api-iothub/iot_06_v5_3009.html)接口文档，使用MQTT.fx工具接入物联网平台。
1. 下载[MQTT.fx](https://iotda-document.obs.cn-north-4.myhuaweicloud.com/mqttfx-1.7.1-windows-x64.exe)（默认是64位操作系统，如果是32位操作系统，单击此处下载[MQTT.fx](https://iotda-document.obs.cn-north-4.myhuaweicloud.com/mqttfx-1.7.1-windows.exe)），安装MQTT.fx工具。
   
   ![](https://support.huaweicloud.com/devg-iothub/public_sys-resources/note_3.0-zh-cn.png)
   - 安装最新版MQTT.fx工具，可单击此处[下载](https://softblade.de/download/)。
   
   - MQTT.fx 1.7.0及旧版本对带有$的主题（Topic）处理存在问题，请使用最新版本进行测试。
    
   
   
2. 访问[这里](https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/)，填写[注册设备](https://support.huaweicloud.com/usermanual-iothub/iot_01_0028.html)后生成的设备ID（DeviceId）和密钥（DeviceSecret），生成连接信息（ClientId、Username、Password）。
   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0278869787.png "点击放大")
   设备通过MQTT协议的connect消息进行鉴权，对于构造clientId的各个部分信息都必须包括进去，平台收到connect消息时，会判断设备的鉴权类型和密码摘要算法。
   使用生成工具生成的clientId格式，默认不校验时间戳：设备ID_0_0_时间戳。
   - 当采用"HMACSHA256"校验时间戳方式时，会先校验消息时间戳与平台时间是否一致，再判断密码是否正确。
   
   - 当采用"HMACSHA256"不校验时间戳方式时，clientId也需要携带"YYYYMMDDHH"格式时间戳，用于加解密密码。
   
   
   connect消息鉴权失败时，平台会返回错误，并自动断开MQTT链路。
   
   
3. 打开MQTT.fx软件，单击设置图标。 
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0278869792.png "点击放大")
   
   
4. 参考下表配置鉴权参数，然后单击"Apply"。 
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0284316393.png "点击放大")
   
   | 参数名称           | 说明                                                                                                                                                         |
   |:---|:---|
   | Broker Address | 填写从设备接入服务控制台获取的[设备对接地址]，此地址为域名信息。不能通过域名接入的设备，此处填写从[2]中获取的IP地址。 |
   | Broker Port    | 默认为1883。                                                                                                                                                   |
   | Client ID      | 设备clientID，请参考[2]中获取。                                                                      |
   | User Name      | 即设备ID，请参考[2]中获取。                                                                           |
   | Password       | 加密后的设备密钥，请参考[2]中获取。                                                                        |
      
   注：如果您选择安全方式接入，Broker Port设置为8883，下载并获取[证书](https://developer.obs.cn-north-4.myhuaweicloud.com:443/cert/v2/certificate.zip)，加载Java语言pem格式的证书。
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0284217902.png "点击放大")
   
   
5. 单击"Connect"，设备鉴权成功后，在物联网平台"所有设备"界面可以看到设备处于在线状态。 
   图3设备列表-设备在线   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0000001950367902.png "点击放大")
   
   
 
#### 上报数据
参考[设备属性上报](https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html)接口文档，使用MQTT.fx工具向物联网平台上报数据。
设备若通过MQTT通道上报数据，需要发给指定的Topic，上报消息的Topic格式为："$oc/devices/{device_id}/sys/properties/report"，其中"deviceId"的值，对一机一密设备，使用deviceId接入时填写为设备注册成功后返回的"deviceId"值，QoS推荐选择0或者1。
1. 填写接口地址，此处以"$oc/devices/{device_id}/sys/properties/report"为例，如"$oc/devices/5e4e2e92ac-164aefa8fouquan1/sys/properties/report"。 
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0246330671.png "点击放大")
   
   
2. 填写上报的数据。 
   **请求参数**
   
   | 字段名      | 必选/可选 | 类型                      | 参数描述                                 |
   |:---|:---|:---|:---|
   | services | 必选    | List\<ServiceProperty\> | 设备服务数据列表（具体结构参考下表ServiceProperty定义表） |
      
   ServiceProperty定义表：
   
   | 字段名        | 必选/可选 | 类型     | 参数描述                                                                                                                                                   |
   |:---|:---|:---|:---|
   | service_id | 必选    | String | 设备服务的ID。                                                                                                                                               |
   | properties | 必选    | Object | 设备服务的属性列表，具体字段在设备关联的产品模型中定义。                                                                                                                           |
   | event_time | 可选    | String | 设备采集数据UTC时间（格式：yyyyMMddTHHmmssZ），如：20161219T114920Z。 设备上报数据不带该参数或参数格式错误时，则数据上报时间以平台时间为准。 |
      
   **请求示例**
   ```
   {
       "services": [{
               "service_id": "Connectivity",
               "properties": {
                   "dailyActivityTime": 57
               },
               "event_time": "20151212T121212Z"
           },
           {
               "service_id": "Battery",
               "properties": {
                   "batteryLevel": 80
               },
               "event_time": "20151212T121212Z"
           }
       ]
   }
   ```
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0246330672.png "点击放大")
   
   
3. 单击"Publish"，可以在物联网平台设备详情界面上查看设备是否成功上报数据。 
   图4查看上报数据-batteryLevel   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0000001981489765.png "点击放大")
   图5查看上报数据-dailyActivityTime   
   ![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0000001981329941.png "点击放大")
   
   
 
#### 相关最佳实践
[在线开发MQTT协议的模拟智慧路灯](https://support.huaweicloud.com/bestpractice-iothub/iot_bp_00016.html)
[基于MQTT.fx的X.509证书接入](https://support.huaweicloud.com/bestpractice-iothub/iot_bp_0077.html)
按照本页面的指导，使用MQTT.fx模拟MQTT设备接入物联网平台后，您应该已经基本了解MQTT设备如何通过MQTTS协议调用物联网平台开放的接口与平台交互。
若您想要进一步体验设备接入服务，可参考[开发指南](https://support.huaweicloud.com/devg-iothub/iot_02_9994.html)开发真实应用和真实设备，并接入物联网平台，体验更多功能。
