【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
和其他所有的mcu相比较,esp32很大一个优势就是它的wifi和bt。bt这部分,也就是蓝牙,主要是消费级。但是wifi,那用的地方就很多,不管是消费级,还是企业级,都有很多可以使用的地方,所以你也就看到,为什么大家都喜欢用esp32做iot设备了。

1、不用准备连线
模块自己就带wifi信号,不需要任何外接连线。
2、只需要一个无线路由器
既然是wifi,那么我们可以测试最简单的station模式。也就是大家都连接到同一个路由器上面,这样得到ip之后,就可以通过pc ping设备的方式,确认是不是esp32真的被ping通。
3、不只是arduino可以开发wifi
前面估计是为了借助arduino推广esp32,降低使用门槛,所以在arduino上面使用esp32还是很方便的,尤其是wifi。那么回到了esp-idf,其实使用纯c开发wifi也很简单,不需要安装第三方库,不需要修改CMakeLists.txt,就可以使用wifi。
4、通过ai搜索代码
这一切都准备好之后,就可以通过关键词提示ai,让ai帮助我们给出一份代码。比如这样说,用esp-idf写一段wifi的demo代码,最好是tcp协议的。那么,很快我们就可以得到这样的代码,
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_netif.h"
#include "lwip/sockets.h"
#include "lwip/netdb.h"
#define WIFI_SSID "NETGEAR"
#define WIFI_PASSWORD "12345678"
static const char *TAG = "WIFI_DEMO";
static bool wifi_connected = false;
static void wifi_event_handler(
void *arg,
esp_event_base_t event_base,
int32_t event_id,
void *event_data)
{
if (event_base == WIFI_EVENT &&
event_id == WIFI_EVENT_STA_START)
{
esp_wifi_connect();
}
else if (event_base == WIFI_EVENT &&
event_id == WIFI_EVENT_STA_DISCONNECTED)
{
wifi_connected = false;
ESP_LOGI(TAG, "wifi disconnected, reconnect");
esp_wifi_connect();
}
else if (event_base == IP_EVENT &&
event_id == IP_EVENT_STA_GOT_IP)
{
ip_event_got_ip_t *event =
(ip_event_got_ip_t *)event_data;
ESP_LOGI(TAG,
"got ip:" IPSTR,
IP2STR(&event->ip_info.ip));
wifi_connected = true;
}
}
static void wifi_init_sta(void)
{
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(
esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg =
WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(
esp_wifi_init(&cfg));
ESP_ERROR_CHECK(
esp_event_handler_register(
WIFI_EVENT,
ESP_EVENT_ANY_ID,
&wifi_event_handler,
NULL));
ESP_ERROR_CHECK(
esp_event_handler_register(
IP_EVENT,
IP_EVENT_STA_GOT_IP,
&wifi_event_handler,
NULL));
wifi_config_t wifi_config = {
.sta = {
.ssid = WIFI_SSID,
.password = WIFI_PASSWORD,
},
};
ESP_ERROR_CHECK(
esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(
esp_wifi_set_config(
WIFI_IF_STA,
&wifi_config));
ESP_ERROR_CHECK(
esp_wifi_start());
ESP_LOGI(TAG, "wifi start");
}
static void tcp_server_task(void *arg)
{
int listen_sock;
int client_sock;
struct sockaddr_in server_addr;
listen_sock = socket(AF_INET,
SOCK_STREAM,
IPPROTO_IP);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;
bind(listen_sock,
(struct sockaddr *)&server_addr,
sizeof(server_addr));
listen(listen_sock, 1);
ESP_LOGI(TAG,
"tcp server listen 8080");
while (1)
{
struct sockaddr_in client_addr;
socklen_t len =
sizeof(client_addr);
client_sock =
accept(listen_sock,
(struct sockaddr *)&client_addr,
&len);
if (client_sock < 0)
{
continue;
}
ESP_LOGI(TAG,
"client connected");
while (1)
{
char rx_buf[128];
int ret =
recv(client_sock,
rx_buf,
sizeof(rx_buf) - 1,
0);
if (ret <= 0)
{
break;
}
rx_buf[ret] = 0;
ESP_LOGI(TAG,
"recv:%s",
rx_buf);
send(client_sock,
rx_buf,
strlen(rx_buf),
0);
}
close(client_sock);
ESP_LOGI(TAG,
"client disconnected");
}
}
void app_main(void)
{
ESP_ERROR_CHECK(
nvs_flash_init());
wifi_init_sta();
while (!wifi_connected)
{
vTaskDelay(pdMS_TO_TICKS(100));
}
xTaskCreate(
tcp_server_task,
"tcp_server",
4096,
NULL,
5,
NULL);
}
5、编译、链接和测试
得到代码之后,马上编译。如果没有问题的话,就可以烧入、启动看看。这个时候,通过打印确定esp32获取的到p地址之后,就可以看看是不是pc可以ping通esp32设备。如果可以,重新修改wifi密码,看看修改之后打印是什么情况。
这一切都ok之后,再回过头去看一下代码和流程,可以好好学一下怎么用esp32连接wifi了。