定时任务

注意

1、timePoint的格式为"yyyy-MM-dd HH:mm:ss",否则会失败。

2、timeCycle需要在timePoint时间点的基础上,选择循环方式。

  • "once":单次循环

  • "hour":在每小时的mm:ss时间点循环执行

  • "day":在每天的HH:mm:ss时间点循环执行

  • "month":在每月的dd HH:mm:ss时间点循环执行

  • "year":在每年的MM-dd HH:mm:ss时间点循环执行

  • "week[0,1,2,3,4,5,6]":在每星期的HH:mm:ss时间点循环执行(如周一,周五重复,则表示为"week[1,5]")

3、timeZone支持标准时区列表,标准时区列表请参考wiki

设备定时任务

||SKIP||

获取设备定时管理器

使用默认时区

//设备的逻辑ID
long deviceId = 1L; 
ACDeviceTimerMgr timerMgr = AC.deviceTimerMgr(deviceId);

使用自定义时区

//设备的逻辑ID
long deviceId = 1L; 
//使用北京时区
ACDeviceTimerMgr timerMgr = AC.deviceTimerMgr(deviceId, TimeZone.getTimeZone("Etc/GTM-8"));

自定义时区ID详情参考http://joda-time.sourceforge.net/timezones.html

添加设备定时任务

ACDeviceTask task = new ACDeviceTask();
//设置任务时间周期
task.setTimeCycle("day");
//设置任务执行的时间点,由于时间周期为天,所以只有19点精确到小时以后为有效参数,日期设置无效,即在每天19点执行任务
task.setTimePoint("2000-01-01 19:00:00");
//设置任务名称
task.setName("control");
//设置任务描述,选填
task.setDescription("open Air Condition");
//具体下发给设备的消息指令,msgCode与二进制流
ACDeviceMsg msg = new ACDeviceMsg(68, new byte[]{1,0,0,0});
task.setDeviceMsg(msg);
timerMgr.addTask(task, new PayloadCallback<ACDeviceTask>() {
     @Override
     public void success(ACDeviceTask task) {
         //成功添加定时任务,创建后默认为开启状态
     }

     @Override
     public void error(ACException e) {
         //网络错误或其他,根据e.getErrorCode()做不同的提示或处理,此处一般为参数类型错误,请仔细阅读注意事项
     }
});

修改设备定时任务

接口为modifyTask,其他参数与定义与创建定时任务相同。

开启设备定时任务

//taskId可以通过接口addTask/listTasks返回值获取
timerMgr.openTask(taskId, new VoidCallback() {
     @Override
     public void success() {
         //开启定时任务成功
     }

     @Override
     public void error(ACException e) {
         //参数无误下一般为网络错误
     }
});

关闭设备定时任务

timerMgr.closeTask(taskId, new VoidCallback() {
     @Override
     public void success() {
         //关闭定时任务
     }

     @Override
     public void error(ACException e) {
         //参数无误下一般为网络错误
     }
});

删除设备定时任务

timerMgr.deleteTask(taskId, new VoidCallback() {
     @Override
     public void success() {
         //删除定时任务
     }

     @Override
     public void error(ACException e) {
         //参数无误下一般为网络错误
     }
});

获取定时任务列表

timerMgr.listTasks(new PayloadCallback<List<ACDeviceTask>>(){
     @Override
     public void success(List<ACDeviceTask> tasks) {
         for (ACDeviceTask task : tasks){
             //通过logcat查看获取到的定时任务列表进行显示或下一步操作
             LogUtil.d("TAG", task.toString());
             //如获取taskId
             long taskId = task.getTaskId();
         }
     }

     @Override
     public void error(ACException e) {
         //参数无误下一般为网络错误
     }
});

设备定时任务组

与普通设备定时任务的区别是,将多个定时任务进行分组管理。 以下场景举例:用户设置每天早上9点上班,下午17点下班。那么我们希望在每天8:30自动关闭空调,下午16:30提前打开空调,实现代码如下:

||SKIP||

获取设备定时管理器

使用默认时区

//设备的逻辑ID
long deviceId = 1L; 
ACDeviceTimerMgr timerMgr = AC.deviceTimerMgr(deviceId);

使用自定义时区

//设备的逻辑ID
long deviceId = 1L; 
//使用北京时区
ACDeviceTimerMgr timerMgr = AC.deviceTimerMgr(deviceId, TimeZone.getTimeZone("Etc/GTM-8"));

自定义时区ID详情参考http://joda-time.sourceforge.net/timezones.html

创建设备任务组

List<ACDeviceTask> tasks = new ArrayList<>();

ACDeviceTask closeTask = new ACDeviceTask();
//任务名字
closeTask.setName("Close air condition");
//任务描述,选填
closeTask.setDescription("Go to work");
//设置任务时间周期为每周工作日
closeTask.setTimeCycle("week[1,2,3,4,5]");
//由于时间周期为周,所以只有早上9点精确到小时为有效参数,日期设置无效
closeTask.setTimePoint("2000-01-01 09:00:00");
//关闭空调的具体控制指令
ACDeviceMsg msg = new ACDeviceMsg(68, new byte[]{0, 0, 0, 0});
closeTask.setDeviceMsg(msg);
tasks.add(closeTask);

ACDeviceTask openTask = new ACDeviceTask();
openTask.setName("Open air condition");
openTask.setDescription("Go off work");
openTask.setTimeCycle("week[1,2,3,4,5]");
openTask.setTimePoint("2000-01-01 17:00:00");
ACDeviceMsg msg = new ACDeviceMsg(68, new byte[]{1, 0, 0, 0});
openTask.setDeviceMsg(msg);
tasks.add(openTask);

timerMgr.addTaskGroup(new ACDeviceGroup("working", tasks), new PayloadCallback<ACDeviceGroup>() {
    @Override
    public void success(ACDeviceGroup group) {
        //获取任务组ID等信息
        String groupId = group.getGroupId();
    }

    @Override
    public void error(ACException e) {
        //参数无误下一般为网络错误
    }
});

修改设备任务组

//groupId可通过接口addTaskGroup/listTaskGroups返回
timerMgr.modifyTaskGroup(new ACDeviceGroup(groupId, groupName, tasks), new VoidCallback() {
    @Override
    public void success() {
        //修改设备任务组成功
    }

    @Override
    public void error(ACException e) {
        //参数无误下一般为网络错误
    }
});

关闭设备任务组

timerMgr.closeTaskGroup(groupId, new VoidCallback() {
    @Override
    public void success() {
        //成功关闭任务组
    }

    @Override
    public void error(ACException e) {
        //参数无误下一般为网络错误
    }
});

打开设备任务组/删除设备任务组/获取单个任务组详情与该接口类似,分别调用接口openTaskGroup/deleteTaskGroup/getTaskGroup

获取所有设备任务组

timerMgr.listTaskGroups(new PayloadCallback<List<ACDeviceGroup>>() {
    @Override
    public void success(List<ACDeviceGroup> groups) {
        for(ACDeviceGroup group : groups){
            //获取任务组ID
            String groupId = group.getGroupId();
            //获取任务组名字
            String groupName = group.getGroupName();
            //获取任务组详情
            List<ACDeviceTask> tasks = group.getTasks();
        }
    }

    @Override
    public void error(ACException e) {
        //参数无误下一般为网络错误
    }
});

用户定时任务

||SKIP||

获取用户定时管理器

使用默认时区

ACUserTimerMgr timerMgr = AC.userTimerMgr();

使用自定义时区

//使用北京时区
ACUserTimerMgr timerMgr = AC.userTimerMgr(TimeZone.getTimeZone("Etc/GTM-8"));

自定义时区ID详情参考http://joda-time.sourceforge.net/timezones.html

添加用户定时任务

ACUserTask task = new ACUserTask();
//设置任务时间周期
task.setTimeCycle("day");
//设置任务执行的时间点,由于时间周期为天,所以只有19点精确到小时以后为有效参数,日期设置无效,即在每天19点执行任务
task.setTimePoint("2000-01-01 19:00:00");
//设置任务名称
task.setName("control");
//设置任务描述,选填
task.setDescription("open Air Condition");

//具体发送到uds的消息指令,与sendToService参数类似,接口名及参数由UDS实际提供为主
ACMsg req = new ACMsg();
req.setName("openAirCondition");
req.put("deviceId", 1L);
//ACUserCommand参数分别为子域名,服务名,请求参数,默认发送到UDS最新版本号
ACUserCommand command = new ACUserCommand(subDomain, serviceName, req);
task.setUserCommand(command);
timerMgr.addTask(task, new PayloadCallback<ACUserTask>() {
     @Override
     public void success(ACUserTask task) {
         //成功添加定时任务,创建后默认为开启状态
     }

     @Override
     public void error(ACException e) {
         //网络错误或其他,根据e.getErrorCode()做不同的提示或处理,此处一般为参数类型错误,请仔细阅读注意事项
     }
});

修改用户定时任务

接口为modifyTask,其他参数与定义与创建定时任务相同。

开启用户定时任务

//taskId可以通过接口addTask/listTasks返回值获取
timerMgr.openTask(taskId, new VoidCallback() {
     @Override
     public void success() {
         //开启定时任务成功
     }

     @Override
     public void error(ACException e) {
         //参数无误下一般为网络错误
     }
});

关闭用户定时任务

timerMgr.closeTask(taskId, new VoidCallback() {
     @Override
     public void success() {
         //关闭定时任务
     }

     @Override
     public void error(ACException e) {
         //参数无误下一般为网络错误
     }
});

删除用户定时任务

timerMgr.deleteTask(taskId, new VoidCallback() {
     @Override
     public void success() {
         //删除定时任务
     }

     @Override
     public void error(ACException e) {
         //参数无误下一般为网络错误
     }
});

获取定时任务列表

timerMgr.listTasks(new PayloadCallback<List<ACUserTask>>(){
     @Override
     public void success(List<ACUserTask> tasks) {
         for (ACUserTask task : tasks){
             //通过logcat查看获取到的定时任务列表进行显示或下一步操作
             LogUtil.d("TAG", task.toString());
             //如获取taskId
             long taskId = task.getTaskId();
         }
     }

     @Override
     public void error(ACException e) {
         //参数无误下一般为网络错误
     }
});

用户定时任务组

与普通定时定时任务的区别是,将多个定时任务进行分组管理。 以下场景举例:用户设置每天早上9点上班,下午17点下班。那么我们希望在每天8:30自动关闭空调,下午16:30提前打开空调,并且在操作完空调后把处理结果推送给用户;这时我们建议将操作空调及推送的功能通过UDS实现,APP通过定时调用UDS提供的接口实现这个需求,APP端实现代码如下:

||SKIP||

获取用户定时管理器

使用默认时区

ACUserTimerMgr timerMgr = AC.userTimerMgr();

使用自定义时区

//使用北京时区
ACUserTimerMgr timerMgr = AC.userTimerMgr(TimeZone.getTimeZone("Etc/GTM-8"));

自定义时区ID详情参考http://joda-time.sourceforge.net/timezones.html

创建用户任务组

List<ACUserTask> tasks = new ArrayList<>();

ACUserTask closeTask = new ACUserTask();
//任务名字
closeTask.setName("Close air condition");
//任务描述,选填
closeTask.setDescription("Go to work");
//设置任务时间周期为每周工作日
closeTask.setTimeCycle("week[1,2,3,4,5]");
//由于时间周期为周,所以只有早上9点精确到小时为有效参数,日期设置无效
closeTask.setTimePoint("2000-01-01 09:00:00");
//具体发送到uds的消息指令,与sendToService参数类似,接口名及参数由UDS实际提供为主
ACMsg req = new ACMsg();
req.setName("closeAirCondition");
req.put("deviceId", 1L);
//ACUserCommand参数分别为子域名,服务名,请求参数,默认发送到UDS最新版本号
ACUserCommand command = new ACUserCommand(subDomain, serviceName, req);
closeTask.setUserCommand(command);
tasks.add(closeTask);

ACUserTask openTask = new ACUserTask();
openTask.setName("Open air condition");
openTask.setDescription("Go off work");
openTask.setTimeCycle("week[1,2,3,4,5]");
openTask.setTimePoint("2000-01-01 17:00:00");
ACMsg req = new ACMsg();
req.setName("openAirCondition");
req.put("deviceId", 1L);
ACUserCommand command = new ACUserCommand(subDomain, serviceName, req);
openTask.setUserCommand(command);
tasks.add(openTask);

timerMgr.addTaskGroup(new ACUserGroup("working", tasks), new PayloadCallback<ACUserGroup>() {
    @Override
    public void success(ACUserGroup group) {
        //获取任务组ID等信息
        String groupId = group.getGroupId();
    }

    @Override
    public void error(ACException e) {
        //参数无误下一般为网络错误
    }
});

修改用户任务组

//groupId可通过接口addTaskGroup/listTaskGroups返回
timerMgr.modifyTaskGroup(new ACUserGroup(groupId, groupName, tasks), new VoidCallback() {
    @Override
    public void success() {
        //修改设备任务组成功
    }

    @Override
    public void error(ACException e) {
        //参数无误下一般为网络错误
    }
});

关闭用户任务组

timerMgr.closeTaskGroup(groupId, new VoidCallback() {
    @Override
    public void success() {
        //成功关闭任务组
    }

    @Override
    public void error(ACException e) {
        //参数无误下一般为网络错误
    }
});

打开设备任务组/删除设备任务组/获取单个任务组详情与该接口类似,分别调用接口openTaskGroup/deleteTaskGroup/getTaskGroup

获取所有用户任务组

timerMgr.listTaskGroups(new PayloadCallback<List<ACUserGroup>>() {
    @Override
    public void success(List<ACUserGroup> groups) {
        for(ACUserGroup group : groups){
            //获取任务组ID
            String groupId = group.getGroupId();
            //获取任务组名字
            String groupName = group.getGroupName();
            //获取任务组详情
            List<ACUserTask> tasks = group.getTasks();
        }
    }

    @Override
    public void error(ACException e) {
        //参数无误下一般为网络错误
    }
});