
# 设备集成开发
#### 操作场景
本文提供了通过设备集成实现设备的接入、消息收发功能的操作指导，主要分为配置设备连接信息、收发消息两部分。
![](https://support.huaweicloud.com/devg-roma/public_sys-resources/notice_3.0-zh-cn.png)
设备集成支持标准的MQTT协议，您可以使用开源[Eclipse paho MQTT Client](https://www.eclipse.org/paho/index.php?page=downloads.php)与LINK进行对接，本例中Demo使用Java版本的SDK
#### 前提条件
- 已获取设备的接入信息，具体请参见[开发准备](https://support.huaweicloud.com/devg-roma/roma_04_4017.html)。
- 已安装开发工具和Java开发语言环境，具体请参见[开发准备](https://support.huaweicloud.com/devg-roma/roma_04_4017.html)。

- 下载[LINK Demo](https://roma-demo-cn-north-1.obs.cn-north-1.myhuaweicloud.com/romalink_demo.zip)：
  Demo包括两个文件，DeviceConnectDemo.java用于连接设备，DeviceControlDemo.java用于调用控制设备的API。
  
 
#### 配置设备连接信息
1. 解压Demo压缩包，在"src"目录的底层路径下找到DeviceConnectDemo.java文件。
2. 使用Java编辑工具打开这个文件，编辑设备连接的信息。运行成功后，在"设备管理"页面可以看到在线设备状态。
   ![](https://support.huaweicloud.com/devg-roma/public_sys-resources/note_3.0-zh-cn.png)
   Demo工程中依赖的软件包在lib目录下，使用Demo时需要将demo的lib目录设置为当前工程的lib目录。
   ```
   // 设备连接地址，格式为：tcp://ip:port
           final String host = "";
           // 设备客户端ID
           final String clientId = "";
           // 示例仅用作测试或示意，设备认证的用户名为敏感信息，请勿硬编码使用
           final String userName = "";
           // 示例仅用作测试或示意，设备认证的密码为敏感信息，请勿硬编码使用
           final String password = "";
           // 设备Publish权限的Topic
           final String pubTopic = "";
           // 设备Subscribe权限的Topic
           final String subTopic = "";
           // 设备发送的消息内容
           final String payload = "hello world.";
   ```
   
 
#### 收发消息
DeviceConnectDemo.java预先设置了具有发布权限的topic消息。如果您调用LINK发送控制设备消息的API，设备可以立即收到消息。
```
client.subscribe(subTopic, (s, mqttMessage) -> {
                String recieveMsg = "Receive message from topic:" + s + "\n";
                System.out.println(recieveMsg + new String(mqttMessage.getPayload(), StandardCharsets.UTF_8));
            });
```
1. **调用控制设备的API** 。
   1. 使用Java编辑器打开DeviceControlDemo.java，把发送控制消息的API的参数修改为您创建好的设备信息。
      需要填写的信息包括：appKey、appSecret、设备客户端ID、具有订阅权限的Topic、发送控制消息的API的访问地址、访问端口、消息内容。
      ```
      public static void main(String[] args)
          {
              // 示例仅用作测试或示意，API认证的appKey为敏感信息，请勿硬编码使用
              String appKey = "";
              // 示例仅用作测试或示意，API认证的appSecret为敏感信息，请勿硬编码使用
              String appSecret = "";
              // 要发送控制消息的设备客户端ID
              String clientId = "";
              // 要发送控制消息的设备的sub权限的Topic
              String subTopic = "";
              // 发送控制消息的API的访问地址
              String host = "";
              // 发送控制消息的API的访问端口
              String port = "";
              // 要给设备发送的消息内容
              String payload = "hello world.";
              String url = "https://" + host + ":" + port + "/v1/devices/" + clientId;
              controlDevice(url, appKey, appSecret, clientId, subTopic, payload);
          }
      ```
      - appKey、appSecret参数可以从ROMA Connect实例控制台的"集成应用"页面中，单击设备所属集成应用的名称，在集成应用的基本信息中获取Key和Secret。
      
      - Port为7443；clientId、subTopic、host可以直接从ROMA Connect实例控制台的"设备集成 LINK \> 设备管理"页面中，单击对应设备的名称，在设备详情页面获取。
       
   
   2. 重新编译并运行DeviceControlDemo这个类，如果此时该设备处于连接状态并订阅了sub权限的Topic，设备会立即收到一条消息，并在IDE控制台打印出来。API的请求IP和设备连接的IP是相同的，端口是7443。
    
2. **发送消息** 。
   您可以设置设备发送消息的内容和频率。例如，您可以命令设备每隔10秒钟向LINK发送一条消息，代码运行后，LINK每隔10秒会收到消息。
   ```
   try
           {
               final MqttClient client = new MqttClient(host, clientId);
               client.connect(mqttConnectOptions);
               System.out.println("Device connect success. client id is " + clientId + ", host is " + host);
               final MqttMessage message = new MqttMessage();
               message.setQos(1);
               message.setRetained(false);
               message.setPayload(payload.getBytes(StandardCharsets.UTF_8));
               Runnable pubTask = () -> {
                   try
                   {
                       client.publish(pubTopic, message);
                   }
                   catch (MqttException e)
                   {
                       System.out.println(e.getMessage());
                   }
               };
               client.subscribe(subTopic, (s, mqttMessage) -> {
                   String recieveMsg = "Receive message from topic:" + s + "\n";
                   System.out.println(recieveMsg + new String(mqttMessage.getPayload(), StandardCharsets.UTF_8));
               });
               ScheduledExecutorService service = Executors
                       .newSingleThreadScheduledExecutor();
               service.scheduleAtFixedRate(pubTask, 0, 10, TimeUnit.SECONDS);
           }
   ```
   ![](https://support.huaweicloud.com/devg-roma/public_sys-resources/note_3.0-zh-cn.png)
   Connect代码模拟的是MQTT.fx客户端连接设备的功能，所以连接以后，设备会显示"已经连接"。
   
 
