第十五章 ESP32的SmartConfig一键配置

学习目的及目标

  • 掌握SmartConfig原理和工作过程
  • 掌握乐鑫ESP32的SmartConfig的程序设计

WIFI设备配网方法

  • WiFi设备处于AP模式,配置工具连上这个AP,对这个AP发送联网信息,WiFi设备收到后,切换到STA模式,利用收到的信息联网。此方法优势是成功率基本在100%,缺点是配置过程复杂,做出的产品不易操作。
  • SmartConfig模式,采用UDP广播模式(UDP接收IP地址是255.255.255.255)。WiFi设备先scan环境下AP,得到AP的相关信息,如工作的channel,然后配置WiFi芯片工作在刚才scan到的channel上去接收UDP包,如果没有接收到,继续配置工作在另外的channel上,如此循环,直到收到UDP包为止。随意此种办法的致命缺点是成功率只有70%,而且有些路由器不支持;优点显而易见,一键完成。

SmartConfig特点

SmartConfig又名快连,当前设备在没有和其他设备建立任何实际性通信链接的状态下,一键配置该设备接入WIFI。

SmartConfig实际应用场景

现状:当手机端接入路由器的WIFI,未联网设备没有任何实质性通信链接(信息孤立)。

目的:如果未联网设备也想接入这个路由器的WIFI。

分析:肯定需要有人告诉未联网设备,路由器的WIFI的账号(ssid)和密码(password)。

手段:目前我们只有手机端的资源可以利用,所以只能手机端告诉设备未联网设备。

未联网设备在没有任何链接的情况下,手机端是如何告知未联网设备信息,这个方法就是SmartConfig。流程如下图所示:

软件设计

ESP32的SmartConfig主逻辑

 

ESP32的SmartConfig详细过程逻辑

 

ESP32的SmartConfig接口介绍

  • SmartConfig配置类型设置函数:esp_smartconfig_set_type();

回调原型

esp_err_t esp_smartconfig_set_type

(

smartconfig_type_t type

)

函数功能

SmartConfig配置类型设置函数

参数

[in] type,

typedef enum {

SC_TYPE_ESPTOUCH = 0, /*ESPTouch */

SC_TYPE_AIRKISS, /*AirKiss */

SC_TYPE_ESPTOUCH_AIRKISS, /*ESPTouch and AirKiss */

} smartconfig_type_t;

返回值

ESP_OK:成功

other : 失败

  • SmartConfig开始一键配置函数esp_smartconfig_start();

回调原型

esp_err_t esp_smartconfig_start

(

sc_callback_t cb,

...

)

函数功能

SmartConfig开始一键配置函数

参数

[in] cb:smartconfig的回调函数

[in] ...:log 1:串口输出log; 0: 串口直接输出结果

返回值

ESP_OK:成功

other : 失败

  • SmartConfig停止一键配置函数esp_smartconfig_stop();

回调原型

esp_err_t esp_smartconfig_stop(void)

函数功能

WIFI状态机回调函数

参数

返回值

ESP_OK:成功

other : 失败

更多更详细接口请参考官方指南

ESP32的SmartConfig总结

初始化wifi配置后,程序会根据WIFI的实时状态,在回调函数中给出状态返回,所以只需要在回调中进行相关操作,STA开始事件触发SC开始进行一键配置,在SC的回调中处理SC配置过程的事件。

SmartConfig任务编写

配置工具设置->注册smartconfig回调函数->等待回调事件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

void smartconfig_example_task(void *parm)

{

    EventBits_t uxBits;

    //使用ESP-TOUCH配置工具

    ESP_ERROR_CHECK(esp_smartconfig_set_type(SC_TYPE_ESPTOUCH));

    //开始sc,注册回调

    ESP_ERROR_CHECK(esp_smartconfig_start(sc_callback));

    while (1)

    {

        //死等事件组:CONNECTED_BIT | ESPTOUCH_DONE_BIT

        uxBits = xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT | ESPTOUCH_DONE_BIT, true, false, portMAX_DELAY);

        

        //sc结束事件

        if (uxBits & ESPTOUCH_DONE_BIT)

        {

            ESP_LOGI(TAG, "smartconfig over");

            esp_smartconfig_stop();

            //此处smartconfig结束,并且连上设置的AP,以下可以展开自定义工作了

            

            vTaskDelete(NULL);

        }

        //连上ap事件

        if (uxBits & CONNECTED_BIT)

        {

            ESP_LOGI(TAG, "WiFi Connected to ap");

        }

    }

}

SmartConfig的回调函数解析

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

static void sc_callback(smartconfig_status_t status, void *pdata)

{

    switch (status)

    {

    case SC_STATUS_WAIT:                    //等待配网

        ESP_LOGI(TAG, "SC_STATUS_WAIT");

        break;

    case SC_STATUS_FIND_CHANNEL:            //扫描信道

        ESP_LOGI(TAG, "SC_STATUS_FINDING_CHANNEL");

        break;

    case SC_STATUS_GETTING_SSID_PSWD:       //获取到ssid和密码

        ESP_LOGI(TAG, "SC_STATUS_GETTING_SSID_PSWD");

        break;

    case SC_STATUS_LINK:                    //连接获取的ssid和密码

        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);

        //断开smartconfig

        ESP_ERROR_CHECK(esp_wifi_disconnect());

        //设置获取的ap和密码到寄存器

        ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, wifi_config));

        //连接AP

        ESP_ERROR_CHECK(esp_wifi_connect());

        break;

    case SC_STATUS_LINK_OVER:               //连接上配置后,结束

        ESP_LOGI(TAG, "SC_STATUS_LINK_OVER");

        //打印ip

        if (pdata != NULL)

        {

            uint8_t phone_ip[4] = {0};

            memcpy(phone_ip, (uint8_t *)pdata, 4);

            ESP_LOGI(TAG,"Phoneip:%d.%d.%d.%d\n",phone_ip[0],phone_ip[1],phone_ip[2], phone_ip[3]);

        }

        //发送sc结束事件

        xEventGroupSetBits(wifi_event_group, ESPTOUCH_DONE_BIT);

        break;

    default:

        break;

    }

}

WiFi连接的回调函数解析

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

static esp_err_t event_handler(void *ctx, system_event_t *event)

{

    switch (event->event_id)

    {

    case SYSTEM_EVENT_STA_START://STA开始工作

        ESP_LOGI(TAG1, "SYSTEM_EVENT_STA_START");

        //创建smartconfig任务

        xTaskCreate(smartconfig_example_task, "smartconfig_example_task", 4096, NULL, 3, NULL);

        break;

    case SYSTEM_EVENT_STA_GOT_IP://获取IP

        ESP_LOGI(TAG1, "SYSTEM_EVENT_STA_GOT_IP");

        //sta链接成功,set事件组

        xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);

        break;

    case SYSTEM_EVENT_STA_DISCONNECTED://断线

        ESP_LOGI(TAG1, "SYSTEM_EVENT_STA_DISCONNECTED");

        //断线重连

        esp_wifi_connect();

        xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);

        break;

    default:

        break;

    }

    return ESP_OK;

}

 

效果展示

 

SmartConfig总结

  • SC工作模式也是初始化+回调的状态机结构,逻辑清晰简单,方便学习和使用。
  • Wifi回调和SC回调相互协调工作,保证产品顺利配网成功。
  • 配网工具有很多,我这里(IOS)测试使用两个,安卓使用后者。并且官方有源码

  • 此处没有将配网信息保存,产品中要保存,下次就不用再配了,如果配错了,可以加按键操作清楚配置信息,官方已经把这个功能做好了,自己怼怼。
  • 源码地址:https://github.com/xiaolongba/wireless-tech

点我->更多ESP32开发指南系列目录

发布了45 篇原创文章 · 获赞 48 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_24550925/article/details/85854611