设备上报消息后,您可以尝试从云端下发指令到设备端。本文介绍如何通过云端应用调用Pub接口,向温控器发送指令。
前提条件
已接入设备。具体操作,请参见设备接入和上报数据。
准备开发环境
本示例与AMQP客户端部署在相同业务服务端中,即在amqp-demo
项目中开发调用云端API的示例程序下发指令给设备。环境配置信息,请参见准备开发环境。
操作步骤
示例通过自定义Topic下发指令。您也可以通过物模型相关Topic,发送标准化的物模型数据,更多信息,请参见什么是物模型。
在
amqp-demo/pom.xml
文件中,添加云端SDK的依赖。阿里云IoT Java SDK的Maven依赖坐标。
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-iot --> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-iot</artifactId> <version>7.41.0</version> </dependency>
阿里云Java SDK公共包Maven依赖坐标。
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.6.3</version> </dependency>
在
src/main/java/com.aliyun.iotx.demo
下创建类文件PubDemo.java
,输入以下示例代码。import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.google.gson.Gson; import com.aliyuncs.iot.model.v20180120.*; public class PubDemo { public static void main(String[] args) throws Exception { DefaultProfile profile = DefaultProfile.getProfile("${RegionId}", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); IAcsClient client = new DefaultAcsClient(profile); PubRequest request = new PubRequest(); request.setIotInstanceId("iot-cn-******"); request.setProductKey("a2******"); request.setTopicFullName("/a2******/Device1/user/get"); request.setMessageContent("eyJ0ZXN0IjoidGFzayBwdWIgYnJvYWRjYXN0In0="); try { PubResponse response = client.getAcsResponse(request); System.out.println(new Gson().toJson(response)); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { System.out.println("ErrCode:" + e.getErrCode()); System.out.println("ErrMsg:" + e.getErrMsg()); System.out.println("RequestId:" + e.getRequestId()); } } }
实际场景中,需要修改示例代码中的以下参数。
参数
示例
说明
RegionId
ap-northeast-1
修改
DefaultProfile.getProfile
中的${RegionId}
为您的物联网平台服务的地域代码。阿里云地域代码,请参见支持的地域。TopicFullName
/a2******/Device1/user/get
要发布消息的自定义Topic。
本示例使用物联网平台中的自定义Topic:
/${productKey}/${deviceName}/user/get
。其中
${productKey}
为产品家庭温控器的ProductKey值,${deviceName}
为设备Device1。更多信息,请参见使用自定义Topic进行通信。
ProductKey
a2******
家庭温控器的ProductKey值。
IotInstanceId
iot-cn-******
IoT测试环境的实例ID。
您可在控制台的实例概览页面查看。
MessageContent
eyJ0ZXN0IjoidGFzayBwdWIgYnJvYWRjYXN0In0=
要发送的消息主体,通过将消息原文转换成二进制数据,并进行Base64编码生成。本示例中消息为
“washingMode: 2, washingTime: 30”
编码后的值。运行
PubMessage.java
示例代码后,返回如下日志信息,表示消息下发成功。{"requestId":"6EF6****-****-5***-***7-D2********48","success":true,"messageId":"170440***********"}
返回物联网平台控制台对应实例下,在左侧导航栏,单击 ,在云端运行日志页签,查看设备API调用的⽇志。
您也可以在设备端查看下发的MessageContent内容。
[1695199345.900][LK-0309] pub: /a2******/Device1/user/get [LK-030A] < 77 61 73 68 69 6E 67 4D 6F 64 65 3A 20 32 2C 20 | washingMode: 2, [LK-030A] < 77 61 73 68 69 6E 67 54 69 6D 65 3A 20 33 30 | washingTime: 30