李文濤 徐波
摘 要:介紹了VxWorks系統(tǒng)下實(shí)現(xiàn)FTP傳輸文件的方法,分析了使用FTP傳輸技術(shù)的優(yōu)勢(shì),探討了FTP傳輸技術(shù)在VxWorks系統(tǒng)下的具體應(yīng)用,就如何進(jìn)行實(shí)際應(yīng)用給出了解決方法,這在工程應(yīng)用中具有一定的實(shí)用價(jià)值。
關(guān)鍵詞:VxWorks;Tornado;Ftp;IP地址
中圖分類號(hào):TP393.093 文獻(xiàn)標(biāo)識(shí)碼:A DOI:10.15913/j.cnki.kjycx.2015.11.103
VxWorks是通過Tornado開發(fā)工具編譯完成的鏡像,可以單獨(dú)在目標(biāo)機(jī)上運(yùn)行,而雷達(dá)數(shù)據(jù)處理軟件是在VxWorks鏡像上的運(yùn)用程序,當(dāng)VxWorks鏡像中沒有嵌入FTP時(shí),就無法通過網(wǎng)絡(luò)訪問到目標(biāo)機(jī),同時(shí),也無法查看和更改目標(biāo)機(jī)中的文件。隨著計(jì)算機(jī)硬件配置日益完善、網(wǎng)絡(luò)技術(shù)越來越成熟,使用網(wǎng)絡(luò)訪問目標(biāo)機(jī)進(jìn)行數(shù)據(jù)交換更加方便、快捷。在雷達(dá)數(shù)據(jù)處理軟件運(yùn)行時(shí),通常會(huì)產(chǎn)生大量的數(shù)據(jù)文件,有時(shí)也可能需要修改內(nèi)部相關(guān)的配置文件。這就要求工作人員在開發(fā)雷達(dá)數(shù)據(jù)處理軟件時(shí)嵌入FTP,以實(shí)現(xiàn)網(wǎng)絡(luò)訪問功能。本文簡(jiǎn)要介紹了在應(yīng)用程序中嵌入FTP的方法。
1 VxWorks系統(tǒng)簡(jiǎn)介
VxWorks是美國風(fēng)河公司(Wind River)設(shè)計(jì)開發(fā)的一種嵌入式實(shí)時(shí)操作系統(tǒng),VxWorks是其嵌入式開發(fā)環(huán)境的關(guān)鍵組成部分,Tornado是其主機(jī)的集成開發(fā)環(huán)境。因?yàn)閂xWorks具有較高的可靠性,使其被廣泛應(yīng)用于軍工領(lǐng)域。20世紀(jì)90年代,VxWorks進(jìn)入國內(nèi)市場(chǎng),受到了用戶的好評(píng)。
VxWorks提供了類似UNIX的直接I/O、POSIX接口異步I/O等,并且提供了多種格式的文件系統(tǒng),包括dosFs、rtllFs、rawFs、tapeFs、cdromFs和TSFs等,適用于不同的應(yīng)用環(huán)境,通常將dosFs作為目標(biāo)機(jī)的文件系統(tǒng)。
2 FTP的實(shí)現(xiàn)方法
VxWorks操作系統(tǒng)下實(shí)現(xiàn)文件傳輸,在工程實(shí)踐中,經(jīng)常用到的有MS_DOS和FTP。其中,在基于MS_DOS下傳輸文件時(shí),在實(shí)踐中,經(jīng)常定義一些文件名大于8個(gè)字符的文件,這時(shí),MS_DOS就不能顯示文件全名,就會(huì)使得文件傳輸失敗,同時(shí),受移動(dòng)存儲(chǔ)介質(zhì)的約束(VxWorks有沒有加載USB驅(qū)動(dòng)、能不能識(shí)別U盤啟動(dòng)盤等約束),存在工作效率低等缺點(diǎn)。FTP文件傳輸系統(tǒng)則是在VxWorks操作系統(tǒng)下建立的文件傳輸服務(wù)器任務(wù),只需要在VxWorks操作系統(tǒng)下特定網(wǎng)卡上指定特定的IP地址,就可以通過客戶端實(shí)時(shí)傳輸目標(biāo)計(jì)算機(jī)上的文件,再通過上位機(jī)訪問、修改和傳輸文件等,輕松實(shí)現(xiàn)2臺(tái)計(jì)算機(jī)之間的文件傳輸。
在工程實(shí)際運(yùn)行過程中,在所需工程中加入已經(jīng)編譯好文件傳輸服務(wù)器任務(wù)的ftp.c文件,在軟件主程序函數(shù)(或相關(guān)初始化函數(shù))中添加與上位機(jī)通訊的網(wǎng)卡和IP地址,如果目標(biāo)計(jì)算機(jī)中有多塊網(wǎng)卡,一般使用主板集成的第一塊網(wǎng)卡,例如ipAttach(0,"fei")(根據(jù)目標(biāo)機(jī)bootrom和主板網(wǎng)卡芯片使用),ifAddrSet("fei0","127.12.12.1");然后加入FTP入口函數(shù),例如ftpStart("/ata0a")。
完成相關(guān)工作后,編譯并下載運(yùn)行該模塊就可實(shí)現(xiàn)FTP通訊,將上位機(jī)IP地址設(shè)置成與目標(biāo)機(jī)同一網(wǎng)段的IP地址,例如127.12.12.2.打開目標(biāo)計(jì)算機(jī)和上位機(jī),在網(wǎng)絡(luò)連接正常的狀態(tài)下,便可以通過上位機(jī)運(yùn)行ftp 127.12.12.1命令,使FTP訪問雷達(dá)計(jì)算機(jī)。利用ftp基本命令就可輕松實(shí)現(xiàn)2臺(tái)計(jì)算機(jī)間的信息交換,例如get,send,ls等基本命令。
3 程序?qū)嵗驼f明
下面簡(jiǎn)單介紹ftp.c文件,包含頭文件有:#include "vxWorks.h""taskLib.h""lstLib.h""sys/socket.h""netinet/in.h""netinet/tcp.h""sockLib.h""logLib.h""loginLib.h""fioLib.h""dosFsLib.h"和"net/protosw.h"等,主要變量BOOL vxftStartDone、vxftActive,int vxftServerSock、vxftMaxClients、vxftTaskId,LIST vxftSessionList,SEM_ID vxftMutexSem、vxftSignalSem等;包含的主要函數(shù)有ftpStart(),ftpStop(),vxftInit()等。
STATUS ftpStart(char * root)/*FTP服務(wù)函數(shù)入口*/
{
STATUS status;
char * rootDir;
rootDir = root;
status = vxftInit(rootDir);
出錯(cuò)處理,返回錯(cuò)誤值;
vxftStartDone = TRUE;
return OK;
}
STATUS ftpStop(void)/* FTP服務(wù)停止 */
{
STATUS status;
status = vxftDelete();/*任務(wù)刪除*/
出錯(cuò)處理,返回錯(cuò)誤值;
vxftStartDone = FALSE;
return OK;
}
STATUS vxftInit( char * root ) /*FTP任務(wù)函數(shù)*/
{
int stackSize, on = 1;
struct sockaddr_in ctrlAddr;
stackSize = 0;
/*建立FTP 控制 socket.*/
vxftServerSock = socket (AF_INET, SOCK_STREAM, 0);
socket錯(cuò)誤處理,返回錯(cuò)誤值;
/*客戶端聯(lián)接信號(hào)量等數(shù)據(jù)的建立*/
lstInit (&vxftSessionList);
vxftMutexSem=semMCreate(SEM_Q_FIFO | SEM_DELETE_SAFE);
vxftSignalSem = semBCreate (SEM_Q_FIFO, SEM_EMPTY);
…… 信號(hào)量出錯(cuò)處理,返回錯(cuò)誤值;
/*客戶端數(shù)據(jù)連接請(qǐng)求.*/
ctrlAddr.sin_family = AF_INET;
ctrlAddr.sin_addr.s_addr = INADDR_ANY;
ctrlAddr.sin_port = htons (vxftDefaultPort);
if (setsockopt (vxftServerSock, SOL_SOCKET, SO_REUSEADDR,
(char *) &on, sizeof (on)) < 0)
{
…… setsockopt錯(cuò)誤處理,返回錯(cuò)誤值;
}
if (bind vxftServerSock, (struct sockaddr *) &ctrlAddr,
sizeof (ctrlAddr)) < 0)
{
…… bind錯(cuò)誤處理,返回錯(cuò)誤值;
}
if (vxftMaxClients > (VXFT_TASK_MASK_SIZE * 32))
{
vxftMaxClients = VXFT_TASK_MASK_SIZE * 32;
}
if (listen (vxftServerSock, vxftMaxClients) < 0)
{
listen錯(cuò)誤處理,返回錯(cuò)誤值;
}
/*創(chuàng)建FTP服務(wù)任務(wù)*/
vxftTaskId=taskSpawn ("vxftTask",vxftTaskPriority,vxftTaskOptions,
vxftWorkTaskStackSize,(FUNCPTR) vxftTask,
(int)root,0,0,0,0,0,0,0,0,0);
任務(wù)創(chuàng)建失敗處理;
vxftActive = TRUE;
rebootHookAdd (vxftDelete);
return (OK);
}
4 結(jié)束語
本文從應(yīng)用程序的角度出發(fā),介紹了在Vxworks系統(tǒng)中嵌入FTP的方法。該方法已經(jīng)應(yīng)用于實(shí)際軟件設(shè)計(jì)中,而FTP的使用可以讓運(yùn)行在Windows系統(tǒng)下的上位機(jī)輕松訪問Vxworks系統(tǒng),實(shí)現(xiàn)2個(gè)系統(tǒng)間的網(wǎng)絡(luò)數(shù)據(jù)交換,為分析處理數(shù)據(jù)文件提供了便利。
〔編輯:白潔〕