物聯網平台支援廣播通訊,即向指定產品下的全量裝置(裝置無需訂閱廣播Topic),或訂閱了指定Topic的所有裝置發送訊息。裝置線上,即可收到伺服器發送的廣播訊息。本文以向全量線上裝置廣播訊息為例,介紹廣播通訊的具體配置流程。
背景資訊
- 向全量線上裝置廣播訊息
商務服務器調用PubBroadcast介面,傳入指定產品的ProductKey和MessageContent訊息內容,產品的全量線上裝置可通過廣播Topic
/sys/${productKey}/${deviceName}/broadcast/request/${MessageId}
,收到MessageContent訊息內容。廣播Topic中的MessageId是物聯網平台產生的訊息ID,成功發送訊息後,將作為PubBroadcast介面的返回資料返回商務服務器。
例如,廠家有多個智能門鎖接入物聯網平台,可通過商務服務器向全部線上裝置發送一條相同的指令,使某個密碼失效。
- 向訂閱了指定Topic的所有裝置廣播訊息
裝置端訂閱相同的廣播Topic,商務服務器調用PubBroadcast介面,傳入指定產品的ProductKey、MessageContent訊息內容和要接收廣播訊息的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。
準備開發環境
本樣本中,裝置端和雲端均使用Java語言的SDK,需先準備Java開發環境。您可從Java 官方網站下載,並安裝Java開發環境。
添加Maven專案依賴
建立專案,在pom.xml中,添加以下Maven依賴。
<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>
建立產品和裝置
配置裝置端SDK
- 配置裝置端接入物聯網平台。
- 配置裝置認證資訊。
final String productKey = "<yourProductKey>"; final String deviceName = "<yourDeviceName>"; final String deviceSecret = "<yourDeviceSecret>"; final String region = "<yourRegionID>";
productKey、deviceName和deviceSecret是裝置認證資訊,請在物聯網平台控制台,對應執行個體下,選擇 ,單擊裝置對應的查看,進入裝置詳情頁擷取。
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:
門鎖2:
門鎖3:
附錄:Demo
查看以下完整的配置代碼Demo,其中包含物聯網平台雲端SDK和裝置端SDK樣本。
- 向全量線上裝置廣播訊息:下載PubBroadcastDemo。
- 向訂閱了指定Topic的所有裝置廣播訊息:下載BroadcastDemo。