1.長所と短所の分析
- 従来のAPネットワーク配信テクノロジーと比較して、ワンキーネットワーク構成により、接続操作と接続手順が簡素化され、操作が簡単になり、接続速度が加速されます。
- 多くのルーターはUDPブロードキャスト機能をサポートしていません。たとえば、wifiアンプ、またはデフォルトでUDPブロードキャストをオフにする一部のルーターは、ブロードキャストパケットを失敗させ、WIFIデバイスはブロードキャストパケットを取得できません。
- 5Gと2.4Gが同じ周波数にある場合、現在の携帯電話が5G周波数帯域に接続されている場合、送信されるブロードキャストパケットは5Gであり、現在すべてのWIFIデバイスは2.4Gしかサポートしていないため、ブロードキャストパケットを取得できません。
- 苦労してルーターの名前とパスワードを取得しても、多くのルーターはLAN通信をサポートしていません(ルーターのゲストネットワークなど)
- 現在の環境に同じ名前のルーターがいくつかあります。これにより、携帯電話とWIFIデバイスが同じルーターの下で接続されなくなり、WifiデバイスによってブロードキャストされるMACアドレスがモバイルAPPによって取得できなくなり、バインディングエラーが発生します。
2、コード分析
Smartconfigインターフェースは、ESP8266_NONOS_SDK / include / smartconfig.hにあります。
手順1)ヘッダーファイルを含める
#include "wb_protocol.h"
#include "ip_addr.h"
#include "smartconfig.h"
#include "user_smartconfig.h"
#include "user_esp_platform.h"
#include "mscp_wifi.h"
ステップ2)関連する定義
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;
ステップ3)初期化関数
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();
}
ステップ4)関連するコールバック関数
/**
@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 ");
}
}
}
ステップ5)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;
}
}
手順6)接続タイムアウトコールバック関数
/**
@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 ");
}
• 2020年7月23日にChiKong_Tamが作成
•参照:[ESP8266] NONOS_Part 2:ワンキーネットワーク構成でのSmartConfigの原理とアプリケーション
•参照:AirKiss WeChat配布ネットワーク_fengfeng0328のブログ-CS ... _CSDNブログ