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了。

相关推荐
REDcker6 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
ANSIOT8 小时前
安朔科技蓝牙无感开锁方案,靠近自动解锁
网络·科技·物联网
晏宁科技YaningAI8 小时前
VoIP系统的工程实现模型:从信令控制到媒体传输的完整架构解析
网络·人工智能·架构·系统架构·信息与通信
神奇霸王龙11 小时前
Claude Code屠榜:MiMo与Grok紧追Codex
服务器·网络·人工智能·gpt·ai·ai编程
数智化管理手记13 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发13 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序
RD_daoyi14 小时前
外链权重暴跌至13%,品牌提及反超传统链接——2026年不做Digital PR,你的独立站等于隐形
运维·网络·学习·机器学习·搜索引擎
张小姐的猫14 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
国科安芯14 小时前
星间光链路:AS32S601型抗辐射MCU在空间激光通信终端控制中的技术实现
服务器·网络·单片机·嵌入式硬件·物联网·安全·信息与通信
可视化运维管理爱好者15 小时前
nVisual Studio:数据中心网络智能规划设计工具
网络·ide·visual studio