Notas de estudio ESP8266 (1) -Uso de la interfaz Smartconfig

1. Análisis de ventajas y desventajas

  1. En comparación con la tecnología de distribución de red AP tradicional, la configuración de red de una tecla simplifica la operación de conexión y los pasos de conexión, la operación es más simple y la velocidad de conexión se acelera.
  2. Muchos enrutadores no admiten la función de transmisión UDP. Por ejemplo, los amplificadores wifi o algunos enrutadores que desactivan la transmisión UDP de forma predeterminada, harán que el paquete de transmisión falle y el dispositivo WIFI no pueda obtener el paquete de transmisión.
  3. Cuando 5G y 2.4G están en la misma frecuencia, si el teléfono móvil actual está conectado a la banda de frecuencia 5G, el paquete de transmisión enviado es 5G, y actualmente todos los dispositivos WIFI solo admiten 2.4G, lo que hace que sea imposible obtener el paquete de transmisión.
  4. Incluso si obtiene el nombre y la contraseña del enrutador a través de muchas dificultades, muchos enrutadores no son compatibles con la comunicación LAN (como la red de invitados del enrutador)
  5. Hay varios enrutadores en el entorno actual con el mismo nombre, lo que hace que el teléfono móvil y el dispositivo WIFI no se conecten bajo el mismo enrutador, lo que hará que la dirección MAC transmitida por el dispositivo wifi no pueda ser obtenida por la aplicación móvil, lo que provocará la falla de enlace.

Dos, análisis de código

La interfaz Smartconfig se encuentra en ESP8266_NONOS_SDK / include / smartconfig.h .

Paso 1) Incluya el archivo de encabezado

#include "wb_protocol.h"
#include "ip_addr.h"
#include "smartconfig.h"
#include "user_smartconfig.h"
#include "user_esp_platform.h"
#include "mscp_wifi.h"

Paso 2) Definiciones relacionadas

static os_timer_t s_smartConfigCheckIpTimer;
static os_timer_t s_tcpPingTimer;
static os_timer_t s_tcpLongTimeTimer;

const uint16 SMART_CONFIG_CHEAK_IP_TIMER = 15000; 
const uint16 SMART_PLATFORM_PING_PERIOD = 30000;  	
const uint16 SMART_PLATFORM_LONG_TIME_PERIOD = 60000;

Paso 3) Función de inicialización

void ICACHE_FLASH_ATTR
SmartConfig(void)
{
    
    
	//获取WIFI默认SSID和密码
	wifi_station_get_config_default(&s_softap);

	//WIFI配置
	wifi_station_set_config(&s_softap);
	wifi_station_disconnect();
	wifi_station_connect();

	//进入自动识别是否接入网络
	startSmartConfigCheckIpTimer();
}

Paso 4) Funciones de devolución de llamada relacionadas

/**
 @brief 开始进入自动识别是否接入网络
 @param 无
 @return 无
*/
static void ICACHE_FLASH_ATTR
startSmartConfigCheckIpTimer(void)
{
    
    
    os_timer_disarm(&s_smartConfigCheckIpTimer);
    os_timer_setfn(&s_smartConfigCheckIpTimer, (os_timer_func_t *) SmartConfigCheckIpTimerCallback, NULL);
    os_timer_arm(&s_smartConfigCheckIpTimer, SMART_CONFIG_CHEAK_IP_TIMER, true);
}

/**
 @brief 停止进入自动识别是否接入网络
 @param 无
 @return 无
*/
static void ICACHE_FLASH_ATTR
stopSmartConfigCheckIpTimer(void)
{
    
    
	os_timer_disarm(&s_smartConfigCheckIpTimer);
}

/**
 @brief 进入自动识别是否接入网络
 @param resetFlag -[in] 重启标志
 @return 无
*/
static void ICACHE_FLASH_ATTR
SmartConfigCheckIpTimerCallback(void)
{
    
    
	static uint8 connect_status = 0;
	if(wifi_station_get_connect_status() == STATION_GOT_IP)
	{
    
    
		//连接上次路由器成功
		connect_status = 0;
		wifi_set_opmode_current(STATIONAP_MODE);// 设置为 STA+AP模式
	}
	else
	{
    
    
		//连接上次路由器失败
		if(connect_status == 0)
		{
    
    
			connect_status = 1;
			//进入Smartconfig
			user_smartConfig_start();
			os_printf("\n ========================================================== \n ");
			os_printf(" Err : Reason, unable to connect to router ! \n \n");
			os_printf(" wifi ssid : %s \n", s_softap.ssid);
			os_printf(" wifi password : %s \n", s_softap.password);
			os_printf(" ========================================================== \n ");
		}
	}
}

Paso 5) función Smartconfig

/**
 @brief 一键配网切换到AP配网的定时器的回调函数
 @param resetFlag -[in] 重启标志
 @return 无
*/
static void ICACHE_FLASH_ATTR
user_smartConfig_start(void)
{
    
    
	smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);
	wifi_set_opmode(STATION_MODE);
	smartconfig_start(smartconfig_done);
	os_printf("\n smartconfig_start(smartconfig_done); \n");
}

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");
		//开启长时间未连接重新进入Smartconfig
		startSendLongTimeTimer();
		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");
		}
		//关闭长时间未连接重新进入Smartconfig
		stopSendLongTimeTimer();
		break;

	case SC_STATUS_LINK:
		os_printf("SC_STATUS_LINK\n");
		struct station_config *sta_conf = pdata;
		s_softap = *sta_conf;
		wifi_station_set_config(sta_conf);
		wifi_station_disconnect();
		wifi_station_connect();
		//开启超时定时器
		startSendPingTimer();
		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]);
		}
		//停止超时定时器
		stopSendPingTimer();
		//停止配置
		smartconfig_stop();
		//切换WIFI模式
		wifi_set_opmode(STATIONAP_MODE);
		break;

	default:
		os_printf("\n ========================================================== \n ");
		os_printf("\n Err: Smartconfig mode failed !! \n");
		os_printf("\n ========================================================== \n ");
		startSendPingTimer();
		break;
	}
}

Paso 6) Función de devolución de llamada de tiempo de espera de conexión

/**
 @brief 开始发送PING的定时器
 @param 无
 @return 无
*/
static void ICACHE_FLASH_ATTR
startSendPingTimer(void)
{
    
    
	os_timer_disarm(&s_tcpPingTimer);
	os_timer_setfn(&s_tcpPingTimer, (os_timer_func_t *) sendPingTimerCallback, NULL);
    os_timer_arm(&s_tcpPingTimer, SMART_PLATFORM_PING_PERIOD, false);
}

/**
 @brief 停止发送PING的定时器
 @param 无
 @return 无
*/
static void ICACHE_FLASH_ATTR
stopSendPingTimer(void)
{
    
    
	os_timer_disarm(&s_tcpPingTimer);
}

/**
 @brief 发送PING定时器的回调函数
 @param 无
 @return 无
*/
static void ICACHE_FLASH_ATTR
sendPingTimerCallback(void)
{
    
    
	//停止配置
	smartconfig_stop();
	user_smartConfig_start();
	os_printf("\n ========================================================== \n ");
	os_printf("\n Err: Smartconfig Connect Timeout !! ");
	os_printf("\n ========================================================== \n ");
}


Escrito por ChiKong_Tam el 23 de julio de 2020
• Referencia: [ESP8266] NONOS_Parte 2: Principio y aplicación de SmartConfig en la configuración de red de una tecla
• Referencia: Red de distribución AirKiss WeChat _fengfeng0328's Blog-CS ... Blog de _CSDN

Supongo que te gusta

Origin blog.csdn.net/qq_42209354/article/details/107536935
Recomendado
Clasificación