Files
LPT26x-HSF-4MB-Hilink_14.2.…/ws63_check_json_analysis.md

440 lines
19 KiB
Markdown
Raw Normal View History

# WS63 Check.json 文件分析完整文档
## 概述
本文档详细分析了 `ws63-liteos-hilink-check.json` 文件的生成机制、校验内容和对应关系。该文件是WS63项目独立升级功能的核心组件用于验证HiLink固件与App-IoT固件之间的接口兼容性。
## 1. JSON文件基本信息
**文件路径**: `./output/ws63/acore/ws63-liteos-hilink/ws63-liteos-hilink-check.json`
**文件内容结构**:
```json
{
"ver": 1,
"app": "3A23309AAF0B692188B9C56755C084522354143382C5309A2D3258C3E6C834A500B53089C7A65C43392D51DFEF32BBC125B613C6B37656F59E142F0D713AD6115955749E72C53C3BA8CD96D2C69CB534231411DEAE5C4F1782DA2760BB04E0199813CAC4CBA339BEBF3D734FBF0955235DD160C0387CA4AD28BFC8766508F627D0B46BE48319EAC371921D27D806C9F3464BF4DFBAE09ADB95232386B021EEFBD3FAD2C6B405A1E9C13BB0420CAB5EF02D3D543090162EB8E51C2E1D10F3EE4EE5FE71A0BA8DF1E95E4A36694908DDB16E08F54B606E13CACB530F71320CC9DF6C3DCB70DC6E54BDA7B3C1720E7ECCB54E88950CFC3D4D700224AB40D9E568A89571387053E9BB3D77889DAA102DB1FC4CE38751F2E6A0BD27B0EC51B8EA015CE0E475ADF3E3CDB49580E84E228803A691F39D958D3F28B0E4D53C670A27B5AB436D11F83A8AAEB6538628D32F674C398B6CF1C295BAB9499E19EA993B11D07524E025EF6FF88F42331C3BE36689468DAF74C6B811187E2D7953251B9228B8A8C32422F97C0122332BB295C110F36291A845CD2FA2D6BC34E37B7CBE23083067AE8AF9346DEEEFCC168D2D4658A94AB5049858C11E8BE4672F492DE9B4046E4B0EEEA5E3D6FE8809743B2B6111718F2038742D7C48EE81BBD5D485373D34C70868622D3233179ADED3E8C5026A2217F6938E85AA7A6754CE869A8127656D364C00F05E95FE7738AD05E79CACA11368FAE6717C71C469FC934FF221953E9F7CA301D52266EA04E8184A6D5AF66621F90139D0642D0350FA3F28ED49CF23AC20D03710992FBE7E3DBCEBD737385AE906D8D885A6118F2416A45FFA93EC3483EDADE5864419C451689382274A6DEC6FD6734D3975199C9FFB561202FEAB34F195D595E791C43315669E430FB9E7288EF87BC4498A4DF1A93918FA7C7805F7131CCF092F762F28C0A502EC955661D19C624CD0B61E88F81F9D57108A971D268273CEABEE8013FF69661C1A29BBD995111C6A64314013FBA647F77B736AE8E330F3D7157E6C3774AFBCC38D643C7108363127CB03B902C6D32C202A73EE7099A65902A14959BA60D70D055A89A6C3E489489F355E418A02EF8A543D8DF826C59AD8FABD1564AF4FEE6224FCA67974F6F63E17D3036A50120E5449669A4D792E919F88C4BBEEC64E542216D35ED1DE5A21434FC521776D37F5C50257B639AA3F47D1CC1888A19961CD6F5D7C9BEF30D5EACE785DB24268E360581533F98458376DD1E770BF3612B6D1F9C62395F48BEDE23AE1514E24C79360CE44291140AFEC5576503E6EBBC1D453DC9ED772F6AA506112D26C5B806EC4E0EAEC6A98F6F1683AC86494FA565B7CE2A0540F45AC6A8A556CDEE96B315EF45ED456EF46F1E5C234ABF92B121CCE688D2163BDF57FB6098B4742FBC504AC5E03230ADF90428D53F024F9C20964CA8AEA8A9042D1CEF0A2BA9C88A011C1004A9B8F7F9EBEDA365056947E9426D868829904D70DA74B7276D93829D151333F3506E83032A8CF68630BD5D0A39237FDF0BADD131AB77B6092987F07139588081D140EB2A0CA25BF9267FBC809457528A7C5DFA1729552A8D76B3362B9915E84795CD770EB84A3AE73DE78F04D37E8FC2F53E2F72853D57F170FC2551F7CBBB9B63D119AC4775120418F3865792FEFAAFF69038BFD3AA3C2C476B26DFB2B48F3B3904203C394782FE1C40F718001C31504539827DDC80900966524DCE965006F86EBDA9C46226BC1DA2387E2AE9565DFEE621F0DA936298371D1AD83860B4E607BB473E4103ADF872D1A3CA9EB171CF73077B4AFC2D7FC3737FAE5337290D8116CE0826F347C621502BA313EEF20F1F67D00A7EB1BB555DE7B0FCDD05C747D7615136B35079DA4BF9A6EED5F0C5448B8364FB03476275BD823C8C7F3CBCC1D0BD41C5B49538D65C00C85F9C8D50201EDA6266D7A2A375141F7F5E69E1AD06932C3A6C044EAE908D43657EA22C5FA797FE8D04592541477B362753A05",
"hilink": "BEC62B3A1B90717BABD8C9AD15D3BE1560977111A022C59CEF399A97E8B1D1D2D981EE972F4C881D0D3D30D8165FA46BEB1F07B4B8F1AECEA4335DFC7388E1234641EDD1AF31DFEDB616EBF0A9900778C03C4467D3CBCD6540F51D66CBE0FF998506BA06448D8BEB6CDA8E9E79BE4C8BF15449A4DEFEB22F342B09F03683E17D699DA475D08A2F079EDA59B99A96CD0E468B089224120EE96B86A8BB4B250B35E0E8B8A1E77FE8A13F50CF8B018FA5A91475DDA932141DAF1F5C4D9C5D7F8DC8E3CB582D0DB0EA8823396BF6BC0A30D68B968BEE77AB6014036385A68BB35701D274404A9BFA24348E7321F63FEA98B7"
}
```
## 2. 文件生成机制
### 2.1 生成触发条件
**触发时机**: 在构建过程的 `build_post` 阶段(构建完成后)
**配置条件**: 编译配置中必须包含 `CONFIG_SUPPORT_HILINK_INDIE_UPGRADE`
- 当前项目状态:该配置**已被注释**config.py:334行
- 因此只有HiLink固件生成了check.jsonApp-IoT固件未生成
### 2.2 生成调用链
```
构建系统 (build.py)
build_post 钩子
entry.py:153 → dump_indie_upg_check_file()
indie_upgrade_utils.py:324 → 生成JSON文件
```
### 2.3 核心生成文件
**主要脚本文件**:
- `build/config/target_config/ws63/script/entry.py:153` - 构建钩子调用点
- `build/script/utils/indie_upgrade_utils.py:324` - JSON文件生成函数
- `build/script/utils/indie_upgrade_utils.py:292-320` - 接口校验码生成核心逻辑
## 3. 校验内容详解
### 3.1 JSON字段含义
| 字段 | 含义 | 数据格式 |
|------|------|----------|
| `ver` | 校验文件版本号 | 整数当前为1 |
| `app` | App侧接口校验码串联 | CRC32十六进制字符串 |
| `hilink` | HiLink侧接口校验码串联 | CRC32十六进制字符串 |
### 3.2 校验码生成原理
1. **接口函数扫描**: 通过正则表达式扫描源文件中的函数原型
```python
rgl = r"((?:const )?(?:unsigned )?(?:struct )?(?:enum )?\w+[ \*]*)" + \
r"(\w+)[\s\n]*" + \
r"(\()" + \
r"([\s\*,\w\[\]]*?)" + \
r"(\))" + \
r"\s*\{"
```
2. **原型标准化**: 去除参数名,保留参数类型,生成标准化函数原型字符串
3. **CRC32计算**: 对每个函数原型字符串计算CRC32校验码
```python
checksum = "{:08X}".format(zlib.crc32(prototype.encode("utf8")))
```
4. **校验码串联**: 将所有接口的8位十六进制CRC32码按顺序串联
### 3.3 校验码对应的编译文件
| JSON字段 | 编译目标 | 二进制文件 | 签名文件 |
|----------|----------|------------|----------|
| `"app"` | `ws63-liteos-app-iot` | `output/ws63/acore/ws63-liteos-app-iot/ws63-liteos-app-iot.bin` | `ws63-liteos-app-iot-sign.bin` |
| `"hilink"` | `ws63-liteos-hilink` | `output/ws63/acore/ws63-liteos-hilink/ws63-liteos-hilink.bin` | `ws63-liteos-hilink-sign.bin` |
## 4. 接口映射文件体系
### 4.1 App侧接口配置
**源文件路径**: `application/samples/wifi/hilink_indie_upgrade/address_mapping/hilinksdk/app_uapi/`
**主要接口文件**:
- `uapi_hilink_kv_adapter.c` - KV存储适配器接口
- `uapi_hilink_mem_adapter.c` - 内存管理适配器接口
- `uapi_hilink_socket_adapter.c` - Socket网络适配器接口
- `uapi_hilink_stdio_adapter.c` - 标准IO适配器接口
- `uapi_hilink_thread_adapter.c` - 线程管理适配器接口
- `uapi_hilink_time_adapter.c` - 时间管理适配器接口
- `uapi_hilink_network_adapter.c` - 网络适配器接口
- `uapi_hilink_device.c` - 设备管理接口
- `uapi_hichain.c` - 设备认证接口
- `uapi_hilink_ble_adapter.c` - BLE适配器接口
- 等共52个接口适配文件
**生成的映射表**: `application/samples/wifi/hilink_indie_upgrade/address_mapping/application/app_function_mapping.c`
### 4.2 HiLink侧接口配置
**源文件路径**: `application/samples/wifi/hilink_indie_upgrade/address_mapping/application/hilink_uapi/`
**主要接口文件**:
- `uapi_hilink.c` - HiLink核心接口
- `uapi_hilink_log_manage.c` - 日志管理接口
- `uapi_hilink_device_ext.c` - 设备扩展接口
- `uapi_ble_cfg_net_api.c` - BLE配网接口
- `uapi_hilink_bt_function.c` - 蓝牙功能接口
- `uapi_hilink_network_adapter.c` - 网络适配器接口
- `uapi_hilink_socket_adapter.c` - Socket适配器接口
- `uapi_hilink_custom.c` - 自定义功能接口
- `uapi_hilink_sle_api.c` - SLE接口
- `uapi_hilink_quick_netcfg_api.c` - 快速配网接口
**生成的映射表**: `application/samples/wifi/hilink_indie_upgrade/address_mapping/hilinksdk/hilink_function_mapping.c`
### 4.3 接口头文件映射
**App侧头文件路径**:
- `application/samples/wifi/ohos_connect/hilink_adapt/adapter/include/` - 适配器接口声明
- `application/samples/wifi/ohos_connect/hilink_adapt/product/` - 产品相关接口
- `application/samples/wifi/ohos_connect/hilink_adapt/include/` - 通用接口声明
- `open_source/deviceauth/interfaces/innerkits/deviceauth_lite/` - 设备认证接口
- `kernel/liteos/liteos_v208.5.0/Huawei_LiteOS/open_source/CMSIS/CMSIS/RTOS2/Include/` - RTOS接口
- `open_source/cjson/cjson/` - JSON库接口
- `open_source/mbedtls/mbedtls_v3.1.0/include/` - 加密库接口
**HiLink侧头文件路径**:
- `application/samples/wifi/ohos_connect/hilink_adapt/include/` - HiLink核心接口声明
- `application/samples/wifi/ohos_connect/hilink_adapt/product/` - 产品相关接口
- `application/samples/wifi/ohos_connect/hilink_adapt/adapter/include/` - 适配器接口声明
## 5. 校验机制详解
### 5.1 接口兼容性检查函数
**函数位置**: `build/script/utils/indie_upgrade_utils.py:353-370`
**检查逻辑**:
```python
def check_indie_upg_match(hilink_check_file, app_check_file):
# 读取两个check.json文件
f = open(hilink_check_file, "r", encoding="utf-8")
hilink_check = json.loads(f.read())
f.close()
f = open(app_check_file, "r", encoding="utf-8")
app_check = json.loads(f.read())
f.close()
# 版本号检查
if hilink_check["ver"] != 1 or app_check["ver"] != 1:
print("check file ver[h:%d,a:%d] not match" % (hilink_check["ver"], app_check["ver"]))
return False
# HiLink侧接口向后兼容检查
if not hilink_check["hilink"].startswith(app_check["hilink"]):
prt_not_match_info("hilink", hilink_check["hilink"], app_check["hilink"], True)
return False
# App侧接口向后兼容检查
if not app_check["app"].startswith(hilink_check["app"]):
prt_not_match_info("app", app_check["app"], hilink_check["app"], True)
return False
return True
```
### 5.2 校验失败信息输出
**函数位置**: `indie_upgrade_utils.py:330-350`
校验失败时会输出具体的不匹配接口信息:
- 显示接口序号和对应的CRC32校验码
- 帮助定位具体是哪个接口发生了变更
- 每个CRC32码长度为8个十六进制字符
### 5.3 升级包构建时的校验
**调用位置**: `build/config/target_config/ws63/build_ws63_update.py:74`
```python
if not check_indie_upg_match(info.hilink_check, info.app_iot_check):
print("indie upg hilink and app not match")
return False
```
在生成升级包时会自动进行兼容性检查,如果接口不兼容,构建过程会失败。
## 6. 独立升级工作流程
### 6.1 独立升级概述
独立升级允许在不更新App-IoT固件的情况下单独升级HiLink SDK固件。这种机制可以
- 快速修复HiLink SDK的bug
- 更新云端协议和功能
- 减少升级包大小和升级时间
- 降低升级风险
### 6.2 配置开启流程
根据 `indie_upg.md` 文档,开启独立升级需要:
1. **修改配置** (`build/config/target_config/ws63/config.py`):
- 删除 `'liteos_kconfig': 'ws63_iot'`
-`'defines'` 中增加 `CONFIG_SUPPORT_HILINK_INDIE_UPGRADE`
-`'ram_component'` 中增加 `'app_addr_map'`
-`'ram_component'` 中删除 `'hilinkdevicesdk'``'hilinkota'``'hilinkbtsdk'``'hilinkquickcfg'`
2. **分别编译两个固件**:
```bash
# 先编译HiLink固件
python3 build.py -c ws63-liteos-hilink
# 再编译App-IoT固件
python3 build.py -c ws63-liteos-app-iot
# 生成升级包
python3 build/config/target_config/ws63/build_ws63_update.py --pkt=app_iot
```
3. **使用简化编译工具**:
```bash
# 完整编译
python3 indie_build.py all
# 仅编译SDK用于独立升级
python3 indie_build.py sdk
```
### 6.3 独立升级流程
1. **准备已认证的App-IoT固件**:
- `ws63-liteos-app-iot-sign.bin`
- `ws63-liteos-app-iot-check.json`
2. **更新HiLink SDK库文件**:
- 替换 `application/samples/wifi/libhilink/` 中的库文件
3. **执行独立编译**:
```bash
python3 indie_build.py sdk
```
4. **接口兼容性校验**:
- 自动比较新HiLink固件与已认证App-IoT固件的接口
- 如果接口不匹配,构建失败
- 校验通过后生成完整升级包
### 6.4 约束条件
1. **分区兼容性**: 非独立升级版本与独立升级版本不可交叉升级
2. **接口兼容性**: 模组App程序不变时HiLink接口不能发生变更
3. **版本号格式**:
- 非独立升级:`1.0.0`
- 独立升级:`1.0.0_14.2.0.304` (拼接SDK版本号)
## 7. 新增接口适配指南
### 7.1 接口调用机制
独立升级模式下模组App和HiLink分别编译成两个固件
- 各自维护接口地址表
- 通过查表机制获取对方接口函数指针
- 实现跨固件的函数调用
### 7.2 新增HiLink接口步骤
**示例接口原型**:
```c
retType TestFuncName(type1 param1, type2 param2, type3 param3);
```
1. **接口声明** (`application/samples/wifi/ohos_connect/hilink_adapt/include/hilink_test.h`):
```c
retType TestFuncName(type1 param1, type2 param2, type3 param3);
```
2. **查表适配实现** (`application/samples/wifi/hilink_indie_upgrade/address_mapping/application/hilink_uapi/uapi_hilink_test.c`):
```c
retType TestFuncName(type1 param1, type2 param2, type3 param3)
{
hilink_call3(HILINK_CALL_TEST_FUNC_NAME, TestFuncName, retType, type1, param1, type2, param2, type3, param3);
return (retType)0;
}
```
3. **添加到编译系统** (`application/samples/wifi/hilink_indie_upgrade/address_mapping/application/CMakeLists.txt`):
```cmake
uapi_hilink_test.c
```
4. **配置脚本识别** (`build/script/utils/indie_upgrade_utils.py`):
```python
default_config["hilink"]["src_file"] += ("uapi_hilink_test.c",)
default_config["hilink"]["mapping_header"]["application/samples/wifi/ohos_connect/hilink_adapt/include/"] += ("hilink_test.h",)
```
5. **白名单配置**(可选):
```python
default_config["hilink"]["white_list"] += ("TestFuncName",)
```
### 7.3 宏说明
**查表宏定义**:
- `hilink_call0` / `hilink_call0_ret_void` - 无参数函数
- `hilink_call1` / `hilink_call1_ret_void` - 1个参数函数
- `hilink_call2` / `hilink_call2_ret_void` - 2个参数函数
- `hilink_call3` / `hilink_call3_ret_void` - 3个参数函数
- `hilink_callx` / `hilink_callx_ret_void` - x个参数函数
**参数说明**:
1. 枚举值(如 `HILINK_CALL_TEST_FUNC_NAME`
2. 函数名
3. 返回值类型
4. 参数类型和参数名交替列出
## 8. 相关文件清单
### 8.1 核心脚本文件
| 文件路径 | 功能描述 |
|----------|----------|
| `build/script/utils/indie_upgrade_utils.py` | 独立升级工具核心逻辑 |
| `build/config/target_config/ws63/script/entry.py` | 构建钩子入口 |
| `build/config/target_config/ws63/build_ws63_update.py` | 升级包构建脚本 |
| `build/config/target_config/ws63/config.py` | 编译配置文件 |
| `indie_build.py` | 独立升级编译工具 |
| `package.py` | 升级包生成工具 |
### 8.2 接口映射相关文件
| 目录/文件 | 描述 |
|-----------|------|
| `application/samples/wifi/hilink_indie_upgrade/address_mapping/` | 接口映射根目录 |
| `application/samples/wifi/hilink_indie_upgrade/address_mapping/include/func_call_list.h` | 函数调用枚举定义(自动生成) |
| `application/samples/wifi/hilink_indie_upgrade/address_mapping/application/` | App侧接口适配 |
| `application/samples/wifi/hilink_indie_upgrade/address_mapping/hilinksdk/` | HiLink侧接口适配 |
| `application/samples/wifi/ohos_connect/hilink_adapt/` | 接口声明头文件目录 |
### 8.3 输出文件
| 文件路径 | 描述 |
|----------|------|
| `output/ws63/acore/ws63-liteos-hilink/ws63-liteos-hilink-check.json` | HiLink固件接口校验文件 |
| `output/ws63/acore/ws63-liteos-app-iot/ws63-liteos-app-iot-check.json` | App-IoT固件接口校验文件需开启独立升级 |
| `output/ws63/acore/ws63-liteos-hilink/ws63-liteos-hilink.bin` | HiLink固件二进制文件 |
| `output/ws63/acore/ws63-liteos-hilink/ws63-liteos-hilink-sign.bin` | HiLink固件签名文件 |
| `output/ws63/acore/ws63-liteos-app-iot/ws63-liteos-app-iot.bin` | App-IoT固件二进制文件 |
| `output/ws63/acore/ws63-liteos-app-iot/ws63-liteos-app-iot-sign.bin` | App-IoT固件签名文件 |
| `output/ws63/fwpkg/ws63-liteos-app-iot/ws63-liteos-app-iot_all.fwpkg` | 完整烧录包 |
| `output/ws63/upgrade/update.fwpkg` | 升级包 |
| `output/ws63/ws63-liteos_all.zip` | 完整产物压缩包 |
## 9. 当前项目状态
### 9.1 独立升级配置状态
**当前状态**: 独立升级功能**已关闭**
**证据**:
- `config.py:334` 行:`"CONFIG_SUPPORT_HILINK_INDIE_UPGRADE"` 被注释
- `config.py:291` 行:`'liteos_kconfig': 'ws63_iot'` 仍然存在
- 只有HiLink固件生成了check.json文件
- App-IoT固件目录下没有对应的check.json文件
### 9.2 编译产物状态
**已生成的文件**:
-`ws63-liteos-hilink.bin` (278K)
-`ws63-liteos-hilink-sign.bin` (279K)
-`ws63-liteos-hilink-check.json` (3.4K)
-`ws63-liteos-app-iot.bin` (1.7M)
-`ws63-liteos-app-iot-sign.bin` (1.7M)
-`ws63-liteos-app-iot-check.json` (未生成,因为独立升级未开启)
## 10. 故障排查指南
### 10.1 check.json文件未生成
**可能原因**:
1. `CONFIG_SUPPORT_HILINK_INDIE_UPGRADE` 未在配置中启用
2. 构建过程中 `build_post` 钩子未执行
3. 接口映射文件生成失败
**排查步骤**:
1. 检查 `config.py` 中的配置项
2. 查看构建日志中是否有 "create indie upg mapping files succ" 消息
3. 检查接口源文件和头文件是否存在语法错误
### 10.2 接口兼容性校验失败
**错误信息示例**:
```
indie upg hilink and app not match
hilink checksum not match
func 5 [A1B2C3D4:E5F6A7B8] not match
```
**排查步骤**:
1. 确定是哪个接口发生了变更根据func序号
2. 检查接口原型是否发生改变
3. 检查参数类型、顺序、返回值类型
4. 如果是合理的接口升级需要重新生成App-IoT的check.json
### 10.3 接口映射表生成失败
**可能原因**:
1. 源文件中函数原型格式不规范
2. 头文件中接口声明与源文件实现不匹配
3. 正则表达式匹配失败
**排查步骤**:
1. 检查函数原型是否符合标准C语法
2. 确保头文件声明与源文件实现一致
3. 查看构建日志中的正则匹配错误信息
## 11. 总结
`ws63-liteos-hilink-check.json` 文件是WS63项目独立升级功能的核心组件通过CRC32校验码机制确保固件间接口兼容性。虽然当前项目未启用独立升级功能但完整的技术框架已经就绪可以通过简单的配置修改来启用该功能。
该机制的核心价值在于:
- **风险控制**: 通过接口校验防止不兼容升级
- **灵活部署**: 支持HiLink SDK的独立快速升级
- **开发效率**: 减少完整固件的编译和测试周期
- **维护便利**: 清晰的接口约定和自动化校验流程
---
**文档创建时间**: 2025-09-10
**项目版本**: SR_Light_Hilink_14.2.1.312_20250714
**分析对象**: output/ws63/acore/ws63-liteos-hilink/ws63-liteos-hilink-check.json