发帖
2 0 0

基于Ai-WB2的10A无线通断器-更新

大猫的鱼
论坛元老

17

主题

380

回帖

6300

积分

论坛元老

积分
6300
电子DIY 50 2 11 小时前

具体详见上个帖子:【电子DIY作品】基于Ai-WB2的10A远程通断器

此次主要更新加了【自动配网】功能

1、自动配网工作流程

QQ_1747792749994.png

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后不掉数据哦

附件

upload 附件:WLRelayV1.0(添加自动配网).rar

──── 0人觉得很赞 ────

使用道具 举报

把这篇链接附到上一个DIY帖子里面去
9 小时前
爱笑 发表于 2025-5-21 10:56
把这篇链接附到上一个DIY帖子里面去

好!
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28771 个
  • 话题数: 41128 篇