Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
ISO/IEC 29341-4-10:2011 定义了 UPnP 调度服务(Scheduling Service),这是一种在 UPnP 网络环境中管理计划事件和重复任务的标准化服务。该服务使设备和控制点能够创建、修改、删除和查询计划操作——从简单的单次定时器到具有多个约束条件的复杂重复调度。调度服务为 UPnP 网络带来了基于时间的确定性自动化能力,使得构建无需持续连接控制点即可在指定时间或间隔执行操作的智能家居和楼宇自动化系统成为可能。
调度服务的正式服务类型为 urn:schemas-upnp-org:service:Scheduling:1。它提供的功能远超简单的定时器:调度可以定义重复规则(每日、每周、每月或自定义间隔)、有效期范围(开始和结束日期)以及例外日期(节假日或维护期间跳过的调度)。这种灵活性使其适用于从 HVAC 系统编程到照明自动化和媒体录制计划的各种应用场景。
在实际应用中,调度服务可以控制多种自动化场景:一个办公室的 UPnP 空调系统可以在工作日早上 8:00 自动开启、下午 6:00 自动关闭,周末全天保持关闭;智能灌溉系统可以根据天气预报调整浇水计划;媒体录制系统可以定时录制特定频道的内容。所有这些都是通过定义在设备内部的调度条目而非依赖于外部服务器实现的。
调度服务中的每个调度由唯一的 Schedule ID 标识,包含多个属性:调度类型(单次、每日、每周、每月或自定义)、目标动作(调度触发时调用的 UPnP 动作)、时间规范(绝对时间或相对于午夜的时间偏移)、重复规则(遵循 iCalendar RRULE 语法)和有效期(开始和结束日期/时间)。服务将这些调度存储在非易失性存储器中,并根据当前时间进行评估,在调度到期时触发相应的动作。
| 属性 | 数据类型 | 示例 |
|---|---|---|
| ScheduleID | 字符串(UUID) | “urn:uuid:a1b2c3d4-…” |
| ScheduleType | 字符串 | “WEEKLY” |
| TargetDevice | 字符串(UDN) | “uuid:device-001” |
| TargetAction | 字符串 | “SetTarget” |
| TargetArguments | XML | “<args><newTargetValue>1</newTargetValue></args>” |
| RecurrenceRule | 字符串(iCalendar RRULE) | “FREQ=WEEKLY;BYDAY=MO,WE,FR” |
| ValidityPeriod | 字符串(ISO 8601 范围) | “20260101T000000/20261231T235959” |
服务内部的调度引擎按周期性滴答评估调度(通常每 60 秒一次,但标准允许实现特定的时间间隔)。当调度触发时,服务使用 UPnP 控制消息在目标设备上调用指定的动作。如果目标设备离线或动作执行失败,服务可以根据可配置的重试策略选择性地重试。标准定义了一个 ScheduleFired 事件,每次调度触发时通知已订阅的控制点,从而实现自动化操作的日志记录和审计。
在嵌入式设备上实现调度服务面临若干独特挑战。非易失性存储管理至关重要——闪存具有有限的写入周期,而调度可能频繁变更(用户添加、修改或删除调度)。实施磨损均衡策略:将调度变更批量记录到事务日志中,定期提交到闪存,而不是每次修改都重写整个调度数据库。使用校验和或 CRC 检测写入期间意外断电导致的数据损坏。
时区和夏令时处理是另一个关键考量。调度服务以本地时间存储时间,但嵌入式设备通常在内部使用 UTC。实现必须在评估调度时在 UTC 和本地时间之间进行转换,并且必须正确处理夏令时转换。当夏令时向前调整时,落在跳过小时内的调度应在转换前立即执行。在夏令时回退期间,重复小时内的调度只应触发一次,除非特意设计为触发两次。
对于冲突解决,当多个调度在同一时间针对同一设备时,标准未规定特定的优先级方案。推荐的方法是按创建时间戳顺序(FIFO)执行所有匹配的调度。如果目标动作是幂等的(例如设置目标值),这是安全的。对于非幂等动作,实现者应提供优先级字段扩展,或要求控制点通过调度排序管理依赖关系。
UpdateSchedule 和 DeleteSchedule 动作不会影响当前正在执行的动作。如果修改后的调度再次触发,新参数从下一次触发开始生效。ValidityPeriod 具有合理的范围(建议最长 1 年),以防止调度表无限增长。