本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。
一. 前言;
- 每一款嵌入式的
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);
注意点②:在
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);
- 最后截图如下:
五. 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
协议!