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


  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

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。


文章目录

      • 本篇博文目录:
      • 一. 前言;
      • 二. 编译官方`Demo`;
      • 三. `smartConfig`代码分析以及实现;
      • 四. `airKiss`代码分析以及实现;
      • 五. `airKiss`的爬坑记录,特记在此;
      • 六. 下载;

本篇博文目录:

文章目录

      • 本篇博文目录:
      • 一. 前言;
      • 二. 编译官方`Demo`;
      • 三. `smartConfig`代码分析以及实现;
      • 四. `airKiss`代码分析以及实现;
      • 五. `airKiss`的爬坑记录,特记在此;
      • 六. 下载;

一. 前言;


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

二. 编译官方Demo


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

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


  • 一般我都是把这个工程文件隔离开我们的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和串口打印数据!

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


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


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

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

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

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

esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);

  • 最后截图如下:

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


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


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

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


六. 下载;


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

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


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

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


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

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

你可能感兴趣的:(乐鑫Esp32,乐鑫Esp32学习之旅)