EMS 知识库
首页 / knowledge/代码解析/common

json.h

源文件路径:common/json.h 所属模块:common(通用工具库) 代码行数:23

1. 文件职责

本文件是 common/json.c 的对外头文件,只做两件事:一是用两个宏定义 JSON 报文的长度基准,二是声明 5 个 JSON 取值函数供全工程使用。它处在 EMS 数据流的最外圈——任何需要从云端/上位机下发 JSON 里抠字段的模块(net/server.c、midware/interface/modbus/modbus.c、midware/ethernt/wireless/wireless_driver.c)都要先 #include "json.h"。文件本身没有可执行代码、没有全局变量,不参与任何任务调度。注意它与 json.c 之间存在一处不一致:json.c:99 定义的 json_check_value() 并没有在这里声明。

2. 关键数据结构与宏

名称类型(结构体/枚举/宏/联合体)说明
__JSON_H__宏(include guard)头文件防重包含开关,json.h:9-10
LEN_REQ_FILE宏json.h:13,值 1024。注释与命名暗示它是「单次请求文件长度」,在 net/server.c 的固件升级流程中被复用为报文长度基准
MAX_LEN_JSON_CONNENT宏json.h:14,值 LEN_REQ_FILE * 2 = 2048。json.c 中三个取值函数把键值长度的第一道上限卡在这个值上(json.c:74、json.c:142、json.c:209)

本文件不定义结构体、枚举或联合体。

3. 函数清单

本文件是头文件,不含函数定义,仅含 5 个函数原型声明:

函数名作用域(static/全局)说明(一句话)
json_check全局(声明,json.h:17)以首尾大括号判断字符串是否为一个 JSON 对象
json_get_value全局(声明,json.h:18)提取 "key":"value" 形式(值带双引号)的字符串字段
json_get_value_check_len_input全局(声明,json.h:19)同上,但多带一个 len_in_MAX 做目的缓冲长度保护
json_get_int_len_input全局(声明,json.h:20)提取 "key":value 形式(值无引号)的数值字段,带 len_in_MAX 保护
json_get_time_value_from_fw_temp全局(声明,json.h:21)按 'Y'/'M'/'D'/'H'/'F'/'S' 从时间字符串中拆出对应分量,返回 s8

未在头文件声明的实现:json_check_value(实现见 common/json.c:99)。这是一处头文件与实现不同步的遗留。

4. 核心逻辑解析

本文件无逻辑代码,此处说明两个宏在调用链上的实际作用:

与任务/调度的配合

无。头文件不参与 uCOS-II 任务、信号量、消息邮箱的定义或使用。

5. 对外接口

导出(供外部调用)

符号类型使用者
LEN_REQ_FILE宏间接通过 MAX_LEN_JSON_CONNENT 使用;工程内无直接引用
MAX_LEN_JSON_CONNENT宏common/json.c(json.c:74、json.c:142、json.c:209)
json_check函数原型net/server.c:2615, 3442, 3684
json_get_value函数原型net/server.c(约 250 处)、midware/interface/modbus/modbus.c:8632, 8645, 8658、midware/ethernt/wireless/wireless_driver.c:99
json_get_value_check_len_input函数原型无调用点
json_get_int_len_input函数原型无调用点
json_get_time_value_from_fw_temp函数原型net/server.c:2715-2720

本文件不导出任何全局变量。

被本文件调用(外部依赖)

本文件只引用类型别名 s8(json.h:21 原型返回类型),该类型由包含链上游的 includes.h / chip.h 提供。因此 json.h 必须在使用方已经包含平台类型头之后才能编译通过,它自身没有 #include。

6. 依赖关系

7. 备注与风险点

  1. 头文件缺少 #include:json.h:21 的原型用了 s8,但文件里没有任何 #include。这迫使每个使用方必须先包含 includes.h(或 chip.h),包含顺序稍有变化即编译报错,属脆弱设计。
  2. 实现与声明不同步:json_check_value(common/json.c:99)未在本文件声明,其他模块无法通过正规途径调用它;若将来有人手工写 extern 声明使用,会出现「有实现无契约」的隐患。
  3. LEN_REQ_FILE 命名与用途不符:宏名描述的是「请求文件长度」,但 json.h 里实际只用它推导 JSON 内容长度上限。若日后固件升级报文长度基准调整,会连带改变本轮 JSON 取值的长度上限,属隐式耦合。
  4. json_get_value 缺少长度参数:本文件提供的两个带保护变体(json_get_value_check_len_input / json_get_int_len_input)在工程内零调用,而唯一被大量使用的 json_get_value 没有任何目的缓冲长度参数。这表明「加长度保护」的重构做了一半就停下来了,历史遗留代码仍走不安全路径。
  5. MAX_LEN_JSON_CONNENT 拼写:CONNENT 应为 CONTENT,属长期未修正的拼写错误,改名会牵动 json.c 三处引用。
  6. 其余:暂无。