Skip to content

Commit a83b39f

Browse files
committed
docs(wifi):update TWT docs
1 parent ffe0de9 commit a83b39f

File tree

6 files changed

+290
-0
lines changed

6 files changed

+290
-0
lines changed

docs/_static/itwt_10s_current.png

105 KB
Loading

docs/_static/itwt_30s_current.png

67.6 KB
Loading

docs/_static/itwt_setup.png

47.6 KB
Loading

docs/_static/itwt_suspend.png

42.5 KB
Loading

docs/_static/itwt_teardown.png

37.6 KB
Loading

docs/zh_CN/api-guides/low-power-mode.rst

Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -743,3 +743,293 @@ Deep-sleep 有如下可配置选项:
743743
.. only:: esp32c2
744744

745745
平均电流约 4.9 μA
746+
747+
.. only:: esp32c6
748+
749+
目标唤醒时间 (TWT)
750+
----------------------------------
751+
752+
目标唤醒时间 (Target Wake Time, TWT) 是 Wi-Fi 6 中引入的一项特性,旨在降低设备功耗和提高网络效率。
753+
754+
在以往的 Wi-Fi 节能机制中,设备可能需要在每个 DTIM 周期醒来与 AP 交换数据,而在 TWT 机制中支持 AP 和设备协商得到特定的唤醒时间,设备会在这些时间点醒来与 AP 进行数据交换,而其余时间则处于休眠状态。TWT 协商的唤醒和休眠时间取决于设备具体的应用需求。例如,有些传感器设备需要定时上传数据,在该场景下设备可以与 AP 建立 TWT 协商,相隔多个小时交换一次数据。实际应用中可根据具体需求定制唤醒时间,在不影响设备正常工作的情况下降低功耗。
755+
756+
AP 可以与多个设备建立 TWT 协商。利用 Wi-Fi 6 的多用户特性,AP 可以对上行和下行数据传输做出合理协调,从而减少信道竞争,提高传输效率。
757+
758+
TWT 类型
759+
++++++++++
760+
761+
根据协商类型和工作模式,可以把 TWT 分为:
762+
763+
- **Individual TWT (iTWT)**
764+
765+
iTWT 模式下,AP 与终端设备建立的是一对一的 TWT 协商。
766+
767+
- **Broadcast TWT (bTWT)**
768+
769+
在 bTWT 模式下,AP 通过 Beacon 帧广播 TWT 信息,以组的形式来管理多个终端设备的 TWT 过程。终端设备可以根据 Beacon 中的 TWT 信息选择执行加组操作。
770+
771+
.. note::
772+
在建立 TWT 协商前,需要确认 AP 是否支持并开启了 TWT 功能。{IDF_TARGET_NAME} 当前只支持 iTWT 模式。
773+
774+
TWT 工作流程
775+
++++++++++++
776+
TWT 工作流程一般分为 TWT 协商建立、TWT 协商暂停/恢复、TWT 协商终止。TWT 协商建立后,Station 就可以按照协商的参数进入休眠状态,直到约定好的下一个 TWT 时间点到来时苏醒。
777+
对已经建立的 TWT,用户可以根据需求协商暂停/恢复 TWT 或者终止 TWT。
778+
779+
- TWT 协商建立
780+
781+
- Individual TWT 协商建立
782+
783+
在 iTWT 协商建立过程中,通常由 Station 充当请求发起方发送 TWT 请求,而后 AP 作为接收方对该请求做出回应。AP 也可以主动向 Station 发起 TWT 协商建立过程。
784+
在成功建立起 iTWT 协商后,Station 可以进入休眠状态,直到约定好的下一个 TWT 时间点到来时苏醒,该时间点通过和 AP 间的协商得到。Station 醒来后和 AP 进行数据交换,这段时间被称为 TWT 服务时间 (Service Period, SP)。
785+
TWT SP 的持续时间被称为 TWT Wake Duration,其最小值为 256 微秒。当一次 TWT SP 结束后,Station 进入休眠状态直到下次 TWT SP 醒来进行数据传输。本次 TWT SP 的起始到下次 TWT SP 的起始的时间间隔被称为 TWT Wake Interval。下图为基本的 iTWT 示例:
786+
787+
.. figure:: ../../_static/itwt_setup.png
788+
:align: center
789+
790+
Individual TWT 协商建立过程示例
791+
792+
Station 在 iTWT 协商建立时可以发送不同类型的请求,AP 会根据请求类型及参数做出对应的回复。用户需要根据 AP 回复中的类型和具体参数决定后续的操作逻辑。Station 所发送的请求类型有 ``Request``、``Suggest`` 和 ``Demand``。
793+
AP 的回复类型可分为 ``Accept``、``Alternate`` 和 ``Dictate``。下表描述了发送不同请求时 AP 可能的回复以及不同情况下对应的含义:
794+
795+
.. list-table::
796+
:header-rows: 1
797+
:widths: 20 10 40
798+
799+
* - 请求类型
800+
- AP 回复
801+
- 含义
802+
* - Request, Suggest or Demand
803+
- No response
804+
- 在该情况下 AP 不会与 Station 建立 iTWT 协商。
805+
* - Suggest or Request
806+
- Accept
807+
- AP 同意建立 iTWT 协商,其使用的参数以回复中 TWT 参数为准。回复中的 TWT 参数有可能与请求中不一致。
808+
* - Demand
809+
- Accept
810+
- AP 同意建立 iTWT 协商,且回复中的 TWT 参数与请求中的一致。
811+
* - Demand or Suggest
812+
- Alternate
813+
- AP 使用该回复类型代表给 Station提供一组备选 TWT 参数,此时不会建立 iTWT 协商。后续 Station 可以发送新的请求,但 AP 仍有可能使用该组参数。
814+
* - Demand or Suggest
815+
- Dictate
816+
- AP 使用该回复类型代表给 Station 提供一组备选 TWT 参数,此时不会建立 iTWT 协商,同时也表明 AP 不接受除该组参数以外的其他参数。后续 Station 可以发送新的请求,但只有参数与所提供的备选参数一致才会收到 Accept 回复。
817+
* - Request, Suggest or Demand
818+
- Reject
819+
- 在该情况下 AP 不会与 station 建立 iTWT 协商。后续 Station 可以更改 TWT 参数发送新的请求。
820+
821+
在 TWT SP 中依照数据交互时的操作可以将 TWT 进一步地细分为多种类型,下表描述了这些类型间的差异:
822+
823+
.. list-table::
824+
:header-rows: 1
825+
:widths: 10 20
826+
827+
* - Types
828+
- 含义
829+
* - Trigger-enabled
830+
- AP 会在 SP 中使用 Trigger 帧来协调 Station 的数据传输。
831+
* - Non trigger-enabled
832+
- 在 SP 中不需要使用 Trigger 帧。
833+
* - Announced
834+
- Station 会发送 QoS Null 帧告知 AP 其唤醒状态。
835+
* - Unannounced
836+
- 不需要发送 QoS Null 帧。
837+
838+
- Broadcast TWT 协商建立
839+
840+
与 iTWT 不同的是,在 bTWT 模式下 AP 将 TWT 信息放在 Beacon 帧中进行广播宣告。Station 接收到 Beacon 后,可以向 AP 发送请求申请选择加入某个 TWT。
841+
当建立起 bTWT 协商后, Station 和 AP 会在协商好的 TWT SP 中进行数据传输。
842+
843+
与 iTWT 类似,可以把 bTWT 进一步分成 Trigger-enabled 和 Non trigger-enabled 类型,以及 Announced 和 Unannounced 类型,具体的行为差异可以参考 iTWT 中的描述。
844+
845+
- TWT 协商暂停/恢复
846+
847+
建立起 TWT 协商后, Station 可以通过向 AP 发送 TWT Information 帧暂停或者恢复指定的 TWT 协商。由 flow_id 来标识需要暂停或者恢复的 TWT 协商,具体可以参考 TWT 参数配置。
848+
849+
.. figure:: ../../_static/itwt_suspend.png
850+
:align: center
851+
852+
Individual TWT 协商暂停/恢复过程示例
853+
854+
- TWT 协商终止
855+
856+
建立起 TWT 协商后, Station 可以通过向 AP 发送 TWT Teardown 帧终止指定的 TWT 协商。由 flow_id 来标识需要终止的 TWT 协商,具体可以参考 TWT 参数配置。
857+
858+
.. figure:: ../../_static/itwt_teardown.png
859+
:align: center
860+
861+
Individual TWT 协商终止过程示例
862+
863+
TWT 参数配置
864+
++++++++++++
865+
866+
在使用过程中,需要配置 TWT 和低功耗模式的相关参数,其中低功耗模式相关参数决定了设备在休眠状态下的行为模式。本小节将主要阐述如何配置 TWT,有关低功耗模式下的参数配置,请参考 `如何配置 Wi-Fi 场景下低功耗模式`_。
867+
868+
- Individual TWT 参数配置
869+
870+
在建立 Station 和 AP 间的 iTWT 时,使用 :component_file:`esp_wifi/include/esp_wifi_he_types.h` 中定义的结构体 :cpp:type:`wifi_twt_setup_config_t` 来配置 TWT 的相关参数,其定义如下:
871+
872+
.. code-block:: C
873+
874+
typedef struct
875+
{
876+
wifi_twt_setup_cmds_t setup_cmd;
877+
uint16_t trigger :1;
878+
uint16_t flow_type :1;
879+
uint16_t flow_id :3;
880+
uint16_t wake_invl_expn :5;
881+
uint16_t wake_duration_unit :1;
882+
uint16_t reserved :5;
883+
uint8_t min_wake_dura;
884+
uint16_t wake_invl_mant;
885+
uint16_t twt_id;
886+
uint16_t timeout_time_ms;
887+
} wifi_twt_setup_config_t;
888+
889+
:cpp:type:`wifi_twt_setup_config_t` 中各个字段的含义如下:
890+
891+
.. list-table::
892+
:header-rows: 1
893+
:widths: 15 45
894+
:align: center
895+
896+
* - 字段
897+
- 描述
898+
* - setup_cmd
899+
- 指示了 TWT 建立时请求和回复使用的命令类型,具体类型请参阅 :cpp:type:`wifi_twt_setup_cmds_t` 。
900+
* - trigger
901+
- 值为 1 时配置 TWT 类型为 Trigger-enabled,值为 0 时配置为 Non trigger-enabled。
902+
* - flow_type
903+
- 值为 1 时配置 TWT 类型为 Unannounced,值为 0 时配置为 Announced。
904+
* - flow_id
905+
- 当建立起一个 iTWT 协商后,AP 会为其分配 flow_id。Station 在协商建立请求中可以指定 flow_id,但在 AP 的回复中该字段可能会被改变。
906+
* - wake_invl_expn
907+
- TWT Wake Interval 指数部分。
908+
* - wake_duration_unit
909+
- TWT Wake Duration 计数单元。为 0 代表 256 微秒,为 1 代表以 TU (1024 微秒) 为单位。
910+
* - reserved
911+
- 保留字段。
912+
* - min_wake_dura
913+
- 该字段代表 Station 期望处于唤醒状态的时间,以 ``wake_duration_unit`` 作为基本单位。
914+
* - wake_invl_mant
915+
- TWT Wake Interval 尾数部分。
916+
* - twt_id
917+
- TWT 配置标识。在发起多个 TWT 请求时,该字段用于在 handler 中区分不同的 TWT 参数配置。
918+
* - timeout_time_ms
919+
- TWT 请求超时时间,单位为毫秒。
920+
921+
需要指出的是,Station 在协商中所期望的 TWT Wake Interval 为 wake_invl_mant * 2\ :sup:`wake_invl_expn`\,单位是微秒。
922+
而所期望的 TWT Wake Duration 为 min_wake_dura * wake_duration_unit。
923+
924+
.. note::
925+
注意, TWT Wake Interval 和 TWT Wake Duration 的差值需要大于 10 毫秒。
926+
927+
配置示例如下:
928+
929+
.. code-block:: C
930+
931+
wifi_twt_setup_config_t setup_config = {
932+
.setup_cmd = TWT_REQUEST,
933+
.flow_id = 0,
934+
.twt_id = 0,
935+
.flow_type = 0,
936+
.min_wake_dura = 255,
937+
.wake_duration_unit = 0,
938+
.wake_invl_expn = 10,
939+
.wake_invl_mant = 512,
940+
.trigger = 1,
941+
.timeout_time_ms = 5000,
942+
};
943+
944+
以上配置指定建立 TWT 请求时使用的类型为 Trigger-enabled,Announced,期望的 TWT Wake Interval 为 524288 微秒, TWT Wake Duration 为 65280 微秒。配置好 :cpp:type:`wifi_twt_setup_config_t` 后,调用 API :cpp:func:`esp_wifi_sta_itwt_setup` 向 AP 发起 iTWT 建立请求。
945+
946+
.. note::
947+
{IDF_TARGET_NAME} 支持用户调用 API :cpp:func:`esp_wifi_sta_itwt_set_target_wake_time_offset` 配置相对于目标唤醒时间的偏移时间。
948+
949+
TWT 事件
950+
++++++++++
951+
952+
- WIFI_EVENT_ITWT_SETUP
953+
954+
发送请求后,用户可以在 :cpp:enumerator:`WIFI_EVENT_ITWT_SETUP` 事件的对应处理程序中获取请求结果并自定义处理逻辑。事件结果保存在 :cpp:type:`wifi_event_sta_itwt_setup_t` 结构体中,其成员变量 status 指示了此次事件的状态。
955+
当 status 为 :c:macro:`ITWT_SETUP_SUCCESS` 时代表请求成功收到了对应回复,为其他值代表请求失败。在得到请求成功的状态后,用户可以从该结构体中的 config 成员变量中得到 AP 回复中的具体参数,并根据具体参数决定后续的处理逻辑。
956+
例如,Station 发送了类型为 Demand 的 TWT 请求,收到 AP 的回复类型为 Dictate,用户此时可以考察回复中的 TWT 参数是否可行,若可行便可以发送一个新的 TWT 请求与 AP 继续建立 TWT 协商,并且该请求中的 TWT 参数需要与 AP 回复中一致。
957+
958+
在 Station 未主动发送请求时也有可能触发 :cpp:enumerator:`WIFI_EVENT_ITWT_SETUP` 事件,这种情况下对应的是 AP 主动向 Station 发起 iTWT 协商建立过程,此时 AP 向 Station 发送的帧中会带有 TWT 参数。同样地,用户可以在 :cpp:enumerator:`WIFI_EVENT_ITWT_SETUP` 事件的对应处理程序中获取结果并自定义处理逻辑。
959+
用户需要检查 config 成员变量中 AP 发送的 TWT 参数类型,一般有两种情况:
960+
1. AP 发送的 TWT 参数为 Accept 类型,此时 Station 会与 AP 建立起使用该 TWT 参数的 iTWT 协商。若用户不希望建立此 iTWT 协商,可以向 AP 发送 Teardown 帧。
961+
2. AP 发送的 TWT 参数为 Alternate 或 Dictate 类型,此时 Station 不会与 AP 建立起 iTWT 协商,但可以在接下来使用该参数向 AP 发起 iTWT 协商建立请求。
962+
963+
- WIFI_EVENT_ITWT_SUSPEND
964+
965+
在调用 API :cpp:func:`esp_wifi_sta_itwt_suspend` 请求暂停已经建立的 iTWT 协商时, 用户可以在 :cpp:enumerator:`WIFI_EVENT_ITWT_SUSPEND` 事件的对应处理程序中获取请求结果并自定义处理逻辑。事件结果保存在 :cpp:type:`wifi_event_sta_itwt_suspend_t` 结构体中,其成员变量 status 指示了此次事件的状态。
966+
当 status 为 :c:macro:`ESP_OK` 时代表成功暂停了指定的 iTWT 协商,为其他值代表请求暂停失败。
967+
968+
.. note::
969+
注意,调用 API :cpp:func:`esp_wifi_sta_itwt_suspend` 请求暂停 iTWT 时,用户需要指定对应 iTWT 的 flow_id 以及暂停时间。需要注意的是,当暂停时间大于 0 时,对应 iTWT 会在暂停指定时间后恢复,而当暂停时间为 0 时,对应的 iTWT 会暂停,直到被用户调用 API 手动恢复为止。
970+
971+
- WIFI_EVENT_ITWT_TEARDOWN
972+
973+
在调用 API :cpp:func:`esp_wifi_sta_itwt_teardown` 请求终止 iTWT 时,用户可以在 :cpp:enumerator:`WIFI_EVENT_ITWT_TEARDOWN` 事件的对应处理程序中获取请求结果并自定义处理逻辑。事件结果保存在 :cpp:type:`wifi_event_sta_itwt_teardown_t` 结构体中,其成员变量 status 指示了此次事件的状态。
974+
当 status 为 :cpp:enumerator:`ITWT_TEARDOWN_SUCCESS` 时代表成功终止了指定的 iTWT 协商,为其他值代表终止 iTWT 失败。调用 API 时用户需要指定需要终止的 iTWT 的 flow_id。
975+
976+
- WIFI_EVENT_TWT_WAKEUP
977+
978+
当 Station 在休眠中醒来时,Wi-Fi 驱动程序将会上报 :cpp:enumerator:`WIFI_EVENT_TWT_WAKEUP` 事件,用户可以在该事件的对应处理程序中自定义处理逻辑。事件结果保存在 :cpp:type:`wifi_event_sta_twt_wakeup_t` 结构体中,成员变量 twt_type 指示了此次事件 TWT 的类型,成员变量 flow_id 指示了此次醒来的具体的 TWT。
979+
980+
- WIFI_EVENT_ITWT_PROBE
981+
982+
调用 API :cpp:func:`esp_wifi_sta_itwt_send_probe_req` 在 iTWT 期间发送 probe request 时,用户可以在 :cpp:enumerator:`WIFI_EVENT_ITWT_PROBE` 事件的对应处理程序中获取请求结果并自定义处理逻辑。事件结果保存在 :cpp:type:`wifi_event_sta_itwt_probe_t` 结构体中,其成员变量 status 指示了此次事件的状态。
983+
当 status 为 :cpp:enumerator:`ITWT_PROBE_SUCCESS` 时代表成功发送 probe request 并且接收到 AP 回复的 probe response,为其他值代表发送或者接收 probe 失败。
984+
985+
986+
有关 iTWT 使用的更多信息,可以参考示例 :example:`wifi/itwt` 。
987+
988+
TWT 功耗分析
989+
+++++++++++++
990+
991+
为了展现 TWT 在节省设备功耗方面的优势,我们使用功率分析仪追踪了 {IDF_TARGET_NAME} 在不同模式下的电流情况。如下图所示,{IDF_TARGET_NAME} 首先处于 DTIM 模式,接着与 AP 建立起 iTWT 协商,TWT Wake Interval 为 10 s,在 TWT SP 结束后,{IDF_TARGET_NAME} 会进入 Light-sleep 状态直到下个 SP 到来时唤醒。
992+
其中 :cpp:type:`wifi_twt_setup_config_t` 配置示例如下:
993+
994+
.. code-block:: C
995+
996+
wifi_twt_setup_config_t setup_config = {
997+
.setup_cmd = TWT_REQUEST,
998+
.flow_id = 0,
999+
.twt_id = 0,
1000+
.flow_type = 0,
1001+
.min_wake_dura = 255,
1002+
.wake_duration_unit = 0,
1003+
.wake_invl_expn = 10,
1004+
.wake_invl_mant = 10000,
1005+
.trigger = 1,
1006+
.timeout_time_ms = 5000,
1007+
};
1008+
1009+
.. figure:: ../../_static/itwt_10s_current.png
1010+
:align: center
1011+
1012+
DTIM 与 iTWT 模式下的电流图
1013+
1014+
进一步,将 TWT 协商中的 TWT Wake Interval 参数更改为 30 s,下图展现了参数变化对于电流的影响。
1015+
其中 :cpp:type:`wifi_twt_setup_config_t` 配置示例如下:
1016+
1017+
.. code-block:: C
1018+
1019+
wifi_twt_setup_config_t setup_config = {
1020+
.setup_cmd = TWT_REQUEST,
1021+
.flow_id = 0,
1022+
.twt_id = 0,
1023+
.flow_type = 0,
1024+
.min_wake_dura = 255,
1025+
.wake_duration_unit = 0,
1026+
.wake_invl_expn = 10,
1027+
.wake_invl_mant = 30000,
1028+
.trigger = 1,
1029+
.timeout_time_ms = 5000,
1030+
};
1031+
1032+
.. figure:: ../../_static/itwt_30s_current.png
1033+
:align: center
1034+
1035+
更改参数后的 DTIM 与 iTWT 模式下的电流图

0 commit comments

Comments
 (0)