在聯發科 Filogic 物聯網板上, 實現 WiFi 功能的開發與測試
在前一篇文章 "在 MediaTek Filogic 130A 系統中,如何新增模組到 SDK 項目裡" https://han-ya.blogspot.com/2022/02/mediatek-filogic-130a-sdk.html 學習如何新增自己程式的 module,基於前文所創建的範例,我們往下延伸學習操作這塊板子的 WiFi 無線網路的功能。本文分成四段,開發板的 command line interface (CLI)、WiFi scan、WiFi連線、建立TCP連線與測試。為了更清楚說明如何在 Filogic 板子上設計開發無線網路的程式,底下提供完整的教學影片連結。
教學影片連結:https://youtu.be/THd5xSAUOyk
CLI (Command Line)
當板子接上 COM port 後,我們可以透過這個介面輸入指令,開發板就會運行指令的動作。其中,"wifi" 是一個指令集,當輸入 "wifi init" 後,板子的系統就會對 WiFi physical layer 做初始化的動作,接著開始掃描四周環境,檢查環境的無線網路 SSID,一直掃描,直到我們輸入 "wifi deinit" 結束這過程。通常,這種 CLI 指令多半用來 debug 或者熟悉開發板時候才會操作,我們開發程式不可能用 CLI 來設計,必須呼叫相關的 API 函數,設計出符合自己功能的程式碼。
WiFi scan
我們開發 WiFi scan 需要調用底下幾個 API 函數,首先要將 wifi_api.h 和 nvdm.h 的標頭檔包含進來,接著呼叫的步驟,如下:
printf("\n1. wifi_config_init called -----------------\n\n");
if( wifi_config_init(&wifi_config) != 0 ) // 從 flash 載入無線網路的配置
{
printf("wifi_config_init failed !!!!!!\n");
}
printf("\n2. wifi_init called -----------------\n\n");
config.opmode = wifi_config.opmode;
wifi_init(&config, NULL); // 初始化無線網路的實體層
vTaskDelay(1000);
printf("\n3. wifi_connection_scan_init called -----------------\n\n");
wifi_connection_scan_init(ap_list, size); // 初始化 scan
printf("\n4. wifi_connection_start_scan called -----------------\n\n");
wifi_connection_start_scan(NULL, 0, NULL, 0, 0); // 啟動 scan
最後,調用 wifi_connection_stop_scan 函數來停止掃描的動作,同時我們將掃描後的結果列印出來,結果則放在 ap_list 變數裡,如下:
WiFi connect
我們開發無線網路的 AP 連線需要調用底下幾個 API 函數,一樣要將 wifi_api.h 和 nvdm.h 的標頭檔包含進來,接著呼叫的步驟是註冊幾個回調函數,如下:
printf("\n1. wifi callback function -----------------\n\n"); // 註冊回調函數
wifi_connection_register_event_handler(WIFI_EVENT_IOT_CONNECTED, user_wifi_connected_callback);
wifi_connection_register_event_handler(WIFI_EVENT_IOT_DISCONNECTED, user_wifi_disconnected_callback);
wifi_connection_register_event_handler(WIFI_EVENT_IOT_INIT_COMPLETE, user_wifi_init_callback);
wifi_connection_register_event_handler(WIFI_EVENT_IOT_CONNECTION_FAILED, user_wifi_conn_fail_callback);
printf("\n2. wifi_init called -----------------\n\n");
config.opmode = WIFI_MODE_STA_ONLY;
wifi_init(&config, NULL); // 初始化無線網路的實體層
vTaskDelay(1000);
printf("\n3. wifi config called -----------------\n\n"); // 設定無線網路的連線參數
wifi_config_set_opmode(WIFI_MODE_STA_ONLY);
wifi_config_set_ssid(WIFI_PORT_STA, (uint8_t *)"ASUS_5G", strlen("ASUS_5G"));
wifi_config_set_security_mode(WIFI_PORT_STA, WIFI_AUTH_MODE_WPA2_PSK, WIFI_ENCRYPT_TYPE_AES_ENABLED);
wifi_config_set_wpa_psk_key(WIFI_PORT_STA, (uint8_t *)"0915xxxxxx", strlen("0915xxxxxx"));
printf("\n4. wifi_config_reload_setting called -----------------\n\n");
wifi_config_reload_setting(); // 重新載入參數
TCP stream
前面已經成功將無線網路連線到的 AP ,並取得 IP 位址後,我們需要建立 TCP 連線才能傳送資料。TCP 連線需要調用底下幾個 API 函數,並將 lwip/api.h 和 lwip/ip_addr.h 的標頭檔包含進來,接著呼叫的步驟如下。
圖三:建立 TCP 連線的函數 |
最後,TCP 連線後,我們從筆電上的測試工具開始測試資料傳輸,經過幾分鐘的壓力測試,發現這塊板子的連線很穩定,應該說 Filogic SDK 底層的驅動程式與晶片都設計得不錯。
留言