全部產品
Search
文件中心

IoT Platform:雲端下髮指令

更新時間:Jun 30, 2024

裝置上報訊息後,您可以嘗試從雲端下髮指令到裝置端。本文介紹如何通過雲端應用調用Pub介面,向溫控器發送指令。

前提條件

已接入裝置。具體操作,請參見裝置接入和上報資料

準備開發環境

本樣本與AMQP用戶端部署在相同商務服務端中,即在amqp-demo專案中開發調用雲端API的樣本程式下髮指令給裝置。環境配置資訊,請參見準備開發環境

操作步驟

說明

樣本通過自訂Topic下髮指令。您也可以通過物模型相關Topic,發送標準化的物模型資料,更多資訊,請參見什麼是物模型

  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

    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”編碼後的值。

  3. 運行PubMessage.java範例程式碼後,返回如下日誌資訊,表示訊息下發成功。

    {"requestId":"6EF6****-****-5***-***7-D2********48","success":true,"messageId":"170440***********"}
  4. 返回物聯網平台控制台對應執行個體下,在左側導覽列,單擊監控營運 > Log Service,在雲端作業記錄頁簽,查看裝置API調用的⽇志。

    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