物联网平台支持设备任务功能,可同时向产品、设备或分组维度下的多个设备,发起任务。本文介绍通过配置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);
文档内容是否对您有帮助?