feat(vd960DBN)+fix(DBNMQTTool): log_query 改 hex 原始字节上报 (2026-08-18)
背景: MQTT 快照流实测 MQTTSerialize_publish failed — JSON 化快照记录 ~810B/条 超 800B 发送缓冲
方案(用户拍板): 对齐 BLE 通道, 原始字节 hex 上报
固件 (V4.3):
- offlog.c/h: 新增 offlog_evt_to_hex() (32B→64 hex)
- snapshot.c/h: 新增 snap_rec_to_hex() (64B→128 hex); 删 SNAP_MAX_QUERY_JSON, 恢复 count=2
- tcp_json_srv.c / iot_mqtt_srv.c: log_query 改 {"seq":N,"hex":"..."}; SEND_BUF 保持 800
- 2 条快照 hex 响应 406B < 800B
文档: TCP JSON V1.03 / MQTT V1.07 §4.17 records 改 hex + 解析表引用 BLE §6.4/§7
工具: parse_offlog_hex/parse_snap_hex/offlog_payload_desc + hex 展示; 验证: gcc 9 断言 + 工具解析全过 + offscreen UI
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/* mock SnapRec (与 snapshot.h 一致, 64B) */
|
||||
typedef struct {
|
||||
uint8_t magic;
|
||||
uint8_t len;
|
||||
uint8_t flags;
|
||||
uint8_t rsvd;
|
||||
uint32_t seq;
|
||||
uint32_t ts_ms;
|
||||
uint16_t boot_seq;
|
||||
uint16_t rsvd2;
|
||||
uint8_t coils[48];
|
||||
} SnapRec;
|
||||
|
||||
#define SNAP_COILS_MAX 4
|
||||
#define SNAP_COIL_BYTES 12
|
||||
|
||||
int snap_rec_to_hex(const SnapRec *r, char *buf, int buf_len)
|
||||
{
|
||||
int i, pos = 0;
|
||||
const uint8_t *p = (const uint8_t *)r;
|
||||
for (i = 0; i < (int)sizeof(SnapRec); i++) {
|
||||
if (pos >= buf_len - 3) break;
|
||||
pos += snprintf(buf + pos, buf_len - pos, "%02x", p[i]);
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
|
||||
#define CHECK(cond) do { if (!(cond)) { printf("FAIL %d: %s\n", __LINE__, #cond); fails++; } else { passes++; } } while (0)
|
||||
static int passes = 0, fails = 0;
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char buf[256];
|
||||
SnapRec r;
|
||||
|
||||
/* 用例1: 与 test_snap_to_json case2 相同数据, 验证 hex 与 JSON 语义一致
|
||||
ch1: cfg=0xE8(11 1 0 0000: 低频/方向/初始/灵敏度0) cond=0xFF(cond15/断/有车/relay)
|
||||
freq=0x00C383=50051, variation=-10, misc=128 */
|
||||
memset(&r, 0, sizeof(r));
|
||||
r.magic = 0xA6; r.len = 48; r.seq = 999; r.ts_ms = 1234; r.boot_seq = 3;
|
||||
r.coils[0] = 0xE8; r.coils[1] = 0xFF;
|
||||
r.coils[2] = 0x83; r.coils[3] = 0xC3; r.coils[4] = 0x00; /* 50051 */
|
||||
r.coils[5] = 0xF6; r.coils[6] = 0xFF; r.coils[7] = 0xFF; /* -10 */
|
||||
r.coils[8] = 0x80; r.coils[9] = 0x00; r.coils[10] = 0x00; r.coils[11] = 0x00; /* 128 */
|
||||
|
||||
int n = snap_rec_to_hex(&r, buf, sizeof(buf));
|
||||
printf("hex(%d): %s\n", n, buf);
|
||||
CHECK(n == 128);
|
||||
CHECK(strlen(buf) == 128);
|
||||
/* 头部: magic=0xA6 len=0x30(48) flags=0 rsvd=0 seq=0xE7030000(999 LE) */
|
||||
CHECK(strncmp(buf, "a6300000e7030000d204", 20) == 0);
|
||||
/* ch1 12B: e8 ff 83 c3 00 f6 ff ff 80 00 00 00 */
|
||||
CHECK(strncmp(buf + 32, "e8ff83c300f6ffff80000000", 24) == 0);
|
||||
/* 全部小写 */
|
||||
CHECK(strspn(buf, "0123456789abcdef") == 128);
|
||||
|
||||
/* 用例2: 空记录 len=0 */
|
||||
memset(&r, 0, sizeof(r));
|
||||
r.magic = 0xA6;
|
||||
n = snap_rec_to_hex(&r, buf, sizeof(buf));
|
||||
CHECK(n == 128);
|
||||
CHECK(strncmp(buf, "a60000000000000000000000", 24) == 0);
|
||||
|
||||
/* 用例3: 缓冲不足截断安全 (buf_len=10 不越界) */
|
||||
memset(&r, 0, sizeof(r));
|
||||
n = snap_rec_to_hex(&r, buf, 10);
|
||||
CHECK(n == 8);
|
||||
CHECK(strlen(buf) == 8);
|
||||
|
||||
printf("PASS=%d FAIL=%d\n", passes, fails);
|
||||
return fails ? 1 : 0;
|
||||
}
|
||||
Reference in New Issue
Block a user