在聯發科 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();  // 重新載入參數

        最後,連線成功後,從終端機畫面可以看到取得 IP 位址,我們再用 ping 指令測試看看是否連通。
圖二:WiFi 連線成功後,取得 IP 位址


TCP stream

        前面已經成功將無線網路連線到的 AP ,並取得 IP 位址後,我們需要建立 TCP 連線才能傳送資料。TCP 連線需要調用底下幾個 API 函數,並將 lwip/api.h 和 lwip/ip_addr.h 的標頭檔包含進來,接著呼叫的步驟如下。
圖三:建立 TCP 連線的函數

        最後,TCP 連線後,我們從筆電上的測試工具開始測試資料傳輸,經過幾分鐘的壓力測試,發現這塊板子的連線很穩定,應該說 Filogic SDK 底層的驅動程式與晶片都設計得不錯。

留言

此網誌的熱門文章

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[筆記] Raspberry Pi 樹莓派的軟體開發

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[應用] 藍芽 BLE client/server 架構:BLE remote controller

[筆記] Visual Studio 遠端偵錯的設定步驟

[應用] STM32 DFU (Device Firmware Upgrade)

[模組] 無線資料傳輸:nRF905 和 nRF24L01 (以 Arduino 為控制器)