李文涛 徐波
摘 要:介绍了VxWorks系统下实现FTP传输文件的方法,分析了使用FTP传输技术的优势,探讨了FTP传输技术在VxWorks系统下的具体应用,就如何进行实际应用给出了解决方法,这在工程应用中具有一定的实用价值。
关键词:VxWorks;Tornado;Ftp;IP地址
中图分类号:TP393.093 文献标识码:A DOI:10.15913/j.cnki.kjycx.2015.11.103
VxWorks是通过Tornado开发工具编译完成的镜像,可以单独在目标机上运行,而雷达数据处理软件是在VxWorks镜像上的运用程序,当VxWorks镜像中没有嵌入FTP时,就无法通过网络访问到目标机,同时,也无法查看和更改目标机中的文件。随着计算机硬件配置日益完善、网络技术越来越成熟,使用网络访问目标机进行数据交换更加方便、快捷。在雷达数据处理软件运行时,通常会产生大量的数据文件,有时也可能需要修改内部相关的配置文件。这就要求工作人员在开发雷达数据处理软件时嵌入FTP,以实现网络访问功能。本文简要介绍了在应用程序中嵌入FTP的方法。
1 VxWorks系统简介
VxWorks是美国风河公司(Wind River)设计开发的一种嵌入式实时操作系统,VxWorks是其嵌入式开发环境的关键组成部分,Tornado是其主机的集成开发环境。因为VxWorks具有较高的可靠性,使其被广泛应用于军工领域。20世纪90年代,VxWorks进入国内市场,受到了用户的好评。
VxWorks提供了类似UNIX的直接I/O、POSIX接口异步I/O等,并且提供了多种格式的文件系统,包括dosFs、rtllFs、rawFs、tapeFs、cdromFs和TSFs等,适用于不同的应用环境,通常将dosFs作为目标机的文件系统。
2 FTP的实现方法
VxWorks操作系统下实现文件传输,在工程实践中,经常用到的有MS_DOS和FTP。其中,在基于MS_DOS下传输文件时,在实践中,经常定义一些文件名大于8个字符的文件,这时,MS_DOS就不能显示文件全名,就会使得文件传输失败,同时,受移动存储介质的约束(VxWorks有没有加载USB驱动、能不能识别U盘启动盘等约束),存在工作效率低等缺点。FTP文件传输系统则是在VxWorks操作系统下建立的文件传输服务器任务,只需要在VxWorks操作系统下特定网卡上指定特定的IP地址,就可以通过客户端实时传输目标计算机上的文件,再通过上位机访问、修改和传输文件等,轻松实现2台计算机之间的文件传输。
在工程实际运行过程中,在所需工程中加入已经编译好文件传输服务器任务的ftp.c文件,在软件主程序函数(或相关初始化函数)中添加与上位机通讯的网卡和IP地址,如果目标计算机中有多块网卡,一般使用主板集成的第一块网卡,例如ipAttach(0,"fei")(根据目标机bootrom和主板网卡芯片使用),ifAddrSet("fei0","127.12.12.1");然后加入FTP入口函数,例如ftpStart("/ata0a")。
完成相关工作后,编译并下载运行该模块就可实现FTP通讯,将上位机IP地址设置成与目标机同一网段的IP地址,例如127.12.12.2.打开目标计算机和上位机,在网络连接正常的状态下,便可以通过上位机运行ftp 127.12.12.1命令,使FTP访问雷达计算机。利用ftp基本命令就可轻松实现2台计算机间的信息交换,例如get,send,ls等基本命令。
3 程序实例和说明
下面简单介绍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等;包含的主要函数有ftpStart(),ftpStop(),vxftInit()等。
STATUS ftpStart(char * root)/*FTP服务函数入口*/
{
STATUS status;
char * rootDir;
rootDir = root;
status = vxftInit(rootDir);
出错处理,返回错误值;
vxftStartDone = TRUE;
return OK;
}
STATUS ftpStop(void)/* FTP服务停止 */
{
STATUS status;
status = vxftDelete();/*任务删除*/
出错处理,返回错误值;
vxftStartDone = FALSE;
return OK;
}
STATUS vxftInit( char * root ) /*FTP任务函数*/
{
int stackSize, on = 1;
struct sockaddr_in ctrlAddr;
stackSize = 0;
/*建立FTP 控制 socket.*/
vxftServerSock = socket (AF_INET, SOCK_STREAM, 0);
socket错误处理,返回错误值;
/*客户端联接信号量等数据的建立*/
lstInit (&vxftSessionList);
vxftMutexSem=semMCreate(SEM_Q_FIFO | SEM_DELETE_SAFE);
vxftSignalSem = semBCreate (SEM_Q_FIFO, SEM_EMPTY);
…… 信号量出错处理,返回错误值;
/*客户端数据连接请求.*/
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错误处理,返回错误值;
}
if (bind vxftServerSock, (struct sockaddr *) &ctrlAddr,
sizeof (ctrlAddr)) < 0)
{
…… bind错误处理,返回错误值;
}
if (vxftMaxClients > (VXFT_TASK_MASK_SIZE * 32))
{
vxftMaxClients = VXFT_TASK_MASK_SIZE * 32;
}
if (listen (vxftServerSock, vxftMaxClients) < 0)
{
listen错误处理,返回错误值;
}
/*创建FTP服务任务*/
vxftTaskId=taskSpawn ("vxftTask",vxftTaskPriority,vxftTaskOptions,
vxftWorkTaskStackSize,(FUNCPTR) vxftTask,
(int)root,0,0,0,0,0,0,0,0,0);
任务创建失败处理;
vxftActive = TRUE;
rebootHookAdd (vxftDelete);
return (OK);
}
4 结束语
本文从应用程序的角度出发,介绍了在Vxworks系统中嵌入FTP的方法。该方法已经应用于实际软件设计中,而FTP的使用可以让运行在Windows系统下的上位机轻松访问Vxworks系统,实现2个系统间的网络数据交换,为分析处理数据文件提供了便利。
〔编辑:白洁〕