- 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。
1、 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 “Hellow World”。
2、 巧用eclipes编辑器,官方教程在在Windows下搭建esp32开发环境,打印 “Hellow World”。
3、 认识基本esp32的GPIO接口,开始点亮您的第一盏 LED和中断回调实现按键功能 。
4、体会esp32的强大的定时器功能, 实现定时2s闪烁一盏LED灯。
5、接触实践esp32的pwm宽度脉冲功能, 实现呼吸效果闪烁一盏LED灯。
6、smartConfig和微信airKiss在esp32的实现,一键配网轻松快捷连接路由器。
7、利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。
8、esp32上实现本地 UDP 客户端和服务端角色,在局域网内实现通讯。
9、esp32上实现本地 TCP 客户端和服务端角色,可断线重连原路返回数据。
10、乐鑫esp32 SDK编程利用rmt驱动ws2812七彩灯,实现彩虹渐变效果。
11、入门 乐鑫esp-adf 音频框架开发,esp32造一个蓝牙耳机,实现切换歌曲,获取歌曲信息等功能。
12、开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。
13、esp32 内置 dns 服务器,无需外网访问域名返回指定网页。
14、esp32 sdk编程实现门户强制认证,连接esp32热点之后,自动强制弹出指定的登录界面。
15、认识本地离线语音唤醒识别框架 esp-skainet ,实现较低成本的硬件语音本地识别控制。
16、学习本地语音唤醒离线识别框架 esp-skainet ,如何修改唤醒词? 如何自定义命令词?如何做意图动作?
17、全网首发,乐鑫esp32 sdk直连京东微联·小京鱼 · IoT开放平台,实现叮咚音响语音智能控制。
18、入门京东微联·小京鱼的控制面板H5开发,读懂vue语法,做自己的控制页面。
19、重磅开源,如何在微信小程序上ble蓝牙配网esp32,blufi的那些事!
20、一篇好文,开发过程中编译esp32固件太大,无法正常启动?教你如何自定义分区表partitions.csv。
文章目录
本篇博文目录:
文章目录
一. 前言;
- 每一款嵌入式的
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
协议!