esp32开发与应用(再谈wifi的使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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了。

相关推荐
比兔代理5 小时前
正向代理与反向代理技术辨析,为什么代理 IP 属于正向代理
服务器·网络·http·ip
Ivanqhz7 小时前
SVD++算法
java·服务器·网络·深度学习·神经网络
迪康Defender9 小时前
终端安全实战:如何高效解决企业U盘泄密与管控难题
运维·网络·安全·web安全·终端安全管理
网安小学生(兼顾数据库版)9 小时前
固件+软件供应链:ONEKEY+Mend如何实现全链路安全覆盖
网络·安全·web安全
学习中的码虫10 小时前
网络编程5
服务器·网络
GPU实战笔记11 小时前
本地跑不动 llama.cpp,临时租云 GPU 怎么搭?从启动服务到环境复用
java·服务器·网络·人工智能·深度学习·llama
发量惊人的中年网工11 小时前
2026年DDoS防护方案怎么选?从攻击响应、清洗位置到成本账单,解析全球高防方案
大数据·网络·安全·ddos
黄昏回响13 小时前
软件工程基础知识(五):软件测试详解(下篇)——现代测试实践与论文指导
网络·其他·软件工程·改行学it
万联WANFLOW15 小时前
网络排障:如何从延迟、丢包、带宽定位海外访问异常
网络·架构·业界资讯
zzzyyy53815 小时前
TCP 协议学习笔记:从报文格式到异常处理
linux·网络