具体详见上个帖子:【电子DIY作品】基于Ai-WB2的10A远程通断器
此次主要更新加了【自动配网】功能
1、自动配网工作流程

2、存储wifi信息
存储wifi信息使用easyflash系统。这方面SDK中已经移植好,有例程参考。路径如下:
D:\Work\MCU\Ai_Thinker\Ai_WB2\SDK\Ai-Thinker-WB2\applications\storage\easyflash\easyflash
找到自己存放SDK的路径,可以先看一下例程了解一下。
不过还有个疑惑:内存地址分配不太清楚,没找到地址映射表。还有easyflash大小配置不太清楚。
3、wifi事件
static void event_cb_wifi_event(input_event_t* event, void* private_data)
{
switch (event->code)
{
case CODE_WIFI_ON_INIT_DONE:{
blog_info("<<<<<<<<< init wifi done <<<<<<<<<<");
wifi_mgmr_start_background(&conf);
}
break;
case CODE_WIFI_ON_MGMR_DONE:
{
uint8_t err = 0;
blog_info("<<<<<<<<< startting soft ap <<<<<<<<<<<");
if(ef_get_str("ssid_save", (char *)ssid_save, sizeof(ssid_save))){
printf("ssid_save:%s\r\n", ssid_save);
}else{
printf("read ssid_save error");
}
if(ef_get_str("password_save", (char *)password_save, sizeof(password_save))){
printf("password_save:%s\r\n", password_save);
}else{
printf("read password_save error");
}
wifi_sta_connect((char *)ssid_save,(char *)password_save);
}
break;
case CODE_WIFI_ON_AP_STARTED: // ap成功启动
{
blog_info("<<<<<<<<< startt soft ap OK<<<<<<<<<<<");
// 开启一个配网HTML页面
xTaskCreate(&start_ap_http_server, "server_task", 1024 * 10, NULL, 5, &ap_task_handle);
}
break;
case CODE_WIFI_ON_AP_STOPPED:
break;
case CODE_WIFI_ON_AP_STA_ADD: // 从设备连接到wb2的ap
{
blog_info("<<<<<<<<< station connent ap <<<<<<<<<<<");
}
break;
case CODE_WIFI_ON_AP_STA_DEL:
{
blog_info("<<<<<<<<< station disconnet ap <<<<<<<<<<<");
}
break;
case CODE_WIFI_ON_SCAN_DONE:
{
blog_info("[APP] [EVT] SCAN Done %lld", aos_now_ms());
}
break;
case CODE_WIFI_ON_DISCONNECT://STA模式连接错误
{
static uint8_t err = 0;
printf("STA disconnected %d=====================================\r\n",++err);
if(err >3)
{
AutoConnectWifi = 1;
wifi_sta_disconnect();
wifi_ap_start();
}
}
break;
case CODE_WIFI_ON_CONNECTING:
{
blog_info("[APP] [EVT] Connecting %lld", aos_now_ms());
}
break;
case CODE_WIFI_CMD_RECONNECT:
{
blog_info("[APP] [EVT] Reconnect %lld", aos_now_ms());
}
break;
case CODE_WIFI_ON_CONNECTED:
{
blog_info("[APP] [EVT] connected %lld", aos_now_ms());
}
break;
case CODE_WIFI_ON_PRE_GOT_IP:
{
blog_info("[APP] [EVT] connected %lld", aos_now_ms());
}
break;
case CODE_WIFI_ON_GOT_IP:
{
blog_info("[APP] [EVT] GOT IP %lld", aos_now_ms());
blog_info("[SYS] Memory left is %d Bytes", xPortGetFreeHeapSize());
printf("successfuly connect!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n");
//到这一步就已经配网成功了,删不删除原来的AP任务都行
if(AutoConnectWifi)
{
if (ap_task_handle != NULL) {
vTaskDelete(ap_task_handle);
ap_task_handle = NULL; // 避免悬空指针
}
wifi_ap_stop();
//配网成功,保存wifi信息
printf("****************Save Wifi Info****************\r\n");
ef_set_str("ssid_save", (char *)ssid_save);
ef_set_str("password_save", (char *)password_save);
}
mqtt_start();
}
break;
case CODE_WIFI_ON_PROV_SSID:{
printf("[APP] [EVT] [PROV] [SSID] %lld: %s\r\n", aos_now_ms(),
event->value ? (const char *)event->value : "UNKNOWN");
if (ssid) {
vPortFree(ssid);
ssid = NULL;
}
ssid = (char *)event->value;
}break;
case CODE_WIFI_ON_PROV_BSSID:
{
blog_info("[APP] [EVT] [PROV] [BSSID] %lld: %s",
aos_now_ms(),
event->value ? (const char*)event->value : "UNKNOWN");
if (event->value)
{
vPortFree((void*)event->value);
}
}
break;
case CODE_WIFI_ON_PROV_PASSWD:{
printf("[APP] [EVT] [PROV] [PASSWD] %lld: %s\r\n", aos_now_ms(),
event->value ? (const char *)event->value : "UNKNOWN");
if (password) {
vPortFree(password);
password = NULL;
}
password = (char *)event->value;
} break;
case CODE_WIFI_ON_PROV_CONNECT:{
printf("[APP] [EVT] [PROV] [CONNECT] %lld\r\n", aos_now_ms());
printf("connecting to %s:%s...\r\n", ssid, password);
wifi_sta_connect(ssid, password);
} break;
case CODE_WIFI_ON_PROV_DISCONNECT:
{
//blog_info("[APP] [EVT] [PROV] [DISCONNECT] %lld", aos_now_ms());
}
break;
default:
{
blog_info("[APP] [EVT] Unknown code %u, %lld", event->code, aos_now_ms());
/*nothing*/
}break;
}
}
整体代码见附件。
参考资料
1、AI-WB2 配网【上】
2、AI-WB2的easyflash文件系统,刷写程序、OTA后不掉数据哦
附件
附件:WLRelayV1.0(添加自动配网).rar