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

相关推荐
YJlio1 小时前
《Sysinternals实战指南》16.5 Ctrl2Cap 工具详解:把 Caps Lock 变成 Ctrl 的键盘改造与回退方法
linux·运维·服务器·网络·python·学习·计算机外设
wangxixi5221 小时前
OTN 以太网业务接入全流程详解
网络
带土12 小时前
5. 网络体系架构与WireShark简单使用
网络·测试工具·wireshark
liulilittle2 小时前
拥塞控制:排水终止的两种决策:OR 与 AND
网络·tcp/ip·计算机网络·算法·信息与通信·tcp·通信
行走__Wz2 小时前
【网工入门-03】认识常见网络设备——交换机、路由器、防火墙、无线设备
网络·智能路由器
申通之声2 小时前
以体验和AI重构竞争力,申通要“构建生态共同体”
大数据·网络·人工智能·重构·交通物流
Eloudy3 小时前
ns-3 在数据中心网络仿真
网络·人工智能·量子计算
装不满的克莱因瓶3 小时前
自然语言处理发展历史——从规则系统到大语言模型的演进之路
网络·人工智能·python·深度学习·语言模型·自然语言处理
爱装代码的小瓶子3 小时前
安工大Linux考点分类真题解析(含知识点是试卷原题了)
linux·服务器·网络·c