设备集成开发
操作场景
本文提供了通过设备集成实现设备的接入、消息收发功能的操作指导,主要分为配置设备连接信息、收发消息两部分。
设备集成支持标准的MQTT协议,您可以使用开源Eclipse paho MQTT Client与LINK进行对接,本例中Demo使用Java版本的SDK
前提条件
- 下载LINK Demo:
Demo包括两个文件,DeviceConnectDemo.java用于连接设备,DeviceControlDemo.java用于调用控制设备的API。
配置设备连接信息
- 解压Demo压缩包,在“src”目录的底层路径下找到DeviceConnectDemo.java文件。
- 使用Java编辑工具打开这个文件,编辑设备连接的信息。运行成功后,在“设备管理”页面可以看到在线设备状态。
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.";
收发消息
client.subscribe(subTopic, (s, mqttMessage) -> { String recieveMsg = "Receive message from topic:" + s + "\n"; System.out.println(recieveMsg + new String(mqttMessage.getPayload(), StandardCharsets.UTF_8)); });
- 调用控制设备的API。
- 使用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 > 设备管理”页面中,单击对应设备的名称,在设备详情页面获取。
- 重新编译并运行DeviceControlDemo这个类,如果此时该设备处于连接状态并订阅了sub权限的Topic,设备会立即收到一条消息,并在IDE控制台打印出来。API的请求IP和设备连接的IP是相同的,端口是7443。
- 使用Java编辑器打开DeviceControlDemo.java,把发送控制消息的API的参数修改为您创建好的设备信息。
- 发送消息。
您可以设置设备发送消息的内容和频率。例如,您可以命令设备每隔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); }
Connect代码模拟的是MQTT.fx客户端连接设备的功能,所以连接以后,设备会显示“已经连接”。