feat(mqtt): 设备时钟同步方案B — 平台经 report_config 下发 Unix ts (协议V1.05)
设备无RTC/SNTP, 原上行 ts=mstick()/1000(上电秒数)。方案B: - net_srv.c 新增 dev_time_sync()/dev_time_now(): 门槛≥1600000000挡上电秒数, 已校准返回真Unix, 未校准退回上电秒数; 无符号相减处理mstick 49.7天回绕 - manage_mqtt_recv_message 从下行命令信封 ts 校准 (report_config主同步点) - 全部上行 ts (14处命令响应+initialize+loop_data+event_report) 改 dev_time_now() heartbeat uptime 字段保留 mstick()/1000 (运行时长非时间戳) - 协议 V1.05 §2.3 时间同步 + report_config 兼任同步点职责 - tests/test_dev_time_sync.c 6组全过 平台侧配合: 收到 initialize 后下发 report_config 时 ts 填当前 Unix 时间
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
/* 隔离单测: 设备时钟同步模块 (方案B) — 与 net_srv.c dev_time_sync/dev_time_now 同构 */
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
static uint32_t _mock_ms = 0;
|
||||
static uint32_t mstick(void) { return _mock_ms; }
|
||||
#define PRINT(...) do{}while(0)
|
||||
|
||||
/* ── 被测: 与固件同构 ── */
|
||||
static uint32_t _dev_time_base_unix = 0;
|
||||
static uint32_t _dev_time_base_tick = 0;
|
||||
void dev_time_sync(uint32_t unix_ts) {
|
||||
if (unix_ts < 1600000000UL) return;
|
||||
_dev_time_base_unix = unix_ts;
|
||||
_dev_time_base_tick = mstick();
|
||||
}
|
||||
uint32_t dev_time_now(void) {
|
||||
if (_dev_time_base_unix == 0) return (uint32_t)(mstick() / 1000);
|
||||
return _dev_time_base_unix + (uint32_t)((mstick() - _dev_time_base_tick) / 1000);
|
||||
}
|
||||
|
||||
static int fails = 0;
|
||||
#define CHECK(c,m) do{ if(!(c)){ printf("FAIL: %s\n", m); fails++; } }while(0)
|
||||
|
||||
int main(void) {
|
||||
/* T1: 未同步 → 返回上电秒数 */
|
||||
_mock_ms = 372000; /* 上电 372s */
|
||||
CHECK(dev_time_now() == 372, "T1 未同步=上电秒数372");
|
||||
|
||||
/* T2: 非法 ts(上电秒数/0/小值) 被门槛挡掉, 不污染基准 */
|
||||
dev_time_sync(372);
|
||||
dev_time_sync(0);
|
||||
dev_time_sync(1599999999UL); /* 门槛下沿-1 */
|
||||
CHECK(_dev_time_base_unix == 0, "T2 非法ts被拒, 仍未同步");
|
||||
CHECK(dev_time_now() == 372, "T2 仍退回上电秒数");
|
||||
|
||||
/* T3: 平台经 report_config 下发真 Unix 时间 → 校准 */
|
||||
uint32_t T = 1784000000UL; /* 某真实 Unix 秒 (>2020) */
|
||||
_mock_ms = 373000; /* 校准时刻 373s */
|
||||
dev_time_sync(T);
|
||||
CHECK(dev_time_now() == T, "T3 校准瞬间 = 下发 Unix 时间");
|
||||
|
||||
/* T4: 校准后随 mstick 前进, 真时间同步递增 */
|
||||
_mock_ms = 373000 + 60000; /* 60s 后 */
|
||||
CHECK(dev_time_now() == T + 60, "T4 60s后 = T+60");
|
||||
_mock_ms = 373000 + 3600000; /* 1h 后 */
|
||||
CHECK(dev_time_now() == T + 3600, "T4 1h后 = T+3600");
|
||||
|
||||
/* T5: 门槛边界 (>=1600000000 才认) */
|
||||
_dev_time_base_unix = 0; _dev_time_base_tick = 0; _mock_ms = 1000;
|
||||
dev_time_sync(1600000000UL);
|
||||
CHECK(_dev_time_base_unix == 1600000000UL, "T5 门槛下沿被接受");
|
||||
|
||||
/* T6: mstick 49.7天回绕 — 无符号相减仍正确 */
|
||||
_dev_time_base_unix = T;
|
||||
_dev_time_base_tick = 0xFFFFFF00UL; /* 接近 uint32 上限 */
|
||||
_mock_ms = 0x00000100UL; /* 回绕后 = 基准 + 512ms */
|
||||
/* 经过 (0x100 - 0xFFFFFF00) mod 2^32 = 0x200 = 512ms → +0s (整除) */
|
||||
CHECK(dev_time_now() == T + 0, "T6 回绕512ms → +0s (无符号相减正确)");
|
||||
_mock_ms = 0x00000100UL + 5000; /* +5.5s */
|
||||
CHECK(dev_time_now() == T + 5, "T6 回绕后 +5s 正确");
|
||||
|
||||
printf(fails ? "\n== %d FAIL ==\n" : "\n== ALL PASS ==\n", fails);
|
||||
return fails;
|
||||
}
|
||||
Reference in New Issue
Block a user