全部產品
Search
文件中心

IoT Platform:廣播通訊

更新時間:Jun 30, 2024

物聯網平台支援廣播通訊,即向指定產品下的全量裝置(裝置無需訂閱廣播Topic),或訂閱了指定Topic的所有裝置發送訊息。裝置線上,即可收到伺服器發送的廣播訊息。本文以向全量線上裝置廣播訊息為例,介紹廣播通訊的具體配置流程。

背景資訊

  • 向全量線上裝置廣播訊息

    商務服務器調用PubBroadcast介面,傳入指定產品的ProductKeyMessageContent訊息內容,產品的全量線上裝置可通過廣播Topic/sys/${productKey}/${deviceName}/broadcast/request/${MessageId},收到MessageContent訊息內容。

    廣播Topic中的MessageId是物聯網平台產生的訊息ID,成功發送訊息後,將作為PubBroadcast介面的返回資料返回商務服務器。

    例如,廠家有多個智能門鎖接入物聯網平台,可通過商務服務器向全部線上裝置發送一條相同的指令,使某個密碼失效。

    廣播通訊
  • 向訂閱了指定Topic的所有裝置廣播訊息

    裝置端訂閱相同的廣播Topic,商務服務器調用PubBroadcast介面,傳入指定產品的ProductKeyMessageContent訊息內容和要接收廣播訊息的Topic全稱(格式為:/broadcast/${productKey}/自訂欄位),已訂閱廣播Topic的線上裝置,收到MessageContent訊息內容。

    重要
    • 廣播Topic是在裝置開發時編碼定義的,無需在物聯網平台控制台建立。
    • 一個廣播Topic最多可被1,000個裝置訂閱。如果您的裝置超過數量限制,您可以對裝置進行分組。例如,如果您有5,000個裝置,您可以將裝置按每組1,000個,而分成5組。您需要分5次調用廣播Topic,自訂欄位分別設定為group1、group2、group3、group4、group5,然後讓每組裝置分別訂閱各自分組的廣播Topic。

    廣播介面調用的更多詳細說明,請參見PubBroadcast

使用限制

  • 廣播訊息僅推送給產品下當前線上的裝置。
  • 指定線上裝置廣播時,需指定Topic訂閱廣播,廣播介面最大調用頻次:1次/秒。
  • 全量線上裝置廣播時,無需訂閱廣播Topic,廣播介面最大調用頻次:1次/分鐘。
  • 廣播訊息體報文最大為64 KB。
重要 廣播訊息不會被執行個體的訊息上下行TPS規格限流。例如,訊息上下行TPS為100條/秒,當前線上裝置為500個時,每次調用廣播介面,訊息不會只發送給100個線上裝置,而是可以發送給500個線上裝置。

準備開發環境

本樣本中,裝置端和雲端均使用Java語言的SDK,需先準備Java開發環境。您可從Java 官方網站下載,並安裝Java開發環境。

添加Maven專案依賴

建立專案,在pom.xml中,添加以下Maven依賴。

說明 以下IoT Java SDK版本為樣本值,您可在OpenAPI Explorer頁面查看SDK依賴資訊。
<dependencies>
  <dependency>
     <groupId>com.aliyun.alink.linksdk</groupId>
     <artifactId>iot-linkkit-java</artifactId>
     <version>1.2.0.1</version>
     <scope>compile</scope>
  </dependency>
  <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-core</artifactId>
      <version>4.5.6</version>
  </dependency>
  <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-iot</artifactId>
      <version>7.41.0</version>
  </dependency>
  <dependency>
    <groupId>com.aliyun.openservices</groupId>
    <artifactId>iot-client-message</artifactId>
    <version>1.1.2</version>
  </dependency>
</dependencies>

建立產品和裝置

  1. 登入物聯網平台控制台
  2. 執行個體概覽頁簽的全部環境下,找到對應的執行個體,單擊執行個體卡片。

  3. 在左側導覽列,單擊裝置管理 > 產品
  4. 單擊建立產品,建立智能門鎖產品。具體操作,請參見建立產品
  5. 在左側導覽列,單擊裝置管理 > 裝置,然後在智能門鎖產品下,建立三個裝置。具體操作,請參見大量建立裝置

配置裝置端SDK

  • 配置裝置端接入物聯網平台。
    • 配置裝置認證資訊。
      final String productKey = "<yourProductKey>";
      final String deviceName = "<yourDeviceName>";
      final String deviceSecret = "<yourDeviceSecret>";
      final String region = "<yourRegionID>";

      productKeydeviceNamedeviceSecret是裝置認證資訊,請在物聯網平台控制台,對應執行個體下,選擇裝置管理 > 裝置,單擊裝置對應的查看,進入裝置詳情頁擷取。

      region是裝置所屬地區。region的表達方法,請參見地區列表

    • 設定初始化串連參數,包括MQTT配置、裝置資訊和初始狀態。
      LinkKitInitParams params = new LinkKitInitParams();
      //LinkKit底層是MQTT協議,設定MQTT配置。
      IoTMqttClientConfig config = new IoTMqttClientConfig();
      config.productKey = productKey;
      config.deviceName = deviceName;
      config.deviceSecret = deviceSecret;
      config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883";
      //裝置資訊。
      DeviceInfo deviceInfo = new DeviceInfo();
      deviceInfo.productKey = productKey;
      deviceInfo.deviceName = deviceName;
      deviceInfo.deviceSecret = deviceSecret;
      //報備的裝置初始狀態。
      Map<String, ValueWrapper> propertyValues = new HashMap<String, ValueWrapper>();
      params.mqttClientConfig = config;
      params.deviceInfo = deviceInfo;
      params.propertyValues = propertyValues;

      channelHost是MQTT接入地址,公用執行個體和企業版執行個體中接入地址的擷取方法,請參見查看和配置執行個體終端節點資訊(Endpoint)

    • 初始化串連。
      //串連並設定串連成功以後的回呼函數。
      LinkKit.getInstance().init(params, new ILinkKitConnectListener() {
           @Override
           public void onError(AError aError) {
               System.out.println("Init error:" + aError);
           }
           //初始化成功以後的回調。
           @Override
           public void onInitDone(InitResult initResult) {
               System.out.println("Init done:" + initResult);
           }
       });
  • 在回呼函數onInitDone中,通過首碼來識別廣播Topic,廣播Topic的首碼為:/sys/${productKey}/${deviceName}/broadcast/request/
    public void onInitDone(InitResult initResult) {
    
                    //設定下行訊息到來時的回呼函數。
                    IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
                        //此處定義收到下行訊息以後的回呼函數。
                        @Override
                        public void onNotify(String connectId, String topic, AMessage aMessage) {
    
                            //過濾得到廣播訊息。
                            if(topic.startsWith(broadcastTopic)){
                                System.out.println(
                                        "received broadcast message from topic=" + topic + ",\npayload=" + new String((byte[])aMessage.getData()));
                            }
    
                        }
    
                        @Override
                        public boolean shouldHandle(String s, String s1) {
                            return false;
                        }
    
                        @Override
                        public void onConnectStateChange(String s, ConnectState connectState) {
    
                        }
                    };
                    LinkKit.getInstance().registerOnNotifyListener(notifyListener);
                }

佈建服務端SDK

配置雲端Java SDK發送廣播訊息。

  • 配置身份認證資訊。
     String regionId = "<yourRegionID>";
     String accessKey = "<yourAccessKey>";
     String accessSecret = "<yourAccessSecret>";
     final String productKey = "<yourProductKey>";
  • 佈建服務端調用雲端API PubBroadcast廣播訊息。
    //設定client的參數。
    DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKey, accessSecret);
    IAcsClient client = new DefaultAcsClient(profile);
    PubBroadcastRequest request = new PubBroadcastRequest();
    //設定廣播訊息的產品productKey。
    request.setProductKey(productKey);
    //設定訊息的內容,一定要用base64編碼,否則亂碼。
    request.setMessageContent(Base64.encode("{\"pwd\":\"2892nd6Y\"}"));
    //設定執行個體ID。
    request.setIotInstanceId("iot-cn-***");
  • 服務端發送廣播訊息。
    try {
        PubBroadcastResponse response = client.getAcsResponse(request);
    System.out.println("broadcast pub success: broadcastId =" + response.getMessageId());
    } catch (Exception e) {
        System.out.println(e);
    }

驗證操作

先運行各裝置的Link SDK代碼,使裝置上線,然後運行雲端SDK代碼,調用介面PubBroadcast向裝置廣播訊息。

雲端SDK中,向裝置端廣播的訊息內容為:"{\"pwd\":\"2892nd6Y\"}"

裝置端本地日誌都將顯示收到廣播訊息:{\"pwd\":\"2892nd6Y\"}

門鎖1:

門鎖1

門鎖2:

門鎖2

門鎖3:

門鎖3

附錄:Demo

查看以下完整的配置代碼Demo,其中包含物聯網平台雲端SDK和裝置端SDK樣本。