点击上方“嘉友创信息科技”,选择关注,干货福利,第一时间奉上。
smartConfig成功率不高,而且5G路由器越来越多,成功率也会越来越低。
AP配网成功率接近100%
SDK中没找到AP配网源码,基于tcp server例子修改。
【AP配网】WiFi 设备处于 AP 模式, 配置工具(手机/电脑)连上这个 AP, 对这个 AP 发送联网信息, WiFi 设备收到后, 切换到 STA 模式, 利用收到的信息联网。此方法优势是成功率基本在 100%, 缺点是配置过程复杂, 做出的产品不易操作。
产品中可以先使用smartConfig快配一次网,失败后切换到AP配网。
AP配网的具体实现可以看源码和配网过程的log。
判断是否被配过网,配置为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, 5, NULL);
}
}
解析Client的json数据,保存SSID和password
//解析数据包,提取ssid和pw
rx_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);
}
}
工程目录结构
首次使用,需要AP对ESP32进行配网;
使用电脑连上ESP32的AP,在使用TCP client助手发送ssid和pw;
复位重启后,从flash中获取配网信息,联网。
谢谢关注,下期更精彩。
收藏、点赞、在看一键三连
-- END --