# 智慧路灯设备SDK与平台通信（Java）
#### 概述
本文基于Java代码演示设备通过MQTTS/MQTT协议接入华为云物联网平台，通过[设备侧MQTT/MQTTS接口](https://support.huaweicloud.com/api-iothub/iot_06_v5_3002.html)实现南向"数据上报"、"命令下发"的功能，通过应用侧的示例代码接收北向服务端订阅的消息示例。以智慧路灯为例，设备将光照强度等信息上报到IoT平台，应用服务器再接收从平台推送来的设备数据。
#### 视频指导
<video controls="controls" preload="none" id="object43514116295" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/support/iothub-video/1726196169653709357.mp4" title="设备SDK接入" poster="https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000002380448585.jpg" style="width:80%;height:auto;max-width:1000px"></video>
#### 前提条件
- 确保开发环境为JDK 1.8及以上版本。
- 已安装IntelliJ IDEA开发工具。如未安装请访问[IntelliJ IDEA官网](https://www.jetbrains.com/idea/)下载并安装。
 
#### 上传产品模型
产品模型是用来描述设备能力的文件，通过JSON的格式定义了设备的基本属性、上报数据和下发命令的消息格式。定义产品模型，即在物联网平台构建一款设备的抽象模型，使平台理解该款设备的功能。
**操作步骤**：
1. 访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，单击"管理控制台"进入设备接入控制台。选择您的实例，单击实例卡片进入。
2. 选择左侧导航栏的"产品"，单击左侧"创建产品"。 
   图1产品-创建产品   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000002358714305.png "点击放大")
   
   
3. 在弹出的窗口中，根据实际情况自定义填写。 
   图2创建产品-MQTT   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001981306829.png "点击放大")
   
   
   
4. 下载[模型文件](https://obs-pipeline.obs.cn-north-4.myhuaweicloud.com/sdkDeploy/SmartStreetLight_2b118c0c-2aab-4e2f-9f83-589e067875a5_271f5bbb-827e-4a22-aabf-fa74f5ed3f23.zip)，该模型文件已开发完毕（由[开发产品模型](https://support.huaweicloud.com/qs-iothub/iot_05_00121.html#ZH-CN_TOPIC_0000002029733341__section5351105211251)开发完毕的产品模型导出）。详细开发过程指导请参考[在线开发产品模型](https://support.huaweicloud.com/devg-iothub/iot_02_0005.html)。
5. 创建成功后，单击刚创建的产品，然后单击上传模型文件（无需解压，并且压缩包的名称不能有括号），上传刚下载的模型文件。 
   图3上传产品模型-MQTT   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001981471833.png "点击放大")
   
   
 
 #### 创建设备
1. 选择设备接入服务左侧导航栏的"设备 \> 所有设备"，单击"注册设备"。 
   图4所有设备-注册设备   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001981487325.png "点击放大")
   
   
2. 在弹出的窗口中，可以参考图中的内容填写（所属产品需要选择上述步骤创建的产品，密钥不填写，则由平台自动生成，这里是由平台自动生成）然后单击"确定"。 
   图5注册设备-test123   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001985537517.png "点击放大")
   
   
3. 设备创建成功后，需要保存设备ID和密钥（后续设备连接的时候需要用到）。 
   图6设备-注册设备成功   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001981487333.png "点击放大")
   
   
 
#### 导入代码样例
1. 下载[Java样例](https://obs-pipeline.obs.cn-north-4.myhuaweicloud.com/sdkDeploy/quickStart/quickStartJava.zip)。
2. 打开IDEA开发者工具，单击" Import Project"。 
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001116429437.png "点击放大")
   
   
3. 选择[1]中下载的样例，然后根据界面提示，单击"next"。
   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001116431529.png "点击放大")
   
   
4. 完成代码导入。 
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001488100994.png "点击放大")
   
   
 
#### 建立连接
设备或网关在接入物联网平台时首先需要和平台建立连接，从而将设备或网关与平台进行关联。开发者通过传入设备信息，将设备或网关连接到物联网平台。
1. 在建立连接之前，先修改以下参数：
   ```
   //IoT平台mqtt对接地址
   static String serverIp = "iot-mqtts.cn-north-4.myhuaweicloud.com";
   //注册设备时获得的deviceId,密钥（要替换为自己注册的设备ID与密钥）
   static String deviceId = "yourDeviceID"; //device_id, 在创建设备时获得
   static String secret = "yourSecret";     //secret，在创建设备时获得
   ```
   - serverIp为物联网平台设备接入MQTT协议的地址，详细获取方式请参考[资源获取](https://support.huaweicloud.com/devg-iothub/iot_02_1004.html)。
   
   - device_id和secret为设备ID和密钥，在成功[创建设备]后获取。
    
2. 完成上述信息的修改后，运行程序，在平台可以看到设备显示在线。
   图7设备列表-设备在线   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001950367902.png "点击放大") 
 
#### 属性上报
属性上报是指设备主动向平台上报自己的属性（该示例代码已实现自动定时上报功能，可参考下一节在iot平台查看设备上报的数据内容）。
```
//上报json数据，注意serviceId要与产品模型中的定义对应
String jsonMsg = "{\"services\":[{\"service_id\":\"BasicData\",\"properties\":{\"luminance\":32},\"event_time\":null}]}";
```
- 消息体jsonMsg组装格式为JSON，其中service_id要与产品模型中的定义对应，properties是设备的属性；
- luminance表示光照强度；
- event_time为可选项，为设备采集数据UTC时间，不填写默认使用系统时间。
设备或网关成功连接到物联网平台后，即可调用MqttAsyncClient的publish(String topic,MqttMessage message)方法向平台上报设备属性值。
#### 查看上报数据
运行main方法成功启动后，即可在设备详情页面查看上报的设备属性数据。详细接口信息请参考[MQTT协议属性上报](https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html)。
图8查看上报数据-luminance   
![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001950370350.png "点击放大")
![](https://support.huaweicloud.com/qs-iothub/public_sys-resources/note_3.0-zh-cn.png)
如果在"设备详情"页面没有最新上报数据，请修改产品模型中服务和属性的内容，确保设备上报的服务/属性和产品模型中的服务/属性一致（如果不一致，则历史数据中看不到设备上报的数据），或者进入"产品 \> 基本信息"页面，删除所有服务。
#### 命令下发
1. 在控制台界面单击左侧菜单栏的"API检索和调试"。 
   图9导航-API检索和调试   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001952774996.png "点击放大")
   
   
2. 找到"设备命令"一栏，下发的参数请参考图片内容（跟产品模型中保持一致），然后单击"调试"按钮即可发送命令。 
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001277342285.png "点击放大")
   - service_id表示服务ID，例如：BasicData。
   
   - command_name表示命令名称，例如：lightControl。
   
   - paras表示下发参数，例如：{"switch":"ON"}。
   
   
   设备侧可查看已收到命令（示例代码已实现接收命令topic的订阅）。
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000002602781469.png "点击放大")
   
   
 
 #### 通过云端获取设备上报的数据
本文以AMQP为例，获取设备上报到云端的数据。
1. 单击获取[Java AMQP接入示例](https://obs-pipeline.obs.cn-north-4.myhuaweicloud.com/sdkDeploy/AmqpDemo.zip)。
2. 访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，单击"管理控制台"进入设备接入控制台。选择您的实例，单击实例卡片进入。
3. 选择"规则 \> 数据转发"，创建数据转发规则。 
   图10数据转发-创建规则   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001950384036.png "点击放大")
   
   
4. 设置转发数据, 填入参数，创建规则。 
   图11数据转发-新建属性上报流转规则   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001981583625.png "点击放大")
   
   | 参数名    | 参数说明         |
   |:---|:---|
   | 规则名称  | 创建的规则名称，可自定义。 |
   | 规则描述  | 对该规则的描述。     |
   | 数据来源   | 选择"设备属性"      |
   | 触发事件  | 设备属性上报          |
   | 资源空间 | 选择所有资源空间     |
      
   
   
5. 设置转发目标（注意：需要单击"预置服务接入凭证"按钮，获取下载文件）。
   
   图12新建转发目标-转发至AMQP推送消息队列   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000002322599942.png "点击放大")
   
   | 参数名    | 参数说明                                             |
   |:---|:---|
   | 转发目标   | AMQP推送消息队列                                     |
   | 接入凭证 | 单击"预置服务接入凭证"，保存下载的文件（包含access_key和access_code |
   | 消息队列  | DefaultQueue                                  |
      
   
   
6. 单击启动规则。 
   图13启动规则-转发至AMQP   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001981512761.png "点击放大")
   
   
7. 修改[1]获取的AMQP代码样例中的参数。
   
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000001092106521.png "点击放大")
   - yourAccessKey：连接凭证接入键值，参考[5]获取。
   
   - yourAccessCode：连接凭证接入码，参考[5]获取。
   
   - yourAMQPUrl：amqp域名，请前往[管理控制台](https://console.huaweicloud.com/iotdm/#/dm-portal/home)-总览页面-平台接入地址获取。
     图14接入信息-AMQP接入地址   
     ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000002252892384.png "点击放大") 
   
   - yourQueue：队列名，使用默认队列DefaultQueue。
   
   
   
   
8. AMQP数据成功接收。 
   ![](https://support.huaweicloud.com/qs-iothub/figure/zh-cn_image_0000002602976411.png "点击放大")
   
   
 
#### 更多
更详细开发指导请参考[设备侧SDK](https://support.huaweicloud.com/sdkreference-iothub/iot_02_0178.html)接入或更多其他语言的[demo接入](https://support.huaweicloud.com/devg-iothub/iot_02_2200.html)。
