[开源重卷]ESP32之AP配网(自定义保存配网信息),esp-idf v4.3.1

文摘   科技   2022-10-08 07:50   江苏  

点击上方“嘉友创信息科技”,选择关注,干货福利,第一时间奉上。

00
重卷的意义

  • smartConfig成功率不高,而且5G路由器越来越多,成功率也会越来越低。

  • AP配网成功率接近100%

  • SDK中没找到AP配网源码,基于tcp server例子修改。

01
AP配网过程

【AP配网】WiFi 设备处于 AP 模式, 配置工具(手机/电脑)连上这个 AP, 对这个 AP 发送联网信息, WiFi 设备收到后, 切换到 STA 模式, 利用收到的信息联网。此方法优势是成功率基本在 100%, 缺点是配置过程复杂, 做出的产品不易操作。

产品中可以先使用smartConfig快配一次网,失败后切换到AP配网。

02
软件流程

AP配网的具体实现可以看源码和配网过程的log。

03
关键代码

判断是否被配过网,配置为AP还是STA

static void wifi_init(void){    ESP_ERROR_CHECK(esp_netif_init());    ESP_ERROR_CHECK(esp_event_loop_create_default());    if(_user_wifi_data.en){        //已经存在账号密码,sta联网        ESP_LOGI(TAG, "not need SmartConfig and AP.");           wifi_init_sta();    }      else{        //没有账号密码,AP配网        ESP_LOGI(TAG, "need AP get ssid and pw.");            wifi_init_softap();         xTaskCreate(tcp_server_task, "tcp_server"4096, (void*)AF_INET, 5NULL);    }}

解析Client的json数据,保存SSID和password

//解析数据包,提取ssid和pwrx_pack = cJSON_Parse(rx_buffer);if(rx_pack == NULL){    ESP_LOGE(TAG, "parse fail : errno %d", errno);    return ;}//提取json数据cjson_ap_pass = cJSON_GetObjectItem(rx_pack, "AP_pass");cjson_ssid = cJSON_GetObjectItem(rx_pack, "ssid");cjson_pw = cJSON_GetObjectItem(rx_pack, "pw");ESP_LOGI(TAG, "AP_pass: %s", cjson_ap_pass->valuestring);ESP_LOGI(TAG, "ssid:%s", cjson_ssid->valuestring);ESP_LOGI(TAG, "pw:%s", cjson_pw->valuestring);//判断合法if( (memcmp(cjson_ap_pass->valuestring,"enable",strlen("enable"))==0) &&    \    (strlen(cjson_ssid->valuestring)>=1) &&    \    (strlen(cjson_pw->valuestring)>=8)){    //保存账号密码到flash    _user_wifi_data.en = 1;    memset(_user_wifi_data.ssid,0,sizeof(_user_wifi_data.ssid));    memset(_user_wifi_data.pw,0,sizeof(_user_wifi_data.pw));    memcpy(_user_wifi_data.ssid, cjson_ssid->valuestring, strlen((const char*)cjson_ssid->valuestring));    memcpy(_user_wifi_data.pw, cjson_pw->valuestring, strlen((const char*)cjson_pw->valuestring));    CRCXMODEM_Make_CRC(&_user_wifi_data.en, sizeof(user_wifi_data) - 2, 0xffff);    write_user_flash(&_user_wifi_data.en, sizeof(user_wifi_data));    //回发应答包    int written = send(sock, tx_buffer, strlen(tx_buffer), 0);    if (written < 0) {        ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno);    }    //重启    ESP_LOGI(TAG, "Restarting now.");    fflush(stdout);    esp_restart();}  

tcp server建立过程

void tcp_server_task(void *pvParameters){       //新建socket    int listen_sock = socket(addr_family, SOCK_STREAM, ip_protocol);    //绑定    int err = bind(listen_sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));    //监听    err = listen(listen_sock, 1);    while (1) {        ESP_LOGI(TAG, "Socket listening");        //接受client连接        int sock = accept(listen_sock, (struct sockaddr *)&source_addr, &addr_len);        //收发数据        do_retransmit(sock);    }}

工程目录结构

05
验证

首次使用,需要AP对ESP32进行配网;

使用电脑连上ESP32的AP,在使用TCP client助手发送ssid和pw;

复位重启后,从flash中获取配网信息,联网。

06
源码下载

公众号后台回复关键词【ESP32】,发送后收到链接即可下载
举例:关键词【步进电机】

谢谢关注,下期更精彩。

收藏、点赞、在看一键三连

-- END --

开源一小步
定期发布开源项目,欢迎关注!!
 最新文章