在鴻蒙設備上運行TFTP服務器,實現文件上傳、下載、保存
https://harmonyos.51cto.com/#zz
昨天唐老師發布了能夠運行在鴻蒙Hi3861開發板上的Python解釋器,還不知道的可以去看看唐老師的帖子,:-)
我們知道,Python是一種腳本語言,可以解釋執行,不需要編譯。有了Python解釋器,大家可能會希望——如果能直接把Python腳本文件上傳到開發板上,然后發個命令就可以執行就好了,而不需要像C代碼那樣需要編譯、燒錄 才能運行。
于是,我開始嘗試——將TFTP服務器移植到鴻蒙Hi3861開發板上。經過半天的移植和一天的調試,終于把TFTP服務器在Hi3861上移植成功了。
沒錯,在內存352KB、閃存2M 的Hi3861開發板上成功運行了一個TFTP服務器,你可以將PC上的文件上傳到開發板上,而且可以斷電持久保存!當然,你上傳的文件不能太大。
以下是整個移植和調試過程中的關鍵過程記錄。
TFTP是什么?
TFTP是簡單文件傳輸協議 Trivial File Transfer Protocol的英文縮寫。
TFTP是基于UDP的,協議本身比較簡單,它的RFC 1350官方文檔也只有11頁(TCP的RFC 793文檔有85頁)。
如果大家如果有興趣,完全可以自己從零實現一個;而我為了能夠快速驗證在Hi3861的可行性,選擇了直接移植。
TFTP服務器實現了哪些功能?
已經實現了TFTP該有的功能:
1. 支持文件上傳;
2. 支持文件下載;
3. 支持文件持久保存,使用了鴻蒙的文件系統API接口。
運行效果
PC通過網線連接無線路由器,虛擬機網口橋接網卡,IP地址:192.168.1.157;
開發板連接通過WiFi連接到無線路由器,IP地址:192.168.1.151 ;
下圖是運行效果,左邊為虛擬機上 shell 執行的命令;

其中的用到的幾個命令格式為:
1. put命令,將本地文件上傳到服務器,格式:put localfile remotefile
2. get命令,將服務器上的文件下載到本地,格式:get remotename localname
3. quit命令,退出會話
想嘗試運行效果的,可以直接下載本帖附件的代碼進行編譯,運行。
如何編譯
1. 將本帖附件tftp代碼解壓到openharmony源碼頂層目錄;
2. 修改openharmony的build/lite/product/wifiiot.json文件:
將其中的//applications/sample/wifi-iot/app替換為//tftp:tftp;
3. 在openharmony源碼的頂層目錄,執行python build.py wifiiot;
調試過程中用到的工具和方法
除了常規的串口工具之外,還用到了幾個工具(移植其他網絡協議時可供參考):
1. tftp 客戶端命令行工具(sudo apt install tftp下載);
2. tcpdump 抓包工具;
抓取某個網口上的全部數據包:sudo tcpdump -i eth0 -w tftp.pcap (-i 指定網口,-w 指定保存的數據文件)
3. WireShark 抓包和分析工具;
tcpdump抓到的數據包是這個網口上的全部數據,用WireShark分析時,可以用過濾表達式:tftp 過濾TFTP協議的數據包;
解決的問題
移植過程中解決了這么幾個問題:
1. 解決了報錯"Mode too long/not NULL terminated",導致的上傳失敗;
2. 解決了文件讀取時size超過了文件實際尺寸的問題;
3. 解決了DATA響應數據為空,導致的下載失敗的問題;
附件說明
1. tftp.zip 是本移植項目源碼;
2. rfc1350.pdf 是TFTP協議參考文檔。
https://harmonyos.51cto.com/#zz