blobmsg_parse解析字段发生错误

blobmsg_parse(mqtt_policy, NOT_POLICY_MAX, tb, blob_data(mqtt_buf.head), blob_len(mqtt_buf.head));

预期的正确输出:

如果解析成功,tb 数组应包含以下字段:

  • tb[MQTT_PATH] → 字符串 "/web-cqi/ubus-conf"
  • tb[MQTT_SEQUENCE] → 字符串 "191738000720581"
  • tb[MQTT_PARAMS] → 嵌套的表结构(key1, key2)
  • tb[MQTT_BODY] → 可选字段(如果有)

实际日志中的问题:

日志显示解析失败:

tb[MQTT_PATH]: (null) tb[MQTT_SEQUENCE]: (null) tb[MQTT_PARAMS]: (null)

说明 blobmsg_parse() 未能正确提取字段。


3. 数据处理流程对比

阶段

数据状态

可能的问题点

输入

原始 JSON 字符串(如

{"path":"/web-cqi/ubus-conf", ...}

1. 数据编码错误(如非 UTF-8)
2. 数据截断或损坏

解析后

tb

数组应为填充的字段(实际为

null

1. 字段名不匹配策略
2. 缓冲区未正确初始化


4. 根本原因分析

可能原因:

  1. 字段名不匹配
    • mqtt_policy 中定义的字段名(如 "path")与 JSON 中的字段名不一致(如大小写错误或拼写错误)。
  1. 数据格式错误
    • 日志中的 ReceTved 和乱码(如 °)表明数据可能被损坏或编码错误。
  1. 缓冲区问题
    • mqtt_buf 未正确初始化(虽然代码中调用了 blob_buf_init,但可能因内存越界导致数据丢失)。
  1. 策略表(Policy)错误
    • NOT_POLICY_MAX 可能未正确定义,导致解析器未覆盖所有字段。

5. 调试建议

检查输入数据:

// 在调用 blobmsg_add_json_from_string 前打印原始数据 INFO_LOG("Raw payload: %s", (char *)message->payload);

验证策略表:

确保 mqtt_policy 的定义与 JSON 字段完全一致:

static const struct blobmsg_policy mqtt_policy[] = { [MQTT_PATH] = { .name = "path", .type = BLOBMSG_TYPE_STRING }, [MQTT_SEQUENCE] = { .name = "sequence", .type = BLOBMSG_TYPE_STRING }, [MQTT_PARAMS] = { .name = "params", .type = BLOBMSG_TYPE_TABLE }, };

检查缓冲区状态:

// 解析后打印 blob_buf 的内容 INFO_LOG("Blob buffer len: %d", blob_len(mqtt_buf.head));


总结

  • 输入:JSON 格式的 MQTT 消息(可能因编码或传输损坏)。
  • 输出:解析失败,tb 数组未填充字段(全部为 null)。
  • 关键问题:数据损坏、字段名不匹配或策略表配置错误。
  • 下一步:通过日志验证原始数据和策略表,确保数据完整性和一致性。

你可能感兴趣的:(c语言,openwrt,blobmsg)