物聯網平臺支持廣播通信,即向指定產品下的全量設備(設備無需訂閱廣播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版本為示例值,您可在API在線調試工具頁面查看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. 實例概覽頁面,選擇目標環境,找到對應的實例,單擊實例ID或備注名稱。
    重要 目前僅開通企業版實例服務的地域下,執行此步驟。其他地域,請跳過此步驟。地域及實例的支持說明,請參見實例概述
    實例概覽
  3. 在左側導航欄,單擊設備管理 > 產品。
  4. 單擊創建產品,創建智能門鎖產品。具體操作,請參見創建產品。
  5. 在左側導航欄,單擊設備管理 > 設備,然后在智能門鎖產品下,創建三個設備。具體操作,請參見批量創建設備。

配置設備端SDK

  • 配置設備端接入物聯網平臺。
    • 配置設備認證信息。
      final String productKey = "<yourProductKey>";
      final String deviceName = "<yourDeviceName>";
      final String deviceSecret = "<yourDeviceSecret>";
      final String region = "<yourRegionID>";

      productKey、deviceNamedeviceSecret是設備證書信息,請在物聯網平臺控制臺,對應實例下,選擇設備管理 > 設備,單擊設備對應的查看,進入設備詳情頁獲取。

      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接入地址,公共實例和企業版實例中接入地址的獲取方法,請參見查看實例終端節點。

    • 初始化連接。
      //連接并設置連接成功以后的回調函數。
      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示例。