ESP32的wifi模块


蓝牙和WIFI是ESP32的核心功能,蓝牙和wifi的共存也是esp32的独门武功,但时候后续也会发现共存的时候会有很多问题。不管怎样,蓝牙和wifi在esp-idf中有很多的例子,大家都可以参考。本篇只做简单的流程介绍。

蓝牙a2dp sink的初始化

蓝⽛牙是⼀一种短距通信系统,其关键特性包括鲁棒性、低功耗、低成本等。蓝⽛系统分为两种不不同的技术:经典蓝牙 (Classic Bluetooth) 和蓝⽛牙低功耗 (Bluetooth Low Energy)。ESP32 支持双模蓝⽛,即同时⽀支持经典蓝⽛和蓝牙低功耗。

我们的项目蓝牙方面只是用了A2DP,基本上从esp-idf/examples/bluetooth/a2dp_sink的示例代码修改来的,大部分未做改动,

esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
if (esp_bt_controller_init(&bt_cfg) != ESP_OK) {
    ESP_LOGE(BT_AV_TAG, "%s initialize controller failed\n", __func__);
    return;
}
if (esp_bt_controller_enable(ESP_BT_MODE_BTDM) != ESP_OK) {
    ESP_LOGE(BT_AV_TAG, "%s enable controller failed\n", __func__);
    return;
}
if (esp_bluedroid_init() != ESP_OK) {
    ESP_LOGE(BT_AV_TAG, "%s initialize bluedroid failed\n", __func__);
    return;
}
if (esp_bluedroid_enable() != ESP_OK) {
    ESP_LOGE(BT_AV_TAG, "%s enable bluedroid failed\n", __func__);
    return;
}
/* create application task */
bt_app_task_start_up();

/* Bluetooth device name, connection mode and profile set up */
bt_app_work_dispatch(bt_av_hdl_stack_evt, BT_APP_EVT_STACK_UP, NULL, 0, NULL);

我们的设备类似蓝牙音箱的功能,在使用a2dp的过程中也是有很多bug的,比方说暂停后杂音、蓝牙声音卡顿、系统panic等,希望后续的esp-idf都已经解决了,如果遇到类似的问题,我们也可以在博客中讨论,在此就不一一赘述了。

Wifi的初始化

Wifi的初始化比较简单,所调用的API如下,后续的Wifi状态就是用回调处理的。
esp-idf示例:

esp-idf/examples/wifi/simple_wifi

void initialise_wifi()
{
    tcpip_adapter_init();
    global_wifi_event_group = xEventGroupCreate();
    ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();

    ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
    ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
    ESP_ERROR_CHECK( esp_wifi_start() );
    status.wifi_init_done = true;
}

ESP32所支持的Wifi的模式还是很丰富的:
Station模式、AP模式、Station和AP共存模式、混杂模式(用于监听Wifi包)、

WIFI的配置

IOT设备通常没有界面交互,所以当他作为station的时候,都面临一个问题,Wifi所连接的AP的ssid和密码如何配置呢?
ESP已经贴心的为我们想到了,并且提供了集中方式:

SmartConfig

SmartConfig 需要手机上一个APP来配合,手机APP来广播AP的SSID和PASSWORD,ESP32来监听空口上传输特定的包,并且从这些包中解析出SSID和PASSWORD。
上层的逻辑大致如此,底层的协议没有细看,应该是采用了802.11的某些机制来扩展的。
我们项目的配置用的是SmartConfig,目前来看效果还不错,成功率很高。

ESP NOW

ESP NOW是乐鑫自己定义的无连接的WIFI通讯协议,数据被封装在vendor-specific的的帧来传输。详细了解的话可以看文档。

自定义方案

如果支持蓝牙的话,也可以通过蓝牙来配置WIFI;
也可以设备默认为AP模式,客户端连上后配置WIFI之后切换成STATION模式;
这两种方案都需要较多的开发。

### ESP32 WiFi模块简介 ESP32 是一款集成 Wi-Fi 和蓝牙功能的芯片,适用于各种物联网应用开发。该模块支持多种通信协议并提供丰富的外设接口[^1]。 ### 开发环境搭建 为了方便开发者快速上手,在使用 ESP32 进行项目开发前需先配置好相应的开发工具链以及 IDE 环境。推荐采用 Arduino IDE 或者 Espressif 提供的 ESP-IDF 工具包来进行编程工作[^2]。 #### 安装Arduino IDE扩展: - 打开Arduino IDE首选项页面; - 将 `https://dl.espressif.com/dl/package_esp32_index.json` 添加到附加板管理器网址中; - 前往“工具”-> “开发板” -> “开发板管理器”,安装 esp32 支持库; ### 配置Wi-Fi连接 当完成上述准备工作之后就可以编写简单的程序来测试 ESP32 的 Wi-Fi 功能了。下面给出一段用于连接指定 SSID 及密码热点网络的例子代码[^3]: ```cpp #include <WiFi.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to the WiFi network"); } void loop(){} ``` 此段代码实现了设备启动后自动尝试接入预定义好的无线局域网,并通过串口打印当前状态直至成功建立连接为止。 ### HTTP GET请求实例 除了基本的联网能力之外,ESP32还能够轻松实现向服务器发送HTTP请求等功能。这里展示如何利用内置函数发起一次标准GET方法调用[^4]: ```cpp #include <WiFi.h> #include <HTTPClient.h> // 替换成自己的SSID和PASSWORD const char *ssid = "your_SSID"; const char *password = "your_PASSWORD"; String serverName = "http://jsonplaceholder.typicode.com/posts/1"; void setup(){ Serial.begin(115200); // 初始化WiFi客户端对象 WiFiClient client; // 设置静态IP地址(可选) IPAddress ip(192, 168, 1, 111); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); WiFi.config(ip, gateway, subnet); // 连接至Wi-Fi网络 WiFi.begin(ssid,password); while(WiFi.status()!=WL_CONNECTED){ delay(1000); Serial.print("."); } Serial.println("\nSuccessfully connected to Wi-Fi"); if(client.connect(serverName.c_str(), 80)){ String url="/posts/1"; // 发送HTTP GET命令给web服务端 client.println(String("GET ") + url +" HTTP/1.1"); client.println("Host: jsonplaceholder.typicode.com"); client.println("Connection: close\r\n"); unsigned long timeout= millis(); while(client.available()==0){ if(millis()-timeout>5000){ // 超时设置为五秒 Serial.println(">>> Client Timeout !"); break; } } while(client.available()){ String line=client.readStringUntil('\r'); Serial.print(line); } client.stop(); }else{ Serial.println("connection failed"); } } void loop(){} ``` 这段示例展示了完整的从初始化硬件资源到最后处理响应数据的过程,包括错误处理机制在内的全部细节均被考虑进去以确保可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值