物聯網平臺支持廣播通信,即向指定產品下的全量設備(設備無需訂閱廣播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接入地址,公共實例和企業版實例中接入地址的獲取方法,請參見查看實例終端節點。
- 初始化連接。
//連接并設置連接成功以后的回調函數。 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。