当前位置: 首页 > news >正文

gRPC Profile

背景:
硬件测试平台需要把 JSON 格式的 TIB2/TIB3 配置通过 gRPC 下发到服务端。旧脚本只能识别 TIB2,且 CLI 参数写死,用户大喊「TIB3 还是没有!」——于是有了这次重构。


1. 需求一句话

  1. CLI 从 3 个参数减到 2 个:profile 路径 + 服务器地址(去掉 hw_target,自动加载全部配置)。
  2. 一份 JSON 里同时支持 TIB2/TIB3,空配置不再发空请求
  3. 所有枚举(波特率、电压、启动模式)必须自动映射到 Protobuf 定义,不能硬编码

2. 文件地图

文件 作用
profile_client.py 核心逻辑:读 JSON → 构造 SetProfileRequest → 发 gRPC
load_profile.py CLI 入口,调 profile_client
proto_python/*_pb2.py protoc 生成的消息/枚举定义,只读
Raptor2.*.json 真实嵌套配置(含注释)
test 期望的 gRPC 文本格式,用于 diff 验证

3. JSON → Protobuf 的「万能翻译器」

核心函数 _get_proto_enum_string 做了 4 层回退:

回退层级 举例 输出
① 特殊字典 "115200"BAUD_115200 UART_BAUDRATE_BAUD_115200
② 全大/小写 "NONE"NONE UART_PARITY_NONE
③ 驼峰转蛇形 "EnterDutBootModeInternal"ENTER_DUT_BOOT_MODE_INTERNAL BOOT_MODE_SELECTION_ENTER_DUT_BOOT_MODE_INTERNAL
④ 后缀模糊 "TX" 命中 UART_PARITY_TX 直接返回

代码片段(已折叠重复):

def _get_proto_enum_string(self, json_value, enum_type_name, enum_keys):special_maps = {"UartBaudrate": {"115200": "BAUD_115200", ...},"IOVoltageLevel": {"V3P3": "V_3P3"},...}...# 1. 特殊映射if enum_type_name in special_maps and json_value in special_maps[enum_type_name]:snake_json_value = special_maps[enum_type_name][json_value]else:# 2. 通用驼峰→蛇形snake_json_value = self._pascal_to_snake(json_value)# 3. 类型前缀特殊处理:UartDataBits → UART_DATABITSif enum_type_name.startswith("Uart"):snake_enum_type = "UART_" + enum_type_name[4:].upper()else:snake_enum_type = self._pascal_to_snake(enum_type_name)full_name = f"{snake_enum_type}_{snake_json_value}"if full_name in enum_keys:          # 4. 第一次命中return full_nameif snake_json_value in enum_keys:   # 5. 无前缀再试return snake_json_valuefor k in enum_keys:                 # 6. 后缀模糊if k.endswith(f"_{snake_json_value}"):return kreturn f"{snake_enum_type}_UNSPECIFIED"

4. 嵌套 JSON 导航

真实文件结构:

{"TestInterfaceConfiguration": {"AIR1672": {          // ← profile_group"TIB2": { ... },    // ← hw_target"TIB3": { ... }}}
}

代码用 next(iter(...)) 一把拿到 AIR1672,再 for hw_target, profile_details in profile_group.items() 遍历,再也不用手动指定 hw_target


5. Protobuf 重复字段的正确姿势

错误写法 正确写法
one_profile.boot_modes.add() one_profile.boot_mode_config.boot_mode_configs.add()
uart_config = one_profile.uart_configuration uart_config = one_profile.uart_configuration.data.add()

踩坑:一开始把 boot_mode_config 当成普通字段,结果 AttributeError: boot_modes;用 dir() 现场侦查才发现 boot_mode_config 本身就是 BootModeConfigurations(repeated)。


6. 最终 CLI 体验

python load_profile.py \--profile_path Raptor2.TestInterface.AIR1672.Configuration.json \--server localhost:50051

日志:

INFO  Building profile for HW target 'TIB2'
INFO  Building profile for HW target 'TIB3'
INFO  Successfully set profile.

服务端收到完整请求,与 test 文件 diff 零差异


7. 小结

  • 枚举映射用 4 层回退,再也不怕 JSON 写法不统一。
  • 嵌套结构next(iter()) 自动导航,新增硬件目标零代码改动。
  • repeated 字段记得 .add(),现场 dir() 比盲猜快 10 倍。
  • 注释 JSONre.sub(r"//.*", "", ...)json.loads,优雅兼容带注释的配置。

8. 彩蛋:正则拆解 _pascal_to_snake

def _pascal_to_snake(self, name):# EnterDutBootModeInternal → ENTER_DUT_BOOT_MODE_INTERNALs1 = re.sub(r'(.)([A-Z][a-z]+)', r'\1_\2', name)return re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', s1).upper()
  1. ([A-Z][a-z]+) 匹配大写开头后面跟小写的单词,如 DutBootMode
  2. ([a-z0-9])([A-Z]) 把数字或小写后跟大写的地方加下划线,如 eInternale_Internal
    两步搞定,零第三方依赖

现在,TIB3 真的有了。

http://www.jsqmd.com/news/439495/

相关文章:

  • 2026年别墅酒窖定制费用大揭秘,哪家性价比高看这里 - myqiye
  • 想知道2026年优考教育靠不靠谱,看详细评测就清楚 - mypinpai
  • 讲讲郑州派轩装饰全屋定制,选购指南与价格揭秘 - 工业推荐榜
  • 2026年封阳门窗厂家实力推荐:佛山市安格尔门窗有限公司,系统门窗/隔音窗/侧压窗全系适配现代家居 - 品牌推荐官
  • 2026年AGV叉车厂家推荐:技术趋势与合规评测,涵盖锂电与汽车制造场景痛点 - 十大品牌推荐
  • 2026年上海靠谱的私人酒柜定制厂家推荐,专业酒柜定制多少钱? - myqiye
  • 人有的时候,得信命
  • 2026年3月550型模切机厂家最新推荐,中型机型实用耐用 - 品牌鉴赏师
  • 2026电竞酒店联营合作数据分析该怎么做靠谱吗 - 工业推荐榜
  • 学霸同款! 降AIGC平台 千笔·专业降AI率智能体 VS 云笔AI,专科生专属
  • 微算法科技(NASDAQ: MLGO)量子优化PoW:重构区块链共识的能效与公平新范式
  • 2026年3月武汉汉阳香奈儿包包回收门店最新推荐,隐私保护交易安全 - 品牌鉴赏师
  • 2026年3月海口密码锁维修安装公司推荐,专业服务与品牌保障口碑之选 - 品牌鉴赏师
  • 用AI写代码,我差点把漏洞发上线:血泪总结的10个教训
  • 深耕川渝十余载,这5家金属制品企业为何成为政企采购首选? - 深度智识库
  • 2026年教育部学信网可查的学历真的是全国通用吗,热门学校大揭秘 - 工业品网
  • 完整教程:Java编程进阶:智能仿真无人机项目3.0
  • 2026 实验室装修改造优选:西安迅领实验室 排风 / 实验台 / 通风柜全链服务实力解析 - 深度智识库
  • 2026年四川防腐木凉亭厂家推荐榜 耐用美观 适配私宅文旅 多需求适配参考 - 深度智识库
  • 2026年3月胶水分析公司最新推荐,粘接成分强度测试 - 品牌鉴赏师
  • 武商一卡通别浪费!轻松回收闲置福利 - 团团收购物卡回收
  • 十五年腐蚀测试实录:复合盐雾试验机选型,设备硬实力胜过供应商光环 - 品牌推荐大师
  • 新材料检测必备!2026介电常数介质损耗测试仪高性价比品牌推荐 - 品牌推荐大师1
  • 2026年3月双螺旋锥形混合机厂家推荐,专业制造与品牌保障口碑之选 - 品牌鉴赏师
  • 如何使用 MySQL 做数据统计:从入门到高阶实战
  • Avalonia 适配Win7
  • Flutter 三方库 login_client 的鸿蒙化适配指南 - 打造工业级安全登录、OAuth2 自动化鉴权、鸿蒙级身份守门员
  • ubuntu24.04 LTS 安装 riscv32 预编译工具链
  • 2026年3月胶水检测公司最新推荐,粘接强度成分解析 - 品牌鉴赏师
  • 伊犁民宿设计装修费用大概多少钱,新疆匠之初装饰设计收费合理吗? - mypinpai