乐鑫Esp32学习之旅⑥ smartConfig和微信airKiss在esp32的实现,一键配网轻松快捷连接路由器。(附带Demo)



一. 前言;


  • 每一款嵌入式的WI-Fi芯片,配网功能都是必不可少的。乐鑫有smartConfig,在esp32上也不例外,但是官方已经提到支持了airKiss,但是例程中是没有提供的,信中回到并不是很详细。既然乐鑫主打esp32那么肯定是支持airKiss的,这篇带大家进坑到出坑走走官方的smartConfigairkissesp32的实现!

二. 编译官方Demo


  • 下图的smart_config就是我们今天的主角!

这里写图片描述


  • 一般我都是把这个工程文件隔离开我们的IDF仓库的,因为拉取最新代码时候,有可能会合并代码,导致自己写好的代码不见了!
  • 命令符make menuconfig配置好SDK文件,修改下我们要下载的端口号;
  • 导进我们的eclipse编译器,配置好编译环境,此步骤见我的前面的博文!

三. smartConfig代码分析以及实现;


  • 对比esp8266的代码,如果没有freeRtos的基础,这个看不懂的!

    以个人水平理解如下:

    ①:smartConfig的模式开启和是否连接AP成功的判断,完全是异步进行的!
    ②:代码运行线是创建一个事件组,管理我们的smartConfig和获取系统的IP回调进行关联,等待系统初始化完毕后,开始进行smartConfig模式!
    ③:之后在smartConfig的回调事件中发信息给另外一个任务,告诉它已经连接成功!


注意①:在SC_STATUS_LINK_OVER的回调下面,对比esp8266,我们发现多了下行代码,看见方法名字,字面理解就是向wifi_event_group这个事件组,发送了ESPTOUCH_DONE_BIT的消息,以表示通过smartConfig连接成功了路由器!

xEventGroupSetBits(wifi_event_group, ESPTOUCH_DONE_BIT);

注意点②:在esp_event_loop_init()设置的回调事件,是一个设置轮询在回调的方法,在其的方法回调中,拦截了三个状态:SYSTEM_EVENT_STA_STARTSYSTEM_EVENT_STA_GOT_IPSYSTEM_EVENT_STA_DISCONNECTED,后面的系统断开连接回调,估计只是为了适配这个demo!实际开发中,不需要拦截这个!

switch (event->event_id) {
    //系统初始化完成的回调
    case SYSTEM_EVENT_STA_START:
        xTaskCreate(smartconfig_example_task, "smartconfig_example_task", 4096,
                NULL, 3, NULL);
        break;
    //系统获取到AP分配的IP的回调
    case SYSTEM_EVENT_STA_GOT_IP:
        xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
        break;
    //系统断开连接回调
    case SYSTEM_EVENT_STA_DISCONNECTED:
        esp_wifi_connect();
        xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
        break;
    default:
        break;
    }

注意③:配网回调的函数,是乐鑫专门封装的,和esp8266的一样的,只是在连接成功后,并没有立刻停止配置,而是通过异步方式通知任务去停止配置!

static void sc_callback(smartconfig_status_t status, void *pdata) {
    switch (status) {
    //连接未开始,请勿在此阶段开始连接。
    case SC_STATUS_WAIT:
        ESP_LOGI(TAG, "SC_STATUS_WAIT");
        break;
    //发现WIfi信道
    case SC_STATUS_FIND_CHANNEL:
        ESP_LOGI(TAG, "SC_STATUS_FINDING_CHANNEL");
        break;
    //得到wifi名字和密码
    case SC_STATUS_GETTING_SSID_PSWD:
        ESP_LOGI(TAG, "SC_STATUS_GETTING_SSID_PSWD");
        break;
   //已经获取wifi名字与密码在连接路由器
    case SC_STATUS_LINK:
        ESP_LOGI(TAG, "SC_STATUS_LINK");
        wifi_config_t *wifi_config = pdata;
        ESP_LOGI(TAG, "SSID:%s", wifi_config->sta.ssid);
        ESP_LOGI(TAG, "PASSWORD:%s", wifi_config->sta.password);
        ESP_ERROR_CHECK(esp_wifi_disconnect());
        ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, wifi_config));
        ESP_ERROR_CHECK(esp_wifi_connect());
        break;
    //成功获取到IP,连接路由完成。
    case SC_STATUS_LINK_OVER:
        ESP_LOGI(TAG, "SC_STATUS_LINK_OVER");
        if (pdata != NULL) {
            uint8_t phone_ip[4] = { 0 };
            memcpy(phone_ip, (uint8_t*) pdata, 4);
            ESP_LOGI(TAG, "Phone ip: %d.%d.%d.%d\n", phone_ip[0], phone_ip[1],
                    phone_ip[2], phone_ip[3]);
        }
        //发送消息到另外一个任务,告诉它已经连接成功
        xEventGroupSetBits(wifi_event_group, ESPTOUCH_DONE_BIT);
        break;
    default:
        break;
    }
}

注意点⑤:在外面的主任务里面有个死循环,不断等待轮询标志位:

    while (1) {
        uxBits = xEventGroupWaitBits(wifi_event_group,
                CONNECTED_BIT | ESPTOUCH_DONE_BIT, true, false, portMAX_DELAY);
        //如果获取的标志位是成功获取IP,则表示成功连接到了Wi-Fi        
        if (uxBits & CONNECTED_BIT) {
            ESP_LOGI(TAG, "WiFi Connected to ap");
        }

       //如果获取的标志位是一键配置的回调表示成功连接到了Wi-Fi,则停止配置    
        if (uxBits & ESPTOUCH_DONE_BIT) {
            ESP_LOGI(TAG, "smartconfig over");
            esp_smartconfig_stop();
            vTaskDelete(NULL);
        }
    }

  • 注意我们在设置配网方式触发为:esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS),支持smartConfigairKiss就可以了,下图是smartConfig的手机APP和串口打印数据!

这里写图片描述


四. airKiss代码分析以及实现;


  • 说到airKiss,我不得不说下我们需要的工具,大家必须要有一个可以支持airKiss的微信公众号,乐鑫官方的或者是安信可也可以,这个接口是微信提供的,界面不得让你修改!或者你使用我在微信下载用的安卓APK来实验配网也行的!
  • 这里贴下微信定义airKiss的说明链接:http://iot.weixin.qq.com/wiki/new/index.html?page=4-1-2

下图是我总结的配网图,大家也没必要把airKiss当作那么神秘!

这里写图片描述

切记,使用官方的代码是没有指定配网类型为airKiss的,需要我们手动改如下:

esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);

  • 最后截图如下:

这里写图片描述


五. airKiss的爬坑记录,特记在此;


  • 在今天2018/5/30为止,最新的代码并没有兼容到airKiss,可能是由于官方人员疏忽,在代码合并时候,少合并了代码,导致airKiss配网不成功!所以,我这切换到分支release/v3.0,再进行一次编译即可!希望乐鑫可以修补下这个bug!!

这里写图片描述


六. 下载;


本硬件的代码下载:https://download.csdn.net/download/xh870189248/10447731

esp32汇总工程,欢迎star,收到第一更新信息:https://github.com/xuhongv/StudyInEsp32


  • 如果您没有关注带airKiss的公众号,可以扫描下面二维码下载安卓版的APK,仅作调试用!注意这个是airKiss协议!

这里写图片描述


  • 这个是我自己制作的smartConfig的安卓APK!注意这个是smartConfig协议!

这里写图片描述

猜你喜欢

转载自blog.csdn.net/xh870189248/article/details/80430077