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

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