更新时间:2023-04-23 GMT+08:00
设备集成开发
概述
本文提供了通过设备集成实现设备的消息收发功能的具体步骤,主要分为配置Demo的设备连接信息、收发消息两部分。
准备工作
配置Demo的设备连接信息
- 进入ROMA Connect控制台,单击“查看控制台”。
- 单击左侧“设备集成”,单击“设备管理”。
- 在“设备管理”页面单击已创建的设备名称,进入设备详情页面,获取设备连接信息。
需要编辑的设备信息包括:设备连接地址、设备客户端ID、用户名、密码、具有发布权限的Topic、具有订阅权限的Topic。
- 解压Demo压缩包,在“romalink_demo > src > com > demo > romalink”路径下找到DeviceConnectDemo.java文件。
- 使用Java编辑工具打开这个文件,编辑设备连接的信息。运行成功后,在“设备管理”页面可以看到在线设备状态。
设备连接地址的格式为:“tcp://ip:port”,请按照格式输入设备连接地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// 设备连接地址 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消息。如果您调用设备集成发送控制设备消息的API,设备可以立即收到消息。
1 2 3 4 |
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的访问地址、访问端口、消息内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
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实例控制台的“设备集成 > 设备管理”页面中,单击对应设备的名称,在设备详情页面获取。
- 重新编译并运行DeviceControlDemo这个类,如果此时该设备处于连接状态并订阅了sub权限的Topic,设备会立即收到一条消息,并在IDE控制台打印出来。API的请求IP和设备连接的IP是相同的,端口是7443。
- 使用Java编辑器打开DeviceControlDemo.java,把发送控制消息的API的参数修改为您创建好的设备信息。
- 发送消息。
您可以设置设备发送消息的内容和频率。例如,您可以命令设备每隔10秒钟向设备集成发送一条消息,代码运行后,设备集成每隔10秒会收到消息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
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客户端连接设备的功能,所以连接以后,设备会显示“已经连接”。
- 为防止因网络不稳定或实例升级等原因导致设备出现连接中断的情况,需要在设备开发过程中增加设备状态检测和设备断开自动重连机制。
父主题: 设备集成开发指导