服务端下发指令

设备接入物联网平台并上报消息后,您也可以尝试从服务端下发指令到设备端,设备接收指令后可处理对应业务。例如通过服务端调用接口Pub向具有订阅权限的自定义Topic下发消息,设备订阅该Topic后,即可接收服务端下发的消息。本文介绍如何在服务端使用云端SDK下发指令给设备。

场景说明

假设服务端应用需要下发一条自定义通知给设备,设备端接收通知后进行消息打印,可使用云端SDK提供的接口Pub通过自定义Topic向设备发布消息,订阅了该自定义Topic的在线设备可接收消息后打印。

image

前提条件

已开发设备接入物联网平台,且设备已订阅自定义Topic:/a2******/Device1/user/get(该Topic具备订阅权限)。具体操作,请参见设备接入和上报数据

背景信息

设备基于Topic与物联网平台进行通信,设备可以通过Topic将消息发布到物联网平台,物联网平台可以将消息发送给订阅Topic的设备。设备通信的详细说明,请参见使用Topic通信

说明

本文示例通过自定义Topic下发指令。您也可以通过物模型相关Topic,发送标准化的物模型数据,更多信息,请参见什么是物模型设备使用物模型通信

准备开发环境

本示例与AMQP客户端部署在相同业务服务端中,即在amqp-demo项目中开发调用云端API的示例程序下发指令给设备。环境配置信息,请参见准备开发环境

使用云端SDK的Pub接口下发消息

  1. 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>
  2. 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

    cn-shanghai

    修改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”编码后的值。

  3. 运行PubMessage.java示例代码后,返回如下日志信息,表示消息下发成功。

    {"requestId":"6EF6****-****-5***-***7-D2********48","success":true,"messageId":"170440***********"}
  4. 返回物联网平台控制台对应实例下,在左侧导航栏,单击监控运维 > 日志服务,在云端运行日志页签,查看设备API调用的⽇志。

    API调用日志

设备接收消息

设备接收服务端应用下发的消息后,打印消息内容MessageContent,如下示例为设备C Link SDK打印自定义Topic:/a2******/Device1/user/get的消息日志。

[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 

相关文档

  • 设备端基于自定义Topic通信的数据格式是自定义的,服务端应用下发设备的消息可直接使用设备的数据格式,无需解析。

    如果设备数据格式透传/自定义,设备通过自定义Topic上报给物联网平台的自定义格式数据Payload需要解析为Alink JSON格式,具体内容,请参见消息解析

  • 设备使用物模型通信时,物联网平台云端可直接下发指令给设备,设置物模型属性和调用物模型服务。具体操作,请参见在线调试

    如果使用设备模拟器,物联网平台下发指令到设备,包含:自定义Topic的消息下发、属性调试(含获取、设置)、服务调用。具体内容,请参见设备模拟器的功能调试

相关问题