6.19 esp32s3学习
wifi设置
在连接Wi-Fi之前,需要先初始化好相关的底层组件。在ESP-IDF框架下,标准的初始化顺序通常如下:
初始化底层网络协议栈:调用 esp_netif_init()。这就像给网络通信准备好"道路和交通规则"。
创建默认事件循环:调用 esp_event_loop_create_default()。这就是一个不停运转的"消息中心",负责接收和分发所有事件。
创建默认网络接口:根据你的用途,调用 esp_netif_create_default_wifi_sta()(作为Station,连接路由器)或 esp_netif_create_default_wifi_ap()(作为AP,创建热点)。
初始化Wi-Fi驱动:调用 esp_wifi_init()。这会启动Wi-Fi硬件和底层驱动。
第二步:核心事件
准备工作完成后,就可以开始连接了。对于最常见的Station模式(连接路由器),你需要关注以下几个按顺序发生的事件:
WIFI_EVENT_STA_START:当你调用 esp_wifi_start() 后,Wi-Fi驱动启动成功就会发出此事件。你应该在这个事件的处理函数中,调用 esp_wifi_connect() 来真正发起连接。
WIFI_EVENT_STA_CONNECTED:当ESP32成功连接到路由器(AP)时触发。这代表物理层的Wi-Fi连接已建立,但此时还没有IP地址。系统会自动启动DHCP客户端开始获取IP。
IP_EVENT_STA_GOT_IP:这是最重要的一个事件!当DHCP客户端成功从路由器获取到IP地址后触发。这标志着整个网络连接已完全就绪。只有在这里,你才可以安全地创建socket、发起HTTP请求等网络通信操作。
函数解释
snprintf安全格式化字符串
头文件里用 DECLARE(声明),源文件里用 DEFINE(定义)。
所以 DECLARE 和 DEFINE 的配合是C语言管理全局资源的标准惯用法
#define ESP_EVENT_DECLARE_BASE(id) extern esp_event_base_t const id
#define ESP_EVENT_DEFINE_BASE(id) esp_event_base_t const id = #id
所以,这行代码声明了一个名为 id 的全局字符串常量,它的值就是它自己的名字 "id"。
void wifi_init_sta(void)
{
s_wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK(esp_netif_init());tcpip协议初始化
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();创建sta对象
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();初始化结构体
ESP_ERROR_CHECK(esp_wifi_init(&cfg));通过上面结构体的配置去初始化wifi
esp_event_handler_instance_t instance_any_id;用于取消相应的事件
esp_event_handler_instance_t instance_got_ip;
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,表示捕获所有wifi事件
&event_handler,
NULL,
&instance_any_id));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,获取到ip事件
&event_handler,
NULL,
&instance_got_ip));
wifi_config_t wifi_config = {填充结构体成员
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,你的wifi名称
.password = EXAMPLE_ESP_WIFI_PASS,你的wifi密码
/* Authmode threshold resets to WPA2 as default if password matches WPA2 standards (password len => 8).
* If you want to connect the device to deprecated WEP/WPA networks, Please set the threshold value
* to WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK and set the password with length and format matching to
* WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK standards.
*/
.threshold.authmode = ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD,加密等级
.sae_pwe_h2e = ESP_WIFI_SAE_MODE,
.sae_h2e_identifier = EXAMPLE_H2E_IDENTIFIER,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );设置sta模式
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );将结构体配置设置进去
ESP_ERROR_CHECK(esp_wifi_start() );启动wifi
ESP_LOGI(TAG, "wifi_init_sta finished.");
/* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
* number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
pdFALSE,
pdFALSE,
portMAX_DELAY);
/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
* happened. */
if (bits & WIFI_CONNECTED_BIT) {
ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
} else if (bits & WIFI_FAIL_BIT) {
ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
} else {
ESP_LOGE(TAG, "UNEXPECTED EVENT");
}
}
OSI 七层模型是什么
第 1 层:物理层(Physical Layer)
干什么的:负责传输原始比特流(0 和 1)。它规定了网线用什么接口、网线里有几根铜线、电压是多少伏代表“1”,多少伏代表“0”。
关键设备:网线、光纤、集线器(Hub)、中继器。
和你之前问的关联:SPI(串行外设接口) 就属于这一层的工作范畴,它规定了芯片引脚上的电平高低如何传递数据。
第 2 层:数据链路层(Data Link Layer)
干什么的:把物理层的“0 和 1”组装成数据帧(Frame),并负责在同一局域网(同一个交换机下) 内找到对方。它引入了 MAC 地址(物理地址),就像快递员在同一个小区里根据门牌号送件。
关键设备:交换机(Switch)、网桥。
关键协议:以太网(Ethernet)、Wi-Fi(802.11)。
第 3 层:网络层(Network Layer)
干什么的:负责把数据从一个网络路由转发到另一个网络。它引入了 IP 地址,就像快递总站根据邮编和城市,把包裹发往正确的城市。
关键设备:路由器(Router)。
关键协议:IP(网际协议)——这就是 TCP/IP 里的那个“IP”。
第 4 层:传输层(Transport Layer)
干什么的:负责端到端的可靠通信。它解决两个核心问题:① 数据有没有丢?② 数据顺序对不对?这一层引入了端口号(Port),用来区分电脑上不同的应用程序(比如 80 端口是网页,443 是加密网页)。
关键协议:TCP(传输控制协议)——可靠,有重传机制;以及 UDP——不可靠但速度快(用于视频通话、直播)。
第 5 层:会话层(Session Layer)
干什么的:负责建立、管理和终止通信双方之间的会话连接。通俗讲,就是“你好,我们聊完了,再见”。
实际现状:现在的网络协议栈中,这一层功能已经被弱化或并入应用层了,日常开发很少单独提它。
第 6 层:表示层(Presentation Layer)
干什么的:负责数据格式转换、加密、压缩。比如把图片转成 JPEG 格式,把文字转成 ASCII 或 Unicode,或者把数据加密防止偷看。
实际现状:同样,现在的应用层软件(如浏览器)自己就完成了这些工作,这一层也逐渐被合并了。
第 7 层:应用层(Application Layer)
干什么的:最靠近用户的一层,直接为应用程序提供网络服务。这一层规定了数据的具体“格式”和“业务逻辑”。
关键协议:HTTP(网页)、HTTPS、FTP(文件传输)、SMTP(邮件),以及你刚才问的 MQTT——它们统统都在这一层。
