[應用] 在 ARM 控制器上實現一個 FTP server

設計說明

        最近實現在 STM32F207 控制器 (ARM-based) 上面實現一個簡易型的 FTP server,其目的是為了文件的傳輸。原本在一般電腦上的 FTP 是一個再平常不過的網路功能,但是在 embedded system 上如果沒有搭配 Linux 作業系統,通常要自行開發 FTP 才行。圖一所示就是 STM32F207 控制器,上面有網路介面和 SD 卡,我們希望從遠端能將儲存在 SD 卡上的文檔經由網路下載,而這個 SD 卡就類似硬碟的功能。

        為了完成 FTP 服務器,在控制器上面的源代碼需要準備:作業系統檔案管理系統TCP/IP 網路協定。幸運地,STM32 晶片已經整合了 FreeRTOS 作業系統,LwIP 網路通訊協定,還有 FatFs 檔案管理系統,所以我們必須利用這些材料將 FTP 的功能完成。由於晶片速度和記憶體的容量有限,FTP 服務器必須考量到連線的數量,只能盡量簡化 FTP 的功能,否則整個系統容易崩潰。另外,FreeRTOS 作業系統是運行在多工環境,當 FTP 連線存取多個檔案時,必須考慮到檔案管理的保護 (critical section),這部分的設計如果沒保護好,檔案管理也可能會崩潰進而當機。底下是我們實現了一個簡易型 FTP server 的驗證,分別從命令列的 ftp 或者從檔案總管的 ftp 連線。

圖一:STM32F207 控制器

實現設計

        我們從電腦上打開命令列,輸入 ftp xxx.xxx.xxx.xxx 就可以連上 FTP 服務器,成功連上後可以看到圖二的結果。因為設計為了方便簡單,所以不需要輸入使用者與密碼,直接就能登錄成功。在開發 FTP 服務器時,以最輕便的功能來考量,所以我們不可能把所有 FTP 協定的指令通通設計進去,只能實現一些常用的以及必要的指令,比如圖二和圖三的 dir / ls / quit 就是必要的指令。
圖二:命令列的 FTP 連上服務器

圖三:輸入 FTP 指令的結果

        除了以命令列的方式執行 FTP,也可以從檔案總管上面輸入 ftp://xxx.xxx.xxx.xxx 來登錄FTP 服務器,如圖四所示。從檔案總管登錄的好處就是 Windows 會把 FTP 所需的指令一次就做完,不用像命令列一樣依序地手動輸入。不過,這種方式需要用到更多 FTP 協定的指令,在設計 FTP server 必須考慮進去,最好的方法就是用 Wireshark 抓封包,看看有哪些指令還沒有實現的,再一一實現。
圖四:從檔案總管連上 FTP 服務器

參考資料

[1] FreeRTOS - www.freertos.org
[2] LwIP - https://savannah.nongnu.org/projects/lwip/
[3] FatFs - http://elm-chan.org/fsw/ff/00index_e.html

留言

此網誌的熱門文章

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

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

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

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

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

[筆記] Android APP BLE範例程式 -- BluetoothLeGatt

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