# 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.json,App-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