|
TuyaOS
|
涂鸦 TuyaOS 支持对 Powered by Tuya 设备的固件进行升级。在涂鸦IoT平台上创建的产品,可以上传固件、绑定升级通道 OTA channel ,每一个通道对应着设备上的一个可以进行版本升级的固件或者是文件、配置,开发者通过对该固件、文件或配置进行配置升级,然后推送到设备上。设备在接收到升级通知的时候,会去涂鸦IoT平台上获取对应通道所绑定的升级版本固件、文件或者配置,在本地进行校验、写入更新,然后上报新的版本号,完成升级过程。
涂鸦 TuyaOS 的升级操作主要分为以下几种类型:
| 升级类型 | 描述 |
|---|---|
| 静默升级 | 设备在启动之时以及每运行6小时,都会自动向IoT平台请求检测是否有静默升级任务。 如果存在静默升级任务,则进入升级流程进行升级; 如果不存在静默升级任务,则再等待6个小时重新检测。 静默升级中打开设备面板,会有进度框显示,并且无法操作设备。 |
| 提醒升级 | 用户手机APP首次打开设备面板时,会收到升级提醒弹框,可以选择升级或者不升级。 如果用户选择升级,则会推送升级任务到设备,设备并获取升级任务,进入升级流程,并上报升级进度。设备面板显示升级进度,并且无法操作设备。 |
| 检测升级 | 用户手机APP打开设备面板,点击点击右上角进入设备信息界面,检测设备固件版本,主动更新。 如果检测到有新的固件版本,则会推送升级任务到设备,设备并获取升级任务,进入升级流程,并上报升级进度。设备面板显示升级进度,并且无法操作设备。 |
| 强制升级 | 用户手机APP首次打开设备面板时,会收到升级提醒弹框,只有确定可以选择,无法取消。 用户选择升级,则会推送升级任务到设备,设备并获取升级任务,进入升级流程,并上报升级进度。设备面板显示升级进度,并且无法操作设备。 |
OTA Channel 是涂鸦 TuyaOS 对设备内部可以进行升级的固件、文件或者配置进行升级通道绑定的一种机制,主要分为两种,分别为系统 OTA channel 和扩展 OTA Channel。
OTA channel:涂鸦 TuyaOS 使用的,固化的一些通道,用于指定类型的固件升级使用, DEV_NM_ATH_SNGL是主联网固件,即当前模组的固件;DEV_NM_NOT_ATH_SNGL是MCU固件。OTA Channel:涂鸦 TuyaOS 定义的,开发者可以根据自己的实际需求进行规划使用,在使用的时候,需要在初始化上报GW_ATTACH_ATTR_T,升级的时候在平台上配置对应OTA Channel的升级固件。| 名称 | 通道号 | 描述 |
|---|---|---|
DEV_NM_ATH_SNGL | 0 | 系统 OTA Channel,主联网固件升级通道 |
DEV_BLE_SNGL | 1 | 系统 OTA Channel,蓝牙固件升级通道 |
DEV_ZB_SNGL | 3 | 系统 OTA Channel,ZigBee固件升级通道 |
DEV_NM_NOT_ATH_SNGL | 9 | 系统 OTA Channel,MCU固件升级通道 |
DEV_ATTACH_MOD_x | >=10 | 扩展 OTA Channel,开发者自定义的升级通道 |
在升级过程中,涂鸦 TuyaOS 在获取到升级信息之后,会对升级通道进行一个检查。如果升级通道是主联网固件升级通道,即 DEV_NM_ATH_SNGL,涂鸦 TuyaOS 会自行处理;如果升级通道是其他的系统 OTA Channel 或者是扩展的 OTA Channel,则会调用开发者在初始化时候提供的 TY_IOT_CBS_S 里的回调函数 gw_ug_cb。在这个回调函数里,开发者可以根据里面的 tp 来判断是什么样的 OTA Channel,然后进行区分处理。
一些客户对主联网固件的升级也有特殊的定制需求,可以通过一个接口 tuya_svc_upgrade_register_pre_cb 进行定制,只要注册一个 NULL 指针即可。
除了回调函数之外,OTA的其他功能不需要用于进行编码开发,涂鸦 TuyaOS 直接提供相关的能力。
在接受到升级推送消息之后,需要确认当前设备是否满足升级条件,如果不满足条件,如处于特别的繁忙、低电量等状态,可以不进行升级操作。此接口是在设备初始化提供的一组回调中,如果不提供则认为不需要做通知,默认可以进行升级。
在确认可以进入升级之后,会从云端获取对应的升级信息,如果升级的内容是主联网固件DEV_NM_ATH_SNGL,会自行处理,如果是其他的,如DEV_NM_NOT_ATH_SNGL,则通过此回调来通知应用层,进行相应的准备之后,在此接口内启动升级。此接口是在设备初始化提供的一组回调中,如果不提供则认为不需支持模组固件之外的对象OTA。
此接口用于在开发者提供的 gw_ug_cb 里启动OTA流程。接口里需要提供 get_file_cb,用于获取文件内容写入flash,upgrd_notify_cb 用于通知升级结束或者失败。
此接口用于注册升级回调之前的特殊操作,涂鸦 TuyaOS 内部默认有一个 pre_cb,在内部的 pre_cb 里,涂鸦 TuyaOS 处理了主联网固件(模组自身固件)的升级逻辑。如果需要关闭此逻辑,把主联网固件(模组自身固件)的升级也放到开发者在初始化时候提供的回调函数 gw_ug_cb 里处理,可以通过 tuya_svc_upgrade_register_pre_cb(NULL) 来替换涂鸦 TuyaOS 内部的默认 pre_cb;如果希望使用一个新的handler来处理主联网固件(模组自身固件)可以通过 tuya_svc_upgrade_register_pre_cb(new_pre_ug_cb) 来替换涂鸦 TuyaOS 内部的默认 pre_cb。
此接口用于固件升级结果上报,用于处理非主联网固件升级结果,如果不调用此接口,云端和APP通过超时时间也可以得到升级的结果,但需要较长时间的等待。
此接口用于固件升级过程中强制停止,告知云端和APP升级失败,并将设备状态重置为EXT_NORMAL_S状态。在强制停止升级的时候,也需要在应用侧停止升级下载逻辑,以避免影响其他功能。主联网固件升级结果,不需要应用层处理。
此示例实现了MCU固件的OTA处理逻辑,忽略了其他TY_IOT_CBS_S回调函数的实现。