文档中心与 JL_OTALib API 说明
本文档面向 iOS 开发者,完整说明 JL_OTALib.framework(杰理科技 OTA 升级库)的 API 体系与使用方式,涵盖 OTA 升级管理对象 JL_OTAManager、授权文件下载类 JLOTAFile、全部枚举/回调/属性/协议定义,以及从 BLE 握手、设备信息获取到固件传输与回连的端到端升级流程。
Purpose and Scope
本页是仓库 文档中心 中关于 JL_OTALib.framework 的权威参考页,内容基于仓库内 docs/JL_OTALib.framework API 说明.md 与框架公开头文件(JL_OTAManager.h、JLOTAFile.h、JLOtaReConnectOption.h、JLOtaCustom.h、jl_ufw.h)整理而成。
本页覆盖:
JL_OTAManager的初始化方式、类型定义(枚举)、属性、方法与回调协议;JLOTAFile基于授权 key/code 的固件文件下载机制;- OTA 升级的完整控制流(连接 → 查询特性 → 握手 → 传输 → 回连 → 重启);
- 失败模式、错误码语义、回连策略与扩展点。
以下相关内容属于兄弟页面/其他框架,本页仅作指向、不展开:
- BLE 连接核心库
JL_BLEKit.xcframework:负责设备扫描、连接与数据通道(见仓库根 README.md 中的框架目录结构); - 表盘处理库
JLDialUnit.xcframework、哈希配对库JL_HashPair、翻译传输功能(见 翻译传输功能说明.md); - SDK 测试工程
SDKTestHelper中的自定义命令使用说明(见 APP说明书.md 第 1.27 节 "OTA 库自定义命令(Otalib Custom Cmd)")。
Overview
什么是 JL_OTALib
JL_OTALib.framework 是杰理科技为 iOS 平台提供的 OTA(Over-The-Air)固件升级库。官方文档将其定位为"包含了 OTA 升级的所有 API,用于实现 OTA 升级的过程,包括 BLE 设备握手连接、获取设备信息、OTA 升级功能等"。仓库根目录将它与 JL_BLEKit(蓝牙连接核心库)、JLDialUnit(表盘处理库)并列为 SDK 框架栈中的独立组件:
├── JL_BLEKit.xcframework # 蓝牙连接核心库
├── JL_OTALib.xcframework # OTA 升级库
├── JLDialUnit.xcframework # 表盘处理库
Source: README.md
核心设计意图
- 单例管理升级过程:
JL_OTAManager通过getOTAManager提供全局唯一的升级管理对象,init已被标记为废弃,强制开发者走单例路径,避免多个升级状态机互相干扰。 - 回连策略内部化:
cmdUpgrade:Option:Result:接口"免去了公版 OTA 的外边回连策略,内部实现回连",即库内部自行处理设备从普通模式切换到 OTA 模式后的重连,并以Result回调替代 delegate 回调。 - 授权文件下载:
JLOTAFile使用授权key与code从杰理服务器下载升级文件,保证固件分发的安全性与可追溯性。 - 强状态反馈:
JL_OTAResult枚举以 0x00~0x11、0xe0~0xfe 的编码体系区分成功、进行中、需重连/重启、以及各类校验/硬件/协议失败,使上层 App 可以精确驱动 UI 状态机。
典型使用场景
- 蓝牙耳机/音箱固件升级(单备份、双备份
JL_Partition); - TWS 耳机升级(需检查
JL_OTAResultFailTWSDisconnect、充电仓状态JL_OTAResultFailNotInBin); - 手表资源升级(
JL_OtaWatch/JLOtaSourcesExtendMode资源升级模式); - BootLoader 下载(
JL_BootLoader); - 强制升级(
JL_OtaStatusForce、JL_OtaHeadsetYES)。
Architecture
flowchart TD
subgraph sg_App["iOS 应用层 (App)"]
App["开发者 App"]
end
subgraph sg_OTALib["JL_OTALib.framework"]
OTAManager["JL_OTAManager<br/>OTA 升级管理对象"]
OTAFile["JLOTAFile<br/>授权文件下载"]
ReConnect["JLOtaReConnectOption<br/>回连参数"]
Custom["JLOtaCustom<br/>自定义命令"]
UFW["jl_ufw<br/>固件格式解析"]
end
subgraph sg_BLE["蓝牙系统层"]
BLEKit["JL_BLEKit<br/>蓝牙连接核心库"]
CoreBluetooth["CoreBluetooth"]
end
subgraph sg_External["外部"]
Device["杰理蓝牙设备"]
Server["杰理 OTA 服务器"]
end
App -->|"import JL_OTALib"| OTAManager
App -->|"cmdGetOtaFileKey:Code:"| OTAFile
OTAFile -->|"HTTPS 下载"| Server
OTAManager -->|"发送/接收数据"| BLEKit
BLEKit --> CoreBluetooth
CoreBluetooth -->|"BLE 链路"| Device
OTAManager --> ReConnect
OTAManager --> Custom
OTAManager --> UFW
架构说明:
- JL_OTAManager 是升级流程的中枢:持有设备标识(
mBLE_UUID、mBLE_NAME、bleAddr)、设备能力(otaStatus、otaPartition、bootloaderType)、传输进度(只读otaLength/otaSent),并通过JL_OTAManagerDelegate把数据发送、特性结果、升级状态与进度回调给上层; - JLOTAFile 独立于升级流程之外,负责从杰理服务器按授权
key/code拉取固件文件,返回url/version/explain供下载使用; - JLOtaReConnectOption / JLOtaCustom / jl_ufw 是
JL_OTAManager的辅助模块:前者承载cmdUpgrade:Option:的回连参数,后者提供自定义指令通道与 UFW 固件格式解析能力; - JL_BLEKit + CoreBluetooth 构成数据通道:
JL_OTALib本身不直接操作 CoreBluetooth 的 GATT 细节,而是依赖JL_BLEKit完成设备连接,再通过noteEntityConnected/noteEntityDisconnected把连接状态"告知"OTA 库。
核心实现:JL_OTAManager
JL_OTAManager 是杰理科技开发的"专业 OTA 升级管理工具类",为开发者提供高效、安全的设备固件升级支持,通过丰富的功能接口和灵活的回调机制帮助开发者轻松实现设备升级管理(官方文档原述)。
单例与生命周期
/// 获取 OTA 升级对象
+ (JL_OTAManager *)getOTAManager;
/// 不建议使用自行初始化
/// 推荐获取 getOTAManager
- (instancetype)init __attribute__((deprecated("Please use getOTAManager instead.")));
Source: JL_OTAManager.h
设计意图:升级过程涉及跨多次 BLE 交互的状态机(握手、传输、回连),必须全局唯一,因此 init 被显式废弃,统一走 getOTAManager 单例。
类型定义:枚举体系
JL_OTAResult(升级结果,UInt16)
这是整个库最核心的错误/状态码枚举,头文件中以 NS_ENUM(UInt16, JL_OTAResult) 定义,官方文档给出了完整的语义表:
| 值(十六进制) | 枚举名 | 语义 |
|---|---|---|
| 0x00 | JL_OTAResultSuccess | OTA 升级成功 |
| 0x01 | JL_OTAResultFail | OTA 升级失败 |
| 0x02 | JL_OTAResultDataIsNull | OTA 升级数据为空 |
| 0x03 | JL_OTAResultCommandFail | OTA 指令失败 |
| 0x04 | JL_OTAResultSeekFail | OTA 标示偏移查找失败 |
| 0x05 | JL_OTAResultInfoFail | OTA 升级固件信息错误 |
| 0x06 | JL_OTAResultLowPower | OTA 升级设备电压低 |
| 0x07 | JL_OTAResultEnterFail | 未能进入 OTA 升级模式 |
| 0x08 | JL_OTAResultUpgrading | OTA 升级中 |
| 0x09 | JL_OTAResultReconnect | OTA 需重连设备(UUID 方式) |
| 0x0a | JL_OTAResultReboot | OTA 需设备重启 |
| 0x0b | JL_OTAResultPreparing | OTA 准备中 |
| 0x0f | JL_OTAResultPrepared | OTA 准备完成 |
| 0x10 | JL_OTAResultStatusIsUpdating | 设备已在升级中 |
| 0x11 | JL_OTAResultFailedConnectMore | 当前固件多台设备连接,请手动断开其他设备 |
| 0xe0 | JL_OTAResultFailSameSN | 升级数据校验失败,SN 多次重复 |
| 0xe1 | JL_OTAResultCancel | 升级取消 |
| 0xf1 | JL_OTAResultFailVerification | 升级数据校验失败 |
| 0xf2 | JL_OTAResultFailCompletely | 升级失败 |
| 0xf3 | JL_OTAResultFailKey | 升级数据校验失败,加密 Key 不对 |
| 0xf4 | JL_OTAResultFailErrorFile | 升级文件出错 |
| 0xf5 | JL_OTAResultFailUboot | Uboot 不匹配 |
| 0xf6 | JL_OTAResultFailLenght | 升级过程长度出错 |
| 0xf7 | JL_OTAResultFailFlash | 升级过程 Flash 读写失败 |
| 0xf8 | JL_OTAResultFailCmdTimeout | 升级过程指令超时 |
| 0xf9 | JL_OTAResultFailSameVersion | 相同版本 |
| 0xfa | JL_OTAResultFailTWSDisconnect | TWS 耳机未连接 |
| 0xfb | JL_OTAResultFailNotInBin | 耳机未在充电仓 |
| 0xfc | JL_OTAResultReconnectWithMacAddr | OTA 需重连设备(MAC 方式) |
| 0xfd | JL_OTAResultDisconnect | OTA 设备断开 |
| 0xfe | JL_OTAResultReconnectUpdateSource | OTA 需重连设备(更新资源) |
| — | JL_OTAResultUnknown | OTA 未知错误 |
头文件中的原始定义片段:
typedef NS_ENUM(UInt16, JL_OTAResult) {
/// OTA升级成功
JL_OTAResultSuccess = 0x00,
/// OTA升级失败
JL_OTAResultFail = 0x01,
/// OTA升级数据为空
JL_OTAResultDataIsNull = 0x02,
// ...(0x03 ~ 0xfb 见上表)
/// OTA需重连设备(更新资源)
JL_OTAResultReconnectUpdateSource = 0xfe,
/// OTA未知错误
JL_OTAResultUnknown
};
Source: JL_OTAManager.h
编码区间设计意图:0x00~0x11 为流程状态(成功/进行中/需重连/需重启/准备中),0xe0~0xe1 为数据/取消类,0xf1~0xfb 为校验与硬件类失败,0xfc~0xfe 为重连/断开类——上层 App 可根据区间快速决定 UI 分支(如 0x09/0xfc 触发重连流程、0x0a 提示用户重启设备、0x06 提示充电)。
其他配置型枚举
| 枚举 | 基类型 | 值 | 语义 |
|---|---|---|---|
JL_OTAReconnectType | UInt8 | JL_OTAReconnectTypeUUID = 0 | 回连使用 UUID 方式 |
JL_OTAReconnectTypeMACAddr = 1 | 回连使用 MAC 地址方式 | ||
JL_OtaStatus | UInt8 | JL_OtaStatusNormal = 0 / JL_OtaStatusForce = 1 | 正常升级 / 强制升级 |
JL_OtaHeadset | UInt8 | JL_OtaHeadsetNO = 0 / JL_OtaHeadsetYES = 1 | 耳机单备份正常/强制升级 |
JL_OtaWatch(已废弃) | UInt8 | JL_OtaWatchNO / YES | 手表资源正常/强制升级,由 JLOtaSourcesExtendMode 取代 |
JLOtaSourcesExtendMode | UInt8 | JLSourcesExtendModeDisable = 0 | 不启用资源升级模式 |
JLSourcesExtendModeNormal = 1 | 启用普通资源升级模式 | ||
JLSourcesExtendModeSourceOnly = 2 | 只升级资源 | ||
JLSourcesExtendModeFirmwareOnly = 3 | 只升级固件程序 | ||
JL_BootLoader | UInt8 | JL_BootLoaderNO = 0 / JL_BootLoaderYES = 1 | 是否需要下载 BootLoader |
JL_Partition | UInt8 | JL_PartitionSingle = 0 / JL_PartitionDouble = 1 | 固件单备份 / 双备份 |
Source: JL_OTAManager.h
属性一览
| 属性 | 类型 | 读写 | 描述 |
|---|---|---|---|
mBLE_UUID | NSString * | 读写 | 设备 UUID,需要开发者填入 |
mBLE_NAME | NSString * | 读写 | 设备名称,需要开发者填入 |
bleOnly | BOOL | 读写 | 是否仅支持 BLE |
bleAddr | NSString * | 读写 | 蓝牙地址 |
mCmdSN | uint8_t | 读写 | SN 值 |
version | uint16_t | 读写 | 设备版本号 |
versionFirmware | NSString * | 读写 | 设备版本信息 |
otaStatus | JL_OtaStatus | 读写 | OTA 状态(正常/强制) |
otaHeadset | JL_OtaHeadset | 读写 | 耳机升级模式 |
otaWatch | JL_OtaWatch | 读写 | 手表资源升级模式(已废弃,改用 otaSourceMode) |
isSupportReuseSpaceOTA | BOOL | 读写 | 是否支持复用空间进行 OTA |
isSupportExpand | BOOL | 读写 | 是否支持 OTA 拓展功能 |
otaSourceMode | JLOtaSourcesExtendMode | 读写 | 资源升级模式类型 |
otaPartition | JL_Partition | 读写 | 设备 OTA 时支持单/双备份 |
bootloaderType | JL_BootLoader | 读写 | 设备是否需要下载 Loader |
otaReconnectType | JL_OTAReconnectType | 读写 | OTA 升级回连方式(UUID/MAC) |
otaLength | int64_t | 只读 | OTA 升级内容大小(设备通知的) |
otaSent | uint32_t | 只读 | 已传输的数据大小 |
delegate | id<JL_OTAManagerDelegate> | 弱引用 | 设备交互回调代理 |
Source: JL_OTAManager.h
设计意图:mBLE_UUID/mBLE_NAME/bleAddr 是 OTA 回连时定位设备的输入参数,必须在连接阶段由开发者填充;otaLength/otaSent 只读,由库内部依据设备通知与传输计数维护,供进度条计算(progress = otaSent / otaLength)。
方法
设备操作
/// 当BLE连接上时告知SDK
- (void)noteEntityConnected;
/// 当BLE断开时告知SDK
- (void)noteEntityDisconnected;
/// 请求设备重启
- (void)cmdRebootDevice;
/// 强制请求设备重启
- (void)cmdRebootForceDevice;
noteEntityConnected / noteEntityDisconnected 是连接事件注入点:JL_OTALib 不主动扫描连接,而是由上层(基于 JL_BLEKit)在 BLE 连接/断开时通知 OTA 库,使其内部的回连与重连状态机得以推进。
OTA 操作
/// 发起 OTA 升级请求
- (void)cmdOTAData:(NSData *)data Result:(JL_OTA_RT __nullable)result;
/// 取消当前 OTA 升级流程
- (void)cmdOTACancelResult:(JL_OTA_RESULT __nullable)result;
/// 内部实现回连的升级接口(免去公版 OTA 的外边回连策略)
- (void)cmdUpgrade:(NSData *)data
Option:(JLOtaReConnectOption *_Nullable)option
Result:(JL_OTA_RT _Nonnull)result;
/// 检查当前 OTA 单备份是否正在回连
- (BOOL)cmdOtaIsRelinking;
Source: JL_OTAManager.h(方法名与回调类型见官方文档 docs/JL_OTALib.framework API 说明.md)
⚠️ 官方文档特别提示:使用 cmdUpgrade:Option:Result: 时不可使用 delegate 的回调信息,必须使用 Result 块回调,因为该接口内部已接管回连流程。
状态查询与调优
/// 查询设备支持的 OTA 特性(建议连接设备后第一时间调用)
- (void)cmdTargetFeature;
/// 查询设备系统状态(主要用于外置 Flash 场景)
- (void)cmdSystemFunction;
/// 打印 OTA 发送的数据内容
- (void)logSendData:(BOOL)status;
/// 设置最大丢包次数(default: 10)
- (void)maxLostCount:(int)count;
/// 设置超时时间(default: 5 秒)
- (void)cmdTimeOut:(int)timeOut;
回调协议 JL_OTAManagerDelegate
/// OTA 升级管理对象回调
@protocol JL_OTAManagerDelegate <NSObject>
/// 即将被发送的数据
/// @param data 数据内容
- (void)otaDataSend:(NSData *_Nonnull)data;
@optional
/// 回调设备状态信息
/// @param manager 对象状态
- (void)otaFeatureResult:(JL_OTAManager *_Nonnull)manager;
/// 回调升级状态以及进度等
/// @param result 状态以及进度信息
/// @param progress 进度信息
- (void)otaUpgradeResult:(JL_OTAResult)result Progress:(float)progress;
/// 取消OTA升级
- (void)otaCancel;
@end
Source: JL_OTAManager.h
otaDataSend 为 @required:上层必须实现,把即将发送的数据写入 BLE 通道;otaFeatureResult 在 cmdTargetFeature 查询完成后回调,此时可读取 manager 的 otaStatus/otaPartition/bootloaderType/otaSourceMode 等能力字段;otaUpgradeResult:Progress: 是升级全程的状态机驱动源。
回调类型
typedef void (^JL_OTA_RT)(JL_OTAResult result, float progress);
typedef void (^JL_OTA_RESULT)(uint8_t status, uint8_t sn, NSData *__nullable data);
Source: JL_OTAManager.h
JL_OTA_RT 携带 JL_OTAResult 与 0.0~1.0 的 progress,是 cmdOTAData:Result: / cmdUpgrade:Option:Result: 的进度回调;JL_OTA_RESULT 返回指令级 status/sn/data,用于 cmdOTACancelResult: 等指令确认场景。
核心流程:OTA 升级端到端控制流
sequenceDiagram
participant App as 开发者 App
participant Mgr as JL_OTAManager
participant BLE as JL_BLEKit / CoreBluetooth
participant Dev as 杰理设备
participant Svr as 杰理 OTA 服务器
App->>Svr: JLOTAFile cmdGetOtaFileKey:Code: 拉取固件
Svr-->>App: JL_OTA_URL(url, version, explain)
App->>Mgr: getOTAManager 获取单例
App->>Mgr: 填充 mBLE_UUID / mBLE_NAME / delegate
App->>BLE: 连接设备
BLE-->>App: 连接成功
App->>Mgr: noteEntityConnected
App->>Mgr: cmdTargetFeature 查询 OTA 特性
Mgr-->>App: otaFeatureResult 回调(读能力字段)
App->>Mgr: cmdUpgrade:data Option:Result: 发起升级
Mgr->>Dev: 握手 / 进入 OTA 模式
Dev-->>Mgr: JL_OTAResultPreparing / Prepared
Mgr->>Dev: 分包传输固件(otaDataSend 注入 BLE 通道)
Dev-->>Mgr: ACK + 传输计数
Mgr-->>App: otaUpgradeResult:Progress: 进度回调
alt 单备份需回连
Mgr-->>App: JL_OTAResultReconnect / ReconnectWithMacAddr
Mgr->>BLE: 按 UUID/MAC 回连设备
end
Mgr-->>App: JL_OTAResultSuccess
App->>Mgr: cmdRebootDevice 请求设备重启
流程要点:
- 授权取包:先通过
JLOTAFile的cmdGetOtaFileKey:Code:Result:从服务器换取固件下载地址(JL_OTA_URL回调返回url/version/explain); - 连接与告知:App 基于
JL_BLEKit建立 BLE 连接后,必须调用noteEntityConnected让 OTA 库感知连接就绪; - 特性查询:
cmdTargetFeature应在连接后第一时间调用,其otaFeatureResult回调会填充JL_OTAManager的能力属性(单/双备份、是否强制、是否需要 BootLoader、资源升级模式等),这些字段决定了后续传输策略; - 发起升级:
cmdUpgrade:Option:Result:(推荐)或cmdOTAData:Result:携带固件数据启动升级,库内部完成握手、进入 OTA 模式、状态机推进; - 传输与进度:库把待发送数据通过 delegate 的
otaDataSend:交还上层写入 BLE,同时用otaUpgradeResult:Progress:上报状态与 0~1 进度; - 回连处理:单备份设备在进入 OTA 模式后链路会断开,库按
otaReconnectType(UUID/MAC)自动回连,期间返回JL_OTAResultReconnect/JL_OTAResultReconnectWithMacAddr; - 收尾:升级成功后上层调用
cmdRebootDevice让设备重启进入新固件。
JLOTAFile:授权固件文件下载
JLOTAFile 是杰理科技提供的 OTA 文件管理类,主要用于支持 OTA 升级文件的下载和管理功能,通过简单的接口调用,开发者可以轻松获取固件文件并实现相关业务逻辑。
结果枚举
| 值 | 语义 |
|---|---|
JL_OTAUrlResultSuccess | OTA 文件获取成功 |
JL_OTAUrlResultFail | OTA 文件获取失败 |
JL_OTAUrlResultDownloadFail | OTA 文件下载失败 |
回调类型
typedef void(^JL_OTA_URL)(JL_OTAUrlResult result,
NSString* __nullable version,
NSString* __nullable url,
NSString* __nullable explain);
回调参数说明:
result:结果状态,对应JL_OTAUrlResult枚举值;version:文件版本信息,可能为空(nullable);url:下载链接地址,可能为空;explain:文件说明信息,可能为空。
文件下载方法
-(void)cmdGetOtaFileKey:(NSString*)key
Code:(NSString*)code
Result:(JL_OTA_URL __nullable)result
描述:根据授权 key 和 code,下载指定的 OTA 升级文件。
参数:
key:授权的密钥;code:授权码;result:下载结果回调,返回文件信息和状态。
设计意图:key/code 授权机制保证只有合法渠道(如与杰理签约的 App)才能获取固件包,url 与下载动作分离——JLOTAFile 只负责换取下载地址与元信息,实际的文件传输可由 App 使用任意下载框架完成,避免在库内重复实现下载器。
使用示例
以下示例均取自仓库内可验证的 API 定义与文档,展示典型接入代码结构。
示例 1:获取单例并配置设备信息
// 获取 OTA 升级管理对象(单例)
JL_OTAManager *otaManager = [JL_OTAManager getOTAManager];
// 填入设备信息(BLE 连接后从 JL_BLEKit 回调中获得)
otaManager.mBLE_UUID = deviceUUID; // 设备 UUID
otaManager.mBLE_NAME = deviceName; // 设备名称
otaManager.bleAddr = deviceAddr; // 蓝牙地址
otaManager.delegate = self; // 实现 JL_OTAManagerDelegate
otaManager.otaReconnectType = JL_OTAReconnectTypeUUID; // 回连方式
Source: JL_OTAManager.h(属性与方法定义);docs/JL_OTALib.framework API 说明.md
示例 2:实现升级回调协议
@interface ViewController () <JL_OTAManagerDelegate>
@end
// @required:即将发送的数据,写入 BLE 通道
- (void)otaDataSend:(NSData *)data {
// 通过 JL_BLEKit 的发送接口把 data 发往设备
[self.bleManager sendData:data];
}
// @optional:特性查询结果
- (void)otaFeatureResult:(JL_OTAManager *)manager {
// 读取 manager.otaStatus / otaPartition / bootloaderType 等能力
self.isForceUpdate = (manager.otaStatus == JL_OtaStatusForce);
}
// @optional:升级状态与进度
- (void)otaUpgradeResult:(JL_OTAResult)result Progress:(float)progress {
// 驱动 UI 进度条与状态文案
[self.progressView setProgress:progress animated:YES];
if (result == JL_OTAResultSuccess) {
[self showTip:@"升级成功,设备即将重启"];
}
}
// @optional:取消升级
- (void)otaCancel {
[self showTip:@"升级已取消"];
}
Source: JL_OTAManager.h
示例 3:发起升级(内部回连方式)
// 推荐方式:内部实现回连,使用 Result 回调而非 delegate
[otaManager cmdUpgrade:otaData
Option:nil // 或传入 JLOtaReConnectOption
Result:^(JL_OTAResult result, float progress) {
// 升级状态与进度统一在此回调处理
if (result == JL_OTAResultSuccess) {
// 成功后请求设备重启
[otaManager cmdRebootDevice];
} else if (result == JL_OTAResultFailCmdTimeout) {
// 指令超时处理
}
}];
示例 4:授权下载固件文件
JLOTAFile *otaFile = [[JLOTAFile alloc] init]; // 或按 SDK 方式获取实例
[otaFile cmdGetOtaFileKey:@"YOUR_AUTH_KEY"
Code:@"YOUR_AUTH_CODE"
Result:^(JL_OTAUrlResult result,
NSString *version,
NSString *url,
NSString *explain) {
if (result == JL_OTAUrlResultSuccess) {
// 使用 url 下载固件,version 可做版本比对
[self downloadFirmwareFromURL:url];
} else if (result == JL_OTAUrlResultDownloadFail) {
// 下载失败处理
}
}];
示例 5:连接事件注入与参数调优
// BLE 连接成功时告知 OTA 库
[otaManager noteEntityConnected];
// 连接后第一时间查询 OTA 特性
[otaManager cmdTargetFeature];
// 调优传输参数(默认值:超时 5 秒、最大丢包 10 次)
[otaManager cmdTimeOut:5];
[otaManager maxLostCount:10];
// 调试:打印 OTA 发送的数据内容
[otaManager logSendData:YES];
// BLE 断开时告知 OTA 库
[otaManager noteEntityDisconnected];
配置选项
JL_OTAManager 的配置通过公开属性与方法完成,无独立配置文件;以下为完整配置项清单:
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mBLE_UUID | NSString * | nil(必填) | 设备 UUID,回连定位设备用 |
mBLE_NAME | NSString * | nil(必填) | 设备名称 |
bleOnly | BOOL | NO | 是否仅支持 BLE 通道 |
bleAddr | NSString * | nil | 蓝牙地址,MAC 回连时使用 |
otaReconnectType | JL_OTAReconnectType | JL_OTAReconnectTypeUUID | 回连方式:UUID 或 MAC 地址 |
otaStatus | JL_OtaStatus | JL_OtaStatusNormal | 正常/强制升级(由特性查询填充) |
otaHeadset | JL_OtaHeadset | JL_OtaHeadsetNO | 耳机单备份是否强制升级 |
otaSourceMode | JLOtaSourcesExtendMode | JLSourcesExtendModeDisable | 资源升级模式(取代已废弃的 otaWatch) |
otaPartition | JL_Partition | JL_PartitionSingle | 固件单/双备份 |
bootloaderType | JL_BootLoader | JL_BootLoaderNO | 是否需要下载 BootLoader |
isSupportReuseSpaceOTA | BOOL | NO | 是否支持复用空间进行 OTA |
isSupportExpand | BOOL | NO | 是否支持 OTA 拓展功能 |
mCmdSN | uint8_t | 0 | SN 值 |
cmdTimeOut: | int | 5 | 指令超时时间(秒) |
maxLostCount: | int | 10 | 最大丢包次数 |
logSendData: | BOOL | NO | 是否打印 OTA 发送数据(调试用) |
Source: JL_OTAManager.h
API 参考
JL_OTAManager
+ (JL_OTAManager *)getOTAManager
获取 OTA 升级管理对象(单例)。init 已废弃,禁止自行初始化。
- 返回:全局唯一的
JL_OTAManager实例。
- (void)noteEntityConnected / - (void)noteEntityDisconnected
向 OTA 库注入 BLE 连接/断开事件,驱动内部回连状态机。
- (void)cmdTargetFeature
查询设备支持的 OTA 特性,建议连接设备后第一时间调用;结果经 otaFeatureResult: 回调返回。
- (void)cmdSystemFunction
查询设备系统状态,主要用于外置 Flash 场景。
- (void)cmdOTAData:(NSData *)data Result:(JL_OTA_RT __nullable)result
发起 OTA 升级请求。
- 参数
data:升级文件数据; - 参数
result:升级结果回调JL_OTA_RT(JL_OTAResult result, float progress)。
- (void)cmdUpgrade:(NSData *)data Option:(JLOtaReConnectOption *_Nullable)option Result:(JL_OTA_RT _Nonnull)result
内部实现回连的升级接口,免去公版 OTA 的外边回连策略。
- ⚠️ 使用此方法时不可使用 delegate 回调,必须使用
Result回调; - 参数
option:回连选项(JLOtaReConnectOption,可为 nil)。
- (void)cmdOTACancelResult:(JL_OTA_RESULT __nullable)result
取消当前 OTA 升级流程;完成时触发 otaCancel delegate 回调。
- (BOOL)cmdOtaIsRelinking
检查当前 OTA 单备份是否正在回连。
- 返回:正在回连返回 YES。
- (void)cmdRebootDevice / - (void)cmdRebootForceDevice
请求设备重启 / 强制请求设备重启(升级成功后的收尾动作)。
- (void)logSendData:(BOOL)status / - (void)maxLostCount:(int)count / - (void)cmdTimeOut:(int)timeOut
调试打印开关 / 设置最大丢包次数(默认 10)/ 设置指令超时(默认 5 秒)。
JLOTAFile
- (void)cmdGetOtaFileKey:(NSString *)key Code:(NSString *)code Result:(JL_OTA_URL __nullable)result
根据授权 key 与 code 获取 OTA 升级文件信息。
- 参数
key:授权密钥; - 参数
code:授权码; - 参数
result:JL_OTA_URL回调(result/version/url/explain); - 结果状态:
JL_OTAUrlResultSuccess/JL_OTAUrlResultFail/JL_OTAUrlResultDownloadFail。
回调协议 JL_OTAManagerDelegate
| 方法 | 必选/可选 | 触发时机 |
|---|---|---|
otaDataSend:(NSData *)data | 必选 | 每次有数据要发送到 BLE 通道时 |
otaFeatureResult:(JL_OTAManager *)manager | 可选 | cmdTargetFeature 查询完成 |
otaUpgradeResult:(JL_OTAResult)result Progress:(float)progress | 可选 | 升级全程状态与进度变化 |
otaCancel | 可选 | 升级被取消 |
失败模式、边界情况与并发
错误码驱动的失败处理
升级失败统一通过 JL_OTAResult 编码,常见分支建议:
- 低电量
JL_OTAResultLowPower:提示用户充电后重试(升级中设备断电会变砖风险最高); - 未能进入 OTA 模式
JL_OTAResultEnterFail/ 指令失败JL_OTAResultCommandFail:检查设备是否处于可升级状态、mBLE_UUID/mBLE_NAME是否填写正确; - 校验类失败
JL_OTAResultFailVerification/JL_OTAResultFailKey/JL_OTAResultFailErrorFile/JL_OTAResultFailSameSN:多为固件文件不匹配或授权问题,应重新获取固件; - 硬件类失败
JL_OTAResultFailFlash/JL_OTAResultFailUboot/JL_OTAResultFailLenght:设备侧异常,需联系固件团队; - TWS/充电仓约束
JL_OTAResultFailTWSDisconnect/JL_OTAResultFailNotInBin:耳机类设备升级前的环境约束检查失败; - 相同版本
JL_OTAResultFailSameVersion:应先比对version/versionFirmware再做升级。
重连边界
- 单备份设备升级需先断开再重连,库返回
JL_OTAResultReconnect(UUID)或JL_OTAResultReconnectWithMacAddr(MAC);otaReconnectType决定回连方式,MAC 方式依赖bleAddr已正确填充; cmdOtaIsRelinking可轮询回连状态,回连期间不应重复发起升级;JL_OTAResultFailedConnectMore表示当前固件同时连接了多台设备,必须由用户手动断开其他设备后再试——这是用户交互类错误,不能自动重试。
并发与线程注意
JL_OTAManager为单例,多个页面/业务同时持有引用时,升级状态机是共享的,应在 App 层做"仅一个升级会话"的互斥控制;- delegate 为
weak引用,持有 delegate 的对象(如 VC)必须在升级期间保持存活,否则回调静默丢失; otaDataSend:在库内部按传输节奏调用,上层写 BLE 通道时应保持顺序写入,避免并发写导致丢包(配合maxLostCount:重传机制兜底)。
性能与运维
- 传输性能:升级采用分包 + ACK + 重传机制,
maxLostCount:(默认 10)控制容忍丢包上限,cmdTimeOut:(默认 5 秒)控制单条指令超时;弱信号环境下可适当调大超时; - 进度观测:只读属性
otaLength/otaSent与otaUpgradeResult:Progress:回调提供双重进度来源,可交叉校验; - 调试手段:
logSendData:可打印发送内容,配合 SDKTestHelper 工程(APP说明书.md 第 1.27 节)中的自定义命令工具可定位协议层问题; - 升级安全:升级期间禁止断开 App/设备(杀进程、退后台被系统挂起)——OTA 传输基于 BLE 长连接,中断后需依赖库的重连机制恢复。
扩展点
- 自定义命令:
JLOtaCustom(头文件JLOtaCustom.h)提供 OTA 库自定义命令通道,可在标准升级流程之外向设备下发私有指令(详见 SDKTestHelper 文档第 1.27 节); - 资源升级模式:
JLOtaSourcesExtendMode支持"仅资源 / 仅固件 / 普通"三种扩展模式,配合isSupportExpand/isSupportReuseSpaceOTA适配不同设备的存储策略; - 回连定制:
JLOtaReConnectOption允许在cmdUpgrade:Option:中定制回连参数; - 固件格式解析:
jl_ufw.h提供 UFW 固件格式解析能力,可用于升级前校验固件头信息。
测试与示例工程
- 仓库根 README.md 说明了 SDK 框架栈组成,
JL_OTALib.xcframework同时提供ios-arm64(真机)与ios-arm64_x86_64-simulator(模拟器)切片; - code/SDKTestHelper/README.md 展示了测试工程内
JL_OTALib.xcframework的引用方式; - 翻译传输功能说明.md 展示了
import JL_OTALib的 Swift 集成方式及与JL_HashPair的联合使用; - APP说明书.md 第 1.27 节给出 OTA 库自定义命令的测试入口。
Related Links
- JL_OTALib.framework API 说明(官方 API 文档)
- JL_OTAManager.h(头文件)
- JLOTAFile.h(文件下载头文件)
- JLOtaReConnectOption.h(回连选项头文件)
- JLOtaCustom.h(自定义命令头文件)
- jl_ufw.h(UFW 固件格式头文件)
- 仓库根 README.md(框架结构总览)
- 翻译传输功能说明.md(JL_OTALib 与 JL_HashPair 联合使用)
- APP说明书.md(OTA 库自定义命令测试章节)
注:本页为文档中心内
JL_OTALib专属 API 页;蓝牙连接与扫描细节请参考 JL_BLEKit 相关文档,表盘与翻译功能请参考 JLDialUnit / JL_HashPair 相关页面。