家里有智能家居的小伙伴应该都知道,给新买的玩具配网上线都是直接安装教程扫描二维码然后安装个软件输入家里路由器的账号密码或者直接到一个网页输入这种联网方式,然而我们在玩8266还没出新手村之前都是将WiFi的账号密码写死在程序里,开机直接上网的新手模式,这就很没有使用价值了。
ESP8266-RTOS-SDK中提供了两种(SmartConfig)智能配网的方案接口:
乐鑫自主研发的 ESP-TOUCH 协议采用的是 Smart Config(智能配置)技术来帮助用户将嵌入了 ESP8266EX 的设备连接至 Wi-Fi 网络。用户只需在手机上进行简单操作即可实现智能配置。
乐鑫官方提供了ESP-TOUCH的APK源码,见*乐鑫官方APK*, 通过手机APP实现智能配网,就不需要将WiFi写入固件了。
AirKiss是微信硬件平台提供的一种WIFI设备快速入网配置技术,要使用微信客户端的方式配置设备入网,需要设备支持AirKiss技术。目前已经有越来越多的芯片和模块厂商,提供了支持AirKiss技术的方案。
以智能插座为例,下文将说明AirKiss技术的应用方案和交互流程。智能插座属于物联网智能控制类设备,它可用于家电(比如电灯、热水器等)的智能化开关控制。智能插座的特点是小型化且低功耗,显而易见,该设备并不适合于配置屏幕与键盘等输入外设。在这种情况下,AirKiss技术能完美解决其SSID与密码的传输、设置问题。
AirKiss技术对应用设备的硬件几乎没有额外的要求,配置时需要设备能够进入AirKiss模式。在本例中,智能插座在按下了配置按键之后,指示灯闪烁进入AirKiss模式,成为了AirKiss技术中信息的接收方。用户则可以使用微信手机客户端,成为AirKiss技术中的信息发送方。
以上介绍转自微信硬件平台对AirKiss的介绍。
在SDK中,乐鑫有提供针对以上两种的配网接口,使用方便。由于是智能配网,所以在代码中不需要写入WiFi的相关信息,所以像前几篇博客中连接WiFi的函数可就更加简单了,只需要打开WiFi功能即可,具体的WiFi信息在SmartConfig获取后自动填入再连接具体的WiFi。
static void initialise_wifi(void)
{
tcpip_adapter_init();
wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
ESP_ERROR_CHECK( esp_wifi_start() );
}
针对SmartConfig的接口乐鑫官方集成度高,所以接口不多但是全:
头文件
#include "esp_smartconfig.h"
const char *esp_smartconfig_get_version(void); //获取SmartConfig的版本
esp_err_t esp_smartconfig_start(sc_callback_t cb, ...); //启动SmartConfig,配置ESP设备来连接AP,接收通过手机广播发出包含目标AP的SSID和密码的特殊数据包。
esp_err_t esp_smartconfig_stop(void); //停止SmartConfig,释放esp_smartconfig_start所占用的缓冲区。
esp_err_t esp_esptouch_set_timeout(uint8_t time_s); //设置SmartConfig超时时间,计时从SC_STATUS_FIND_CHANNEL状态开始。如果超时,SmartConfig将重新启动。(时间范围15s~255s,偏移:45s。)
esp_err_t esp_smartconfig_set_type(smartconfig_type_t type);//设置SmartConfig的协议类型。
esp_err_t esp_smartconfig_fast_mode(bool enable);//设置SmartConfig模式。默认的正常模式。
设置智能配网整体流程分三步:
SmartConfig事件和wifi事件类似,事件有一下5种触发事件,根据触发事件编写回调函数
typedef enum {
SC_STATUS_WAIT = 0, /**< 等待启动连接 */
SC_STATUS_FIND_CHANNEL, /**< 找到了目标通道 */
SC_STATUS_GETTING_SSID_PSWD, /**< 获取了目标AP的SSID和密码 */
SC_STATUS_LINK, /**< 连接到目标AP */
SC_STATUS_LINK_OVER, /**< 成功连接到AP */
} smartconfig_status_t;
需要以回调函数作为参数的函数是:
esp_err_t esp_smartconfig_start(sc_callback_t cb, ...);
**这里特别要注意的是 sc_callback_t **
typedef void (*sc_callback_t)(smartconfig_status_t status, void *pdata);
说明我要传递给 esp_smartconfig_start 的回调函数必须要包含两个参数,*smartconfig_status_t status, void pdata
前文提到,根据 smartconfig_status_t 编写SmartConfig回调函数
switch (status) {
case SC_STATUS_WAIT: //等待启动连接
ESP_LOGI(TAG, "SC_STATUS_WAIT");
break;
case SC_STATUS_FIND_CHANNEL: //找到了目标通道
ESP_LOGI(TAG, "SC_STATUS_FINDING_CHANNEL");
break;
case SC_STATUS_GETTING_SSID_PSWD://获取SSID和PSWD
ESP_LOGI(TAG, "SC_STATUS_GETTING_SSID_PSWD");
break;
case SC_STATUS_LINK: //连接到目标AP
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;
case SC_STATUS_LINK_OVER: //成功连接到AP
ESP_LOGI(TAG, "SC_STATUS_LINK_OVER");
if (pdata != NULL) {
sc_callback_data_t *sc_callback_data = (sc_callback_data_t *)pdata;
switch (sc_callback_data->type) {
case SC_ACK_TYPE_ESPTOUCH:
ESP_LOGI(TAG, "Phone ip: %d.%d.%d.%d", sc_callback_data->ip[0], sc_callback_data->ip[1], sc_callback_data->ip[2], sc_callback_data->ip[3]);
ESP_LOGI(TAG, "TYPE: ESPTOUCH");
break;
case SC_ACK_TYPE_AIRKISS:
ESP_LOGI(TAG, "TYPE: AIRKISS");
break;
default:
ESP_LOGE(TAG, "TYPE: ERROR");
break;
}
}
xEventGroupSetBits(wifi_event_group, ESPTOUCH_DONE_BIT);
break;
default:
break;
}
工作模式
esp_err_t esp_smartconfig_set_type(smartconfig_type_t type);
参数 | 解析 |
---|---|
type | SmartConfig工作模式 |
typedef enum {
SC_TYPE_ESPTOUCH = 0, /**< ESPTouch */
SC_TYPE_AIRKISS, /**< AirKiss */
SC_TYPE_ESPTOUCH_AIRKISS, /**< ESPTouch and AirKiss */
} smartconfig_type_t;
SmartConfig启动
esp_err_t esp_smartconfig_start(sc_callback_t cb, ...);
参数 | 解析 |
---|---|
cb | SmartConfig回调函数 |
简述功能:为了尽可能模拟正常智能家居产品,实现一个开机即检测室内有害气体浓度的设备,没有上网也能将检测到的有害气体浓度显示在OLED上,同时可以长按按键进去配网模式指示灯1开始闪烁,然后通过微信扫码进行智能配网,配网成功后指示灯2常亮,实现数据上传的功能,如果MQTT服务器在云上,那么就可以实现远程监控了,MQTT在线掉线可视。
我的GITHUB
我的个人博客
CSDN