ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ESP-IDF WiFi 时间戳实战:微秒级读取无线电时钟,把网络延迟量清楚

ESP-IDF WiFi 时间戳实战:微秒级读取无线电时钟,把网络延迟量清楚 ESP-IDF WiFi 时间戳实战微秒级读取无线电时钟把网络延迟量清楚【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf你有没有遇到过应用觉得网络慢、其实慢在调度的疑案或多台 ESP32 记录同一事件时间对不齐的麻烦ESP-IDF WiFi 时间戳就是最直接的参照物——它让你直接从无线电里读出微秒级时间不依赖系统时钟也不需要 NTP。原理 60 秒TSF 时间戳是什么、为什么是微秒级TSFTiming Synchronization Function是 WiFi 协议内建的计时器AP 按固定间隔广播信标空口上的每个帧都带着微秒级时间戳STA 本地时间跟着 AP 的信标对齐、持续推进。所以同一网络里STA 和 AP 的 TSF 基本共用一套时间基准。微秒精度之所以重要帧间间隔、slot time 本身只有几十微秒毫秒级的系统时间量不出单帧级别的偏差。ESP-IDF 把这个时钟用一个函数交给你int64_t esp_wifi_get_tsf_time(wifi_interface_t interface)声明在components/esp_wifi/include/esp_wifi.h返回值单位是微秒没有有效时间时返回 0。主线实操一条线跑通 TSF 时间戳读取读时间戳的前置动作就四组建默认事件循环和 STA netif初始化并启动 WiFi填 SSID/密码后连接。顺序写下来esp_event_loop_create_default(); esp_netif_create_default_wifi_sta(); esp_wifi_init(cfg); // cfg WIFI_INIT_CONFIG_DEFAULT() esp_wifi_set_mode(WIFI_MODE_STA); esp_wifi_start(); esp_wifi_set_config(WIFI_IF_STA, cfg_sta); // SSID 密码 esp_wifi_connect(); // 连接成功并收到首个信标后 int64_t tsf esp_wifi_get_tsf_time(WIFI_IF_STA);interface可传WIFI_IF_STA、WIFI_IF_AP、WIFI_IF_AP_STAAPSTA 并存时挑对接口。务必检查返回值官方头注释写明STA 未连接、或连接后还没收到过信标时这个函数返回 0把它当成还没就绪的信号。三个落地场景延迟测量、周期采样、扫描计时代码示例网络延迟测量TSF 差值就是空口耗时int64_t t0 esp_wifi_get_tsf_time(WIFI_IF_STA); send_frame_and_wait_ack(); int64_t rtt esp_wifi_get_tsf_time(WIFI_IF_STA) - t0; ESP_LOGI(TAG, air-time %lld us, rtt);起止点都取无线电自己的时钟差值天然不含任务调度抖动这比系统时间做 ESP32 WiFi 延迟测量更干净。周期采样用 TSF 当采样节拍static int64_t last 0; int64_t now esp_wifi_get_tsf_time(WIFI_IF_STA); if (now - last 100000) { // 约 100 ms last now; collect_sensor(); }适合空中有帧才采样的场景采样节奏自动跟网络活动对齐。扫描计时官方源码里的现成用法components/wpa_supplicant/esp_supplicant/src/esp_scan.c就是这套打法——扫描开始时记下 TSF回调里反复检查是否超时wpa_s-scan_start_tsf esp_wifi_get_tsf_time(WIFI_IF_STA); // 每次扫描结果回调中 if (esp_wifi_get_tsf_time(WIFI_IF_STA) - wpa_s-scan_start_tsf 100000) { handle_scan_timeout(); }⚠️ 踩坑排错TSF 时间戳的四个高频现象现象函数一直返回 0 →根因未连接或连上后第一个信标还没到官方头注释明确→处置等WIFI_EVENT_STA_CONNECTED之后再读首个非零值才算基线。现象时间戳归零跳变 →根因重连或换 AP 后 STA 重新同步新 BSS 的信标旧基准作废 →处置只用差值连接事件触发时作废旧基线别持久化绝对值。现象读数抖动、和系统时间对不上 →根因省电模式 doze 期无线电收不到信标头文件警告省电时读数不准modem-sleep 除外→处置精度场景设esp_wifi_set_ps(WIFI_PS_MIN_MODEM)。现象多 AP 环境差值忽大忽小 →根因TSF 只对同一 BSS 成立不同 AP 时间基准各异 →处置跨设备对齐另走 NTP 等通道TSF 只用于同网段测量。上面这条时间轴就是抖动现象的来源STA 进入 Doze 后听不到信标TSF 只能靠内部推算往前走。进阶建议提高 TSF 时间戳精度的五个技巧modem-sleep 是唯一读数仍可靠的省电模式app-sleep 场景要么切WIFI_PS_MIN_MODEM要么接受偏差。用esp_wifi_set_inactive_time(WIFI_IF_STA, sec)调信标等待STA 默认 6 秒且配置不存 flash、每次启动要重设想快点判定 AP 掉电就把它调小。别在紧循环里调 API读一次缓存下来差值在本地算。深睡眠期间别读无线电已断电、没有时间参考需要睡前时刻就在入睡前先存 TSF。要和时间戳对任务级耗时配合 app_trace 抓任务切换事件把软件时间轴和无线电时间轴对齐。TSF 这块时钟 ESP32 上电就有现在它就在你手边——去写那个延迟测量函数吧 【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表