docs/zh_CN/api-guides/wifi-driver/wifi-modes.rst
:link_to_translation:en:[English]
.. _wifi-ap-general-scenario:
下图为 AP 模式下的宏观场景,其中包含不同阶段的具体描述:
.. seqdiag:: :caption: AP 模式下 Wi-Fi 事件场景示例 :align: center
seqdiag sample-scenarios-soft-ap-mode {
activation = none;
node_width = 80;
node_height = 60;
edge_length = 140;
span_height = 5;
default_shape = roundedbox;
default_fontsize = 12;
MAIN_TASK [label = "Main\ntask"];
APP_TASK [label = "App\ntask"];
EVENT_TASK [label = "Event\ntask"];
LwIP_TASK [label = "LwIP\ntask"];
WIFI_TASK [label = "Wi-Fi\ntask"];
=== 1. 初始化阶段 ===
MAIN_TASK -> LwIP_TASK [label="1.1> 创建/初始化 LwIP"];
MAIN_TASK -> EVENT_TASK [label="1.2> 创建/初始化事件"];
MAIN_TASK -> WIFI_TASK [label="1.3> 创建/初始化 Wi-Fi"];
MAIN_TASK -> APP_TASK [label="1.4> 创建应用程序任务"];
=== 2. 配置阶段 ===
MAIN_TASK -> WIFI_TASK [label="2> 配置 Wi-Fi"];
=== 3. 启动阶段 ===
MAIN_TASK -> WIFI_TASK [label="3.1> 启动 Wi-Fi"];
EVENT_TASK <- WIFI_TASK [label="3.2> WIFI_EVENT_AP_START"];
APP_TASK <- EVENT_TASK [label="3.3> WIFI_EVENT_AP_START"];
=== 4. 连接阶段 ===
EVENT_TASK <- WIFI_TASK [label="4.1> WIFI_EVENT_AP_STACONNECTED"];
APP_TASK <- EVENT_TASK [label="4.2> WIFI_EVENT_AP_STACONNECTED"];
=== 5. 断开阶段 ===
EVENT_TASK <- WIFI_TASK [label="5.1> WIFI_EVENT_AP_STADISCONNECTED"];
APP_TASK <- EVENT_TASK [label="5.2> WIFI_EVENT_AP_STADISCONNECTED"];
APP_TASK -> APP_TASK [label="5.3> 断开处理"];
=== 6. 清理阶段 ===
APP_TASK -> WIFI_TASK [label="6.1> 断开 Wi-Fi 连接"];
APP_TASK -> WIFI_TASK [label="6.2> 终止 Wi-Fi"];
APP_TASK -> WIFI_TASK [label="6.3> 清理 Wi-Fi"];
}
Wi-Fi Sniffer 模式可以通过 :cpp:func:esp_wifi_set_promiscuous() 使能。如果使能 Sniffer 模式, 可以 向应用程序转储以下数据包。
不可以 向应用程序转储以下数据包。
对于 Sniffer 模式 可以 转储的帧,应用程序可以另外使用 :cpp:func:esp_wifi_set_promiscuous_filter() 和 :cpp:func:esp_wifi_set_promiscuous_ctrl_filter() 决定筛选哪些特定类型的数据包。应用程序默认筛选所有 802.11 数据和管理帧。如果你想要筛选 802.11 控制帧,:cpp:func:esp_wifi_set_promiscuous_filter() 中的 filter 参数需要包含 “WIFI_PROMIS_FILTER_MASK_CTRL” 类型, 如果你想进一步区分 802.11 控制帧,那么调用 :cpp:func:esp_wifi_set_promiscuous_ctrl_filter()。
可以在 WIFI_MODE_NULL、WIFI_MODE_STA、WIFI_MODE_AP、WIFI_MODE_APSTA 等 Wi-Fi 模式下使能 Wi-Fi Sniffer 模式。也就是说,当 station 连接到 AP,或者 AP 有 Wi-Fi 连接时,就可以使能。请注意,Sniffer 模式对 station/AP Wi-Fi 连接的吞吐量有 很大影响。通常,除非有特别原因,当 station/AP Wi-Fi 连接出现大量流量,不应使能。
该模式下还应注意回调函数 :cpp:type:wifi_promiscuous_cb_t 的使用。该回调将直接在 Wi-Fi 驱动程序任务中进行,所以如果应用程序需处理大量过滤的数据包,建议在回调中向应用程序任务发布一个事件,把真正的工作推迟到应用程序任务中完成。
.. only:: SOC_WIFI_NAN_SUPPORT
Wi-Fi Aware\ :sup:`TM` (NAN)
----------------------------
Wi-Fi Aware\ :sup:`TM` 或 NAN,即 Neighbor Awareness Networking (邻居感知网络,下文简称 NAN) 协议可以让 Wi-Fi 设备发现附近的其他设备。NAN 使用设备间直接通信,无需通过互联网或 AP 连接。
多个邻近的 NAN 设备组成一个 NAN 集群,集群中的设备可相互通信。同一集群中的 NAN 设备会同步时钟,并定期在信道 6 上互相监听。NAN 设备还可通过服务发现协议,在所处集群内提供(发布)或获取(订阅)服务。通过服务名称和匹配过滤器(可选),可以完成服务匹配。当订阅设备匹配到发布设备时,就可以发送信息(跟进)或与发布设备建立数据通路 (NDP)。NDP 建立后,订阅设备和发布设备都会获得一个 IPv6 地址用于通信。
注意,数据包发送是不加密的,无法保证 NDP 的安全性。NAN 为发现 (Discovery) 和数据通路单独的接口,该接口与 STA 和 AP 所用的接口不同。NAN 以独立模式运行,不支持与 STA 或 AP 接口共存。
要了解如何设置 NAN 发布设备和订阅设备,请参考 ESP-IDF 示例::idf_file:`examples/wifi/wifi_aware/nan_publisher/README.md` 和 :idf_file:`examples/wifi/wifi_aware/nan_subscriber/README.md`。
非同步服务发现 (USD)
---------------------------
非同步服务发现 (USD) 是一种机制,可让设备在新的设备进入射频环境时发现其提供的可用服务,而无需设备之间进行同步。
USD 通过发布 (Publish) 及跟进消息 (Follow-up message) 中的 SDEA 的服务信息 (Service Info) 字段来传递服务相关信息。
要了解如何设置 NAN-USD 发布设备和订阅设备,请参考 ESP-IDF 示例::idf_file:`examples/wifi/wifi_aware/usd_publisher/README.md` 和 :idf_file:`examples/wifi/wifi_aware/usd_subscriber/README.md`。