關於iot sdk中的wifi重新連接問題

發布於 2026-08-24 17:54:03

在例程中station連接wifi過程中會影響其他任務運行,
關閉dengdai
下面以main函數串口打印為例

int main(void)
{
wifi_init_sta();
while(1)
{   
    wm_log_error("SYS RUN ");
    vTaskDelay(pdMS_TO_TICKS(500));
}
return 0;

}

例如以上代碼程序,在重新連接時,打印數據會暫停,這種改如何解決

查看更多

關注者
0
被浏覽
660
2 個回答
abcd
abcd 認證專家 2026-08-26
我只是個路過的老年人~

對應的log以及時間戳發出來看下具體現象。

wm_cui
wm_cui 2026-09-18
這家夥很懶,什麼也沒寫!

這個問題應是斷網後,再次聯網前計算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 /

}

撰寫答案

請登錄後再發布答案,點擊登錄

發布
問題

分享
好友

手機
浏覽

掃碼手機浏覽