物聯網平臺支持設備任務功能,可同時向產品、設備或分組維度下的多個設備,發起任務。本文介紹通過配置Android Link SDK,實現設備接收自定義任務,并執行設備任務和更新任務狀態。
前提條件
已創建產品和設備,并獲取設備的認證信息以及設備的接入域名。具體操作,請參見創建產品和設備和查看實例終端節點信息。
背景信息
物聯網平臺設備任務的配置和工作流程說明,請參見設備任務概述。
設備任務通信消息的Topic和Alink數據格式,請參見設備任務的Alink協議。
步驟一:初始化任務管理
LinkKit.getInstance().getTask().TaskBootsUp();
步驟二:設備接收物聯網平臺推送的設備任務通知
物聯網平臺通過Topic:/sys/{productKey}/{deviceName}/thing/job/notify
,將任務信息推送給設備。
您可以通過設置以下監聽器,獲取物聯網平臺推送的任務信息。具體配置,請參見認證與連接。
IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
@Override
public void onNotify(String connectId, String topic, AMessage aMessage) {
// 下行數據回調
// connectId連接類型Topic下行Topic; aMessage下行數據
// 數據解析如下:
//String pushData = new String((byte[]) aMessage.data);
// pushData 示例 {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"}
// method 服務類型; params 下推數據內容
}
@Override
public boolean shouldHandle(String connectId, String topic) {
// 選擇是否不處理某個Topic的下行數據
// 如果不處理某個Topic,則onNotify不會收到對應Topic的下行數據
return true; //TODO 根據實際情況設置
}
@Override
public void onConnectStateChange(String connectId, ConnectState connectState) {
// 對應連接類型的連接狀態變化回調,具體連接狀態參考SDK ConnectState
AppLog.d(TAG, "onConnectStateChange() called with: connectId = [" + connectId + "], connectState = [" + connectState + "]");
//首次連云可能失敗。對于首次連云失敗,SDK會報出ConnectState.CONNECTFAIL這種狀態。對于這種場景,用戶可以嘗試若干次后退出,也可以一直重試直到連云成功
//TODO: 以下是首次建連時用戶主動重試的一個參考實現,用戶可以打開下面注釋使能下述代碼
// if(connectState == ConnectState.CONNECTFAIL){
// try{
// Thread.sleep(5000);
// PersistentNet.getInstance().reconnect();
// }catch (Exception e){
// AppLog.d(TAG, "exception is " + e);
// };
// AppLog.d(TAG, "onConnectStateChange() try to reconnect when connect failed");
// }
//SDK連云成功后,后續如果網絡波動導致連接斷開時,SDK會拋出ConnectState.DISCONNECTED這種狀態。在這種情況下,SDK會自動嘗試重連,重試的間隔是1s、2s、4s、8s...128s...128s,到了最大間隔128s后,會一直以128s為間隔重連直到連云成功。
}
}
// 注冊下行監聽,包括長連接的狀態和下行的數據
LinkKit.getInstance().registerOnPushListener(notifyListener);
// 取消下行監聽,需要確保和注冊的是同一個對象
// LinkKit.getInstance().unRegisterOnPushListener(notifyListener);
說明
下行數據的回調onNotify
,默認是在UI線程透出。自lp-iot-linkkit
的1.7.3版本起,您可以通過PersistentConnect.mNotifyReceivedMsgOnMainThread = false;
選擇將下行消息通過非UI線程透出。對于下行消息密集,或者UI線程業務繁忙的場景,建議將該配置項設置為false
。
步驟三:設備獲取任務
獲取下一個任務
LinkKit.getInstance().getTask().TaskGetNext(mConnectSendListener);
//設備發往云端的請求執行的回調函數,用以判斷發送是否成功
IConnectSendListener mConnectSendListener = new IConnectSendListener() {
@Override
public void onResponse(ARequest aRequest, AResponse aResponse) {
AppLog.d(TAG, "onResponse() called with: aRequest = [" + aRequest + "], aResponse = [" + (aResponse == null ? null : aResponse.data) + "]");
}
@Override
public void onFailure(ARequest aRequest, AError aError) {
AppLog.d(TAG, "onFailure() called with: aRequest = [" + aRequest + "], aError = [" + aError + "]");
}
};
獲取任務列表
LinkKit.getInstance().getTask().TaskGetList(IConnectSendListener mConnectSendListener);
獲取指定任務的詳情
LinkKit.getInstance().getTask().TaskGetDetail(String taskId, IConnectSendListener mConnectSendListener);
步驟四:設備更新任務狀態
用戶獲取到任務詳情,本地執行任務后,可以將任務執行的狀態(成功、失敗、放棄等),以及任務進度的百分比同步到物聯網平臺云端。
ITask.TaskDesc taskDesc = new ITask.TaskDesc();
taskDesc.setTaskId(taskId); //必須設置
taskDesc.setProgress(50); //進展百分比,可選
taskDesc.setStatus(ITask.TASK_STATUS.IN_PROGRESS); //必須設置,任務狀態
LinkKit.getInstance().getTask().TaskUpdateProgress(taskDesc);
文檔內容是否對您有幫助?