廣播通訊
更新時間:
Copy as MD
雲端可以對批量裝置發送廣播下行通知,裝置端可以按照如下方式對廣播進行處理。目前雲端支援單裝置廣播和批量廣播,這兩種下發的topic格式是不一樣的,裝置端需要根據需要支援的形式做響應。
批量廣播
批量廣播是系統廣播,無需端上進行訂閱即可收到。topic格式:/sys/${pk}/${dn}/broadcast/request/+。
定向廣播
定向廣播是需要端上進行訂閱才能收到廣播下行的。topic格式:/broadcast/${pk}/${自訂action}。
廣播接收
本功能需要在SDK正常初始化,且註冊了下行監聽器才可以收到通知。需要注意定向廣播需要裝置端進行訂閱,topic是由發送端定義的,須符合 /broadcast/${pk}/${自訂action} 格式。其中自訂action可以是符合格式的任意值,裝置端根據發送端的定義來進行訂閱。
// 註冊下行監聽器
LinkKit.getInstance().registerOnPushListener(notifyListener);
/**
* 下行監聽器,雲端 MQTT 下行資料都會通過這裡回調
*/
private static IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
/**
* onNotify 會觸發的前提是 shouldHandle 沒有指定不處理這個topic
* @param connectId 連線類型,這裡判斷是否長鏈 connectId == ConnectSDK.getInstance().getPersistentConnectId()
* @param topic 下行的topic
* @param aMessage 下行的資料內容
*/
@Override
public void onNotify(String connectId, String topic, AMessage aMessage) {
String data = new String((byte[]) aMessage.data);
// 服務端返回資料樣本 data = {"method":"thing.service.test_service","id":"12*****67","params":{"vv":60},"version":"1.0.0"}
ALog.d(TAG, "onNotify() called with: connectId = [" + connectId + "], topic = [" + topic + "], aMessage = [" + data + "]");
if (ConnectSDK.getInstance().getPersistentConnectId().equals(connectId) && !TextUtils.isEmpty(topic) &&
topic.startsWith("/sys/" + DemoApplication.productKey + "/" + DemoApplication.deviceName + "/broadcast/request/")) {
/**
* topic 格式:/sys/${pk}/${dn}/broadcast/request/+
* 無需訂閱,雲端免訂閱,預設無需業務進行ack,但是也支援使用者雲端和裝置端約定業務ack
* 樣本:/sys/a14*****ZA/android_lp_test1/broadcast/request/1229336863924294656
* 注意:觸發端資料需要進行Base64編碼,否則會出現端上亂碼,
* 如雲端: org.apache.commons.codec.binary.Base64.encodeBase64String("broadcastContent".getBytes())
*/
//
ToastUtils.showToast("收到雲端批量廣播下行:topic=" + topic + ",data=" + data);
//TODO 根據批量廣播做商務邏輯處理
} else if (ConnectSDK.getInstance().getPersistentConnectId().equals(connectId) && !TextUtils.isEmpty(topic) &&
topic.startsWith("/broadcast/" + DemoApplication.productKey )) {
//
/**
* topic 需要使用者自己訂閱才能收到,topic 格式:/broadcast/${pk}/${自訂action},需要和雲端發送topic一致
* 樣本:/broadcast/a14*****ZA/oldBroadcast
* 注意:觸發端資料需要進行Base64編碼,否則會出現端上亂碼,
* 如雲端: org.apache.commons.codec.binary.Base64.encodeBase64String("broadcastContent".getBytes())
*/
ToastUtils.showToast("收到雲端廣播下行:topic=" + topic + ",data=" + data);
//TODO 根據廣播做商務邏輯處理
} else {
ToastUtils.showToast("收到雲端下行:topic=" + topic + ",data=" + data);
/**
* TODO
* 根據訂閱的具體 topic 做業務處理
*/
}
/**
* @param connectId 連線類型,這裡判斷是否長鏈 connectId == ConnectSDK.getInstance().getPersistentConnectId()
* @param topic 下行topic
* @return 是否要處理這個topic,如果為true,則會回調到onNotify;如果為false,onNotify不會回調這個topic相關的資料。建議預設為true。
*/
@Override
public boolean shouldHandle(String connectId, String topic) {
return true;
}
}该文章对您有帮助吗?