-
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。
一. 前言;
- 每一款嵌入式的
WI-Fi
芯片,配网功能都是必不可少的。乐鑫有smartConfig
,在esp32
上也不例外,但是官方已经提到支持了airKiss
,但是例程中是没有提供的,信中回到并不是很详细。既然乐鑫主打esp32
那么肯定是支持airKiss
的,这篇带大家进坑到出坑走走官方的smartConfig
和airkiss
在esp32
的实现!
二. 编译官方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);
- 1
注意点②:在
esp_event_loop_init()
设置的回调事件,是一个设置轮询在回调的方法,在其的方法回调中,拦截了三个状态:SYSTEM_EVENT_STA_START
、SYSTEM_EVENT_STA_GOT_IP
和SYSTEM_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)
,支持smartConfig
和airKiss
就可以了,下图是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);
- 1
- 最后截图如下:
五. airKiss
的爬坑记录,特记在此;
- 在今天2018/5/30为止,最新的代码并没有兼容到
airKiss
,可能是由于官方人员疏忽,在代码合并时候,少合并了代码,导致airKiss
配网不成功!所以,我这切换到分支release/v3.0
,再进行一次编译即可!希望乐鑫可以修补下这个bug!!
六. 下载;
本硬件的代码下载:https://download.csdn.net/download/xh870189248/10447731
esp32
汇总工程,欢迎star
,收到第一更新信息:https://github.com/xuhongv/StudyInEsp32