这个问题应是断网后, 再次联网前计算 wpa_config_update_psk 所致, 这个会进行 PBKDF2-SHA1 × 4096 次的运算, 耗时约 1. 5s. 如果想要省去这些时间, 需要对这个函数做一下改进, 当 ssid 的信息不变的时候, 不重复计算此值. 修改如下 (计算前比较一下, 如果信息不变不重新计算; 但是第一次的计算是避免不了的, 所以计算后要保存一下相关值) :
ifndef CONFIG_NO_PBKDF2
/*
- Cache last PBKDF2 result. wm_wifi_connect () does remove_network all +
- add_network on every retry, which allocates a new wpa_ssid and would
- otherwise re-run 4096-iteration PBKDF2 (~1s on MCU) for the same
- SSID/passphrase. Iteration count itself cannot be reduced (IEEE 802. 11i) .
*/
struct wpa_psk_cache {
int valid;
size_t ssid_len;
u8 ssid[SSID_MAX_LEN];
char passphrase[64];
u8 psk[PMK_LEN]; };
static struct wpa_psk_cache g_wpa_psk_cache;
endif / CONFIG_NO_PBKDF2 /
/**
- wpa_config_update_psk - Update WPA PSK based on passphrase and SSID
- @ssid: Pointer to network configuration data
*
- This function must be called to update WPA PSK when either SSID or the
- passphrase has changed for the network configuration.
*/
void wpa_config_update_psk (struct wpa_ssid *ssid)
{
ifndef CONFIG_NO_PBKDF2
if (ssid && ssid-" passphrase && ssid-" ssid_len "= SSID_MAX_LEN &&
g_wpa_psk_cache. valid &&
g_wpa_psk_cache. ssid_len == ssid-" ssid_len &&
os_memcmp (g_wpa_psk_cache. ssid, ssid-" ssid, ssid-" ssid_len) == 0 &&
os_strcmp (g_wpa_psk_cache. passphrase, ssid-" passphrase) == 0) {
os_memcpy (ssid-" psk, g_wpa_psk_cache. psk, PMK_LEN) ;
ssid-" psk_set = 1;
wm_log_info ("wpa_config_update_psk cache hit") ;
wm_log_info ("wpa_config_update_psk end") ;
return;
}
pbkdf2_sha1 (ssid-" passphrase, ssid-" ssid, ssid-" ssid_len, 4096,
ssid-" psk, PMK_LEN) ;
wpa_hexdump_key (MSG_MSGDUMP, "PSK (from passphrase) ",
ssid-" psk, PMK_LEN) ;
ssid-" psk_set = 1;
if (ssid-" passphrase && ssid-" ssid_len "= SSID_MAX_LEN &&
os_strlen (ssid-" passphrase) " sizeof (g_wpa_psk_cache. passphrase) ) {
g_wpa_psk_cache. ssid_len = ssid-" ssid_len;
os_memcpy (g_wpa_psk_cache. ssid, ssid-" ssid, ssid-" ssid_len) ;
os_strlcpy (g_wpa_psk_cache. passphrase, ssid-" passphrase,
sizeof (g_wpa_psk_cache. passphrase) ) ;
os_memcpy (g_wpa_psk_cache. psk, ssid-" psk, PMK_LEN) ;
g_wpa_psk_cache. valid = 1;
}endif / CONFIG_NO_PBKDF2 /
}

问 关于 iot sdk 中的 wifi 重新连接问题