常见问题答疑

1. 单备份OTA与双备份OTA的区别

类型

单备份

双备份

存储

除了工程所需支持空间,
额外增加loader所需的空间即可

需要工程所需支持空间 * 2

升级

需要断开回连一次

无感升级, 无需回连

流程

下载loader -> 设备重启(运行loader)->
回连设备 -> 升级固件

升级固件

安全

有几率需要强制升级(蓝牙断开、APP杀死中止OTA等)

无安全风险

成本

较低

较高

Warning

双备份方式的产品暂时不能通过OTA, 变成单备份OTA的产品。只能通过线刷方式, 才能改变OTA方式。

2. Boot Loader的作用

设备的最小系统, 提供BLE操作和实现OTA功能。用于单备份OTA的升级。同时保证设备OTA发生异常后, 不至于变砖, 还能通过升级恢复。
类似Windows系统的Dos操作系统。

Warning

Boot loader需要根据配置决定是否走认证流程。

3. 蓝牙已连接, 为什么OTA库返回错误, 4114, 0x1012, 设备未连接

OTA库回调的“设备未连接”的意思是OTA库没有初始化成功, 没有获取到设备信息。
如果发生上述情况,可以按照以下步骤排查:
1. 确认固件与OTA库的设备认证状态是否一致;
* 设备认证只在设备连接成功时进行,不能重复进行。
2. 确认是否有正确传入设备已连接状态到OTA库内。注意: 连接状态需要转换成 3.5.2 状态码
* 确保传入的设备状态正确, 不能重复传入相同的设备状态
3. 确认是否收到 3.4 蓝牙事件回调 # onConnection 回调的连接状态为 StateCode#CONNECTION_OK
* 保证OTA库初始完成才进行OTA库的接口操作

OTA库会在客户传入 设备已连接 状态进行RCSP协议初始化和同步设备信息等操作。

Warning

设备断开 也需要实时传入OTA库, 对相关设备的资源进行释放, 否则可能影响下一次的OTA库初始化。

4. OTA库设备认证失败

OTA库的设备认证动作发生在客户传入 设备已连接 状态并设置开启设备认证的条件。
如果发生上述情况,可以按照以下步骤排查:
1. 确保固件与OTA库的设备认证转态是否一致;
* 保证固件开设备认证, OTA库也是开设备认证, 反之, 亦然。
2. 确保通讯通道有效
* 保证有使能设备的UUID的通知属性
* 保证写入数据的设备UUID有效
3. 确保传入设备状态正确
* 保证设备状态不重复传入
* 设备认证只在设备连接成功时进行,不能重复进行。 如果设备已经过了认证,不会再响应认证数据。

5. 发送数据成功, 没有收到回复数据

OTA库的命令数据大多是采取一问一答的方式进行
如果发生上述情况,可以按照以下步骤排查:
1. 确保通讯通道有效
* 保证有使能设备的UUID的通知属性
* 保证写入数据的设备UUID有效
2. 确保发送数据完整
* BLE实现的话, 需要根据 MTU分包队列式发数, 具体参考下Demo的 SendBleDataThread

6. 升级失败,错误码: 16387, 0x4003, 升级文件错误

OTA过程中, 设备会校验数据。如果数据不全或者重复发相同数据, 会导致设备存储的数据错误。
如果发生上述情况,可以按照以下步骤排查:
1. 确保发送数据完整
* BLE实现的话, 需要根据 MTU分包队列式发数, 具体参考下Demo的 SendBleDataThread
2. 确保升级文件与固件程序相同
* 设备升级会校验程序是否相同, 如果不同芯片平台的SDK升级文件, 是不能互相升级的。
* 即使相同的固件程序,但是换了存储方式,例如: 4K对齐, 256对齐等, 都会导致不能通过OTA升级, 需要线刷后才能OTA升级。
3. 确保相同设备只有对应一个OTAManager初始化, 如果重复初始化OTAManager, 会对同一个设备进行重复发数。

Warning

此情况造成的原因较多, 如果以上步骤不能解决问题, 请联系对应SDK负责人进行询问。需要附带上打印日志。

7. 升级失败,错误码: 12295, 0x3007, 发送命令超时

OTA流程, 命令交互是采取一问一答的机制。
当SDK发送的命令在限定时间内没有得到回复, SDK会重复三次, 如果都没有得到回复, SDK会抛出“发送命令超时”的错误。
如果发生上述情况,可以按照以下步骤排查:
1. 确保通讯通道有效
* 保证有使能设备的UUID的通知属性
* 保证写入数据的设备UUID有效
2. 确保数据正确回传到OTA库
* 接收到的数据,通过 2.1.2.2 传递接收到的蓝牙数据 回传OTA库

Warning

OTA库会根据数据结构解析属于OTA流程的命令, 可以直接传入裸数据。

8. 升级失败,错误码: 12299, 0x300B, 等待命令超时

OTA过程中, 是设备不断向SDK端请求数据的过程。如果设备在OTA流程没结束的情况下, 超过20秒仍然没有请求下一包数据, OTA库就会报错。
如果发生上述情况,可以按照以下步骤排查
1. 确保发送数据完整
* BLE实现的话, 需要根据 MTU分包队列式发数, 具体参考下Demo的 SendBleDataThread
2. 确认设备收到SDK发送的数据
3. 确认是否设备端没有处理SDK发送的数据

Warning

这种情况, 需要先排除SDK端的问题, 然后由设备端查找问题。

9. 升级失败,错误码: 16392, 0x4008, 升级程序正在进行

重复调用 startOTA 接口, SDK会返回“升级程序正在进行”的错误

10. 升级失败,错误码: 16401, 0x4011, 回连设备超时

单备份OTA流程, 下载完Loader后, 设备需要重启并切换到loader系统。这就需要SDK进行回连设备流程。
SDK根据 BluetoothOTAConfigure # isUseReconnect 是否走自定义回连设备流程。SDK默认内置回连设备流程。
客户也可以设置走自定义回连设备流程。SDK都会在回连设备时通过 3.3 OTA流程回调 # onNeedReconnect 回调。
如果发生上述情况,可以按照以下步骤排查:
1. 确保蓝牙权限已授予
* 如果是Android 6+,需要申请 位置定位权限
* 如果是Android 12+, 需要申请 蓝牙扫描权限蓝牙连接权限
2. 确保设备端正常进入loader状态, 可以搜索到设备的广播包
3. 如果 3.3 OTA流程回调 # onNeedReconnect 回调设备使用新回连方式, 设备端会进行BLE地址变换
* 新回连方式根据特殊广播包进行变换地址确定,以下是新回连的广播包格式

Byte 0

Byte 1

Byte 2-3

Byte 4-8

Byte 9

Byte 10-15

长度

类型

VID

标识

版本号

Payload(原BLE地址)

0x??

0xFF

0xD605

ATOLJ

0x00

??:??:??:??:??:??

字段解析
* 长度 : 类型 + VID + 标识 + 版本号 + Payload 的长度
* 类型 : 固定0xFF, 厂商自定义数据
* VID : 芯片厂商ID, 默认是0xD605(小端), 表示”杰理科技”
* 标识 : 过滤标识, “ATOLJ”(小端), 表示”JLOTA”
* 版本号 : 0x00
* Payload : 有效数据, 根据 版本号 而改变

* 客户根据 3.3 OTA流程回调 # onNeedReconnect 回调的原BLE地址, 与广播包的原BLE地址一致对比, 如果是一致, 则该广播包的设备是需要回连的设备。

Warning

1. 广播包数据是小端存储, 解析时注意大小端转换。
2. 此情况造成的原因较多, 如果以上步骤不能解决问题, 请联系对应SDK负责人进行询问。需要附带上打印日志。

11. 可以同时使能两个Characteristic, 会有影响吗?

没有影响。

Warning

使能多个 Characteristic, 不能并发执行,需要队列式执行。等一个 Characteristic 使能结果回调,再执行下一个。

12. OTA升级的时候为什么有两次进度0-99的变化呢?

单备份OTA会有两个流程, 下载loader 和 升级固件。
3.3 OTA流程回调 # onProgress 回调type, 表示升级进度的类型。
- Type == 0, 下载loader
- Type == 1, 升级固件