Esp8266学习之旅⑥ 了解SmartConfig与Airkiss一键配网,给8266一键配网上云端。(带Demo)
来源:互联网 发布:搞笑网络流行语视频 编辑:程序博客网 时间:2024/06/07 09:02
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。
①、 Esp8266之 搭建开发环境,开始一个“hellow world”串口打印。
②、 Esp8266之 利用GPIO开始使用按钮点亮你的“第一盏灯”。
③、 Esp8266之 利用 “软件定时器 ” 定时0.5秒闪烁点亮一盏LED。
④ 、Esp8266之 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。
⑤ 、Esp8266之 原生乐鑫SDK高级使用之封装Post与Get请求云端,拿到“天气预报信息”。
⑥ 、Esp8266之 了解 SmartConfig与Airkiss一键配网,给8266配网上云端。无需把wifi名字密码写在固件里。
⑦ 、Esp8266之 了解 softAP热点配网模式原理,仿“机智云”定义自己的热点配网模式协议。
⑧、Esp8266之 你要找的8266作为UDP、TCP客户端或服务端的角色通讯,都在这了。
9、 Esp8266进阶之路第一篇: [小实战上篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
10、 Esp8266进阶之路第二篇: [小实战下篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
一、前言
听到 SmartConfig这个单词,字义上就是智能配置,但是我们电子发烧友都是称之为一键配网,
听到Airkiss这个单词就有点意思了。飞吻,象征着速度飞一般的快。
本博文的配网截图:
8266串口打印信息:
1.1、问题来了。
①、都不懂!SmartConfig和AirKiss是什么东东!
- 答:大家买智能设备时候都会出现以下界面提示您要输入wifi账号和密码!然后下一步操作搜索,设备成功连接网络成功就可以使用啦!这里就引出了, SmartConfig 和 AirKiss 就是给设备配网的方式,皆为无线操作给设备发wifi名字和密码的方式。
①、既然方式一样,二者有啥不同吗!
- 答:其实原理都是一样,手机发出广播,这广播里面有WIfi的名字 和密码,也就是接下来设备要接收的广播,以及去连接这个Wifi! ,其然 ,Airkiss是微信专门为物联网配网开发的,是对SmartConfig的进一步封装。如果你没有去集成微信开发环境去给设备配网,大不可去了解airkiss,只需要懂得用SmartConfig配网就好了!
二、原理。
这里我引用微信官网画的一个通俗易懂一张图片。图下的智能插座是要配网的设备,而微信客户端也就是我们的发送端:APP软件 ;
步骤
在APP软件输入将要连接的WIfi的名字和密码。
之后App会空中发网,带有wifi的名字和密码的信息暴露。
智能设备收到信息广播之后,尝试不断去连接,一旦连接成功。就会返回信息给APP通知配网成功!
三、走进8266一键配网的SmartConfig。
1. 翻开8266的编程SDK手册,看看有哪些已经封装好的接口,如图 :
2. 主要的函数方法,如图 :
3. 为了更好展示主要方法,我做个表格,大家可以方便查阅,如下 :
三、电路图与代码分析。
3、1 电路图。
仅仅只是一个按键触发配网模式,这个按键接GPIO14与GND端。
3、2 代码分析。
第一步:按键初始化,这里我使用的是机智云SOC方案提炼出来的按键中断初始化 hal_key.h 和 hal_key.c 文件封装。
第二步:按键触发回调的函数 :如下,其中的smartconfig_done是方法回调函数,见第三步骤。
//短按按键函数回调LOCAL void ICACHE_FLASH_ATTR keyShortPress(void) { //配置一键配网类型 smartconfig_set_type(SC_TYPE_ESPTOUCH); //开启station模式 wifi_set_opmode(STATION_MODE); //开始一键配网等待 smartconfig_start(smartconfig_done);}
第三步: smartconfig_done函数 : 如下
void ICACHE_FLASH_ATTR smartconfig_done(sc_status status, void *pdata) {switch (status) { //连接未开始,请勿在此阶段开始连接。 case SC_STATUS_WAIT: os_printf("SC_STATUS_WAIT\n"); break; //发现WIfi信道 case SC_STATUS_FIND_CHANNEL: os_printf("SC_STATUS_FIND_CHANNEL\n"); break; //得到wifi名字和密码 case SC_STATUS_GETTING_SSID_PSWD: os_printf("SC_STATUS_GETTING_SSID_PSWD\n"); sc_type *type = pdata; if (*type == SC_TYPE_ESPTOUCH) { os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n"); } else { os_printf("SC_TYPE:SC_TYPE_AIRKISS\n"); } break; //已经获取wifi名字与密码在连接路由器 case SC_STATUS_LINK: os_printf("SC_STATUS_LINK\n"); struct station_config *sta_conf = pdata; wifi_station_set_config(sta_conf); wifi_station_disconnect(); wifi_station_connect(); break; //成功获取到IP,连接路由完成。 case SC_STATUS_LINK_OVER: if (pdata != NULL) { uint8 phone_ip[4] = { 0 }; os_memcpy(phone_ip, (uint8*) pdata, 4); //打印发广播过来的设备IP地址 os_printf("Phone ip: %d.%d.%d.%d\n", phone_ip[0], phone_ip[1], phone_ip[2], phone_ip[3]); } //停止配置 smartconfig_stop(); break; }}
四、完整代码。
#include "../include/debug.h"#include "hal_key.h"#include "../include/uart.h"#include "ets_sys.h"#include "osapi.h"#include "ip_addr.h"#include "espconn.h"#include "mem.h"#include "user_interface.h"#include "smartconfig.h"#include "airkiss.h"//按键定义#define GPIO_KEY_NUM 1#define KEY_0_IO_MUX PERIPHS_IO_MUX_MTMS_U#define KEY_0_IO_NUM 14#define KEY_0_IO_FUNC FUNC_GPIO14LOCAL key_typedef_t * singleKey[GPIO_KEY_NUM]; LOCAL keys_typedef_t keys; LOCAL esp_udp ssdp_udp;LOCAL struct espconn pssdpudpconn;LOCAL os_timer_t ssdp_time_serv;uint8_t lan_buf[200];uint16_t lan_buf_len;uint8 udp_sent_cnt = 0;void ICACHE_FLASH_ATTR smartconfig_done(sc_status status, void *pdata) { switch (status) { //连接未开始,请勿在此阶段开始连接 case SC_STATUS_WAIT: os_printf("SC_STATUS_WAIT\n"); break; //发现信道 case SC_STATUS_FIND_CHANNEL: os_printf("SC_STATUS_FIND_CHANNEL\n"); break; //得到wifi名字和密码 case SC_STATUS_GETTING_SSID_PSWD: os_printf("SC_STATUS_GETTING_SSID_PSWD\n"); sc_type *type = pdata; if (*type == SC_TYPE_ESPTOUCH) { os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n"); } else { os_printf("SC_TYPE:SC_TYPE_AIRKISS\n"); } break; case SC_STATUS_LINK: os_printf("SC_STATUS_LINK\n"); struct station_config *sta_conf = pdata; wifi_station_set_config(sta_conf); wifi_station_disconnect(); wifi_station_connect(); break; //成功获取到IP,连接路由完成。 case SC_STATUS_LINK_OVER: os_printf("SC_STATUS_LINK_OVER \n\n"); if (pdata != NULL) { uint8 phone_ip[4] = { 0 }; os_memcpy(phone_ip, (uint8*) pdata, 4); os_printf("Phone ip: %d.%d.%d.%d\n", phone_ip[0], phone_ip[1], phone_ip[2], phone_ip[3]); } //停止配置 smartconfig_stop(); break; }}//用户自定义 RF_CAL 参数存放在 Flash 的扇区号uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void) { enum flash_size_map size_map = system_get_flash_size_map(); uint32 rf_cal_sec = 0; switch (size_map) { case FLASH_SIZE_4M_MAP_256_256: rf_cal_sec = 128 - 5; break; case FLASH_SIZE_8M_MAP_512_512: rf_cal_sec = 256 - 5; break; case FLASH_SIZE_16M_MAP_512_512: case FLASH_SIZE_16M_MAP_1024_1024: rf_cal_sec = 512 - 5; break; case FLASH_SIZE_32M_MAP_512_512: case FLASH_SIZE_32M_MAP_1024_1024: rf_cal_sec = 1024 - 5; break; default: rf_cal_sec = 0; break; } return rf_cal_sec;}void ICACHE_FLASH_ATTR user_rf_pre_init(void) {}//长按五秒按键回调LOCAL void ICACHE_FLASH_ATTR keyLongPress(void) {}//短按按键回调LOCAL void ICACHE_FLASH_ATTR keyShortPress(void) { os_printf("----------2 开始进去SmartConfig配网模式\n\n\n-----"); smartconfig_set_type(SC_TYPE_ESPTOUCH); wifi_set_opmode(STATION_MODE); smartconfig_start(smartconfig_done);}//按键初始化LOCAL void ICACHE_FLASH_ATTR keyInit(void) { singleKey[0] = keyInitOne(KEY_0_IO_NUM, KEY_0_IO_MUX, KEY_0_IO_FUNC, keyLongPress, keyShortPress); keys.singleKey = singleKey; keyParaInit(&keys);}void ICACHE_FLASH_ATTRuser_init(void) { uart_init(BIT_RATE_115200, BIT_RATE_115200); os_printf("SDK version:%s\n", system_get_sdk_version()); os_printf("----------BIT_RATE_115200\n\n\n-----"); keyInit();}
附加:相关调试工具下载。
适配安卓7.0的中文版调试一键配网APK下载: http://download.csdn.net/download/xh870189248/10141647
本博文的8266代码demo下载:http://download.csdn.net/download/xh870189248/10141671
8266教程系列的代码汇总:https://github.com/xuhongv/StudyInEsp8266
- Esp8266学习之旅⑥ 了解SmartConfig与Airkiss一键配网,给8266一键配网上云端。(带Demo)
- Esp8266学习之旅⑤ 8266原生乐鑫SDK高级使用之封装Post与Get请求云端,拿到“天气预报信息”。(带Demo)
- 【ESP8266】NONOS SDK开发, smartconfig/AirKiss与flash读写
- Esp8266学习之旅⑦ 了解softAP热点配网模式原理,仿“机智云”定义自己的热点配网模式协议。(带Demo)
- ESP8266学习笔记4:ESP8266的SmartConfig
- ESP8266学习笔记4:ESP8266的SmartConfig
- ESP8266学习笔记4:ESP8266的SmartConfig
- ESP8266学习笔记4:ESP8266的SmartConfig
- Esp8266学习之旅⑧ 你要找的8266作为UDP、TCP客户端或服务端的角色通讯,都在这了。(带Demo)
- Esp8266学习之旅④ 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。(附带demo)
- WIFI模块的各种配网方式之比较(串口AT、SmartConfig、微信Airkiss、WEB网页配网....)
- WIFI模块的各种配网方式之比较(串口AT、SmartConfig、微信Airkiss、WEB网页配网....)
- Esp8266学习之旅② 利用GPIO开始使用按钮点亮你的“第一盏灯”。(附带demo)
- Esp8266学习之旅③ 利用 " 软件定时器 " 定时0.5秒闪烁点亮一盏LED。(附带demo)
- Esp8266进阶之路⑨ 【小实战上篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)
- Esp8266进阶之路10 【小实战下篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)
- ESP8266 Smartconfig一键配置 NodeMCU
- ESP8266学习笔记之makefile
- input框只能输入数字的两种方法
- Sql Server的存储过程与Java代码相连接调用(一)
- Cannot create __weak reference in file using manual reference counting
- c++ 友元
- VMware:OpenStack与Kubernetes相辅相成
- Esp8266学习之旅⑥ 了解SmartConfig与Airkiss一键配网,给8266一键配网上云端。(带Demo)
- Centos7下添加开机自启动服务和脚本
- Mobx在ReactNative中的使用
- 指针与函数_函数指针
- 个人小程序注册
- 前端性能优化
- 解析Linux内核模块的链接顺序
- Qt setContentsMargins()函数详解
- 使用satis 搭建 自己composer 代码库 教程02