设备任务

物联网平台支持设备任务功能,可同时向产品、设备或分组维度下的多个设备,发起任务。本文介绍通过配置Android Link SDK,实现设备接收自定义任务,并执行设备任务和更新任务状态。

前提条件

背景信息

步骤一:初始化任务管理

      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);