爱悠闲 > About OpenAT FtpClient(纯c实现)

About OpenAT FtpClient(纯c实现)

分类: OpenAT  |  标签: ftp服务器,服务器,c,工作,internet,平台  |  作者: xunpo 相关  |  发布日期 : 2014-09-02  |  热度 : 228°

 

搞OpenAT开发也有一段时间了,算算这段时间,走来也不算顺利。
OpenAT是Wavecom公司提供的对网络,控制等进行了一系列封装,并提供强大二次开发接口的系统平台。
由于平台是封装的,对于系统底层我们不用了解太多,只需要知道其工作原理就行了,这对于大部份嵌入式开发者来说,是非常有利入门平台。
但也正是由于其对系统底层进行了封装,导致了很多限制,如:在对串口进行了流控制后,一次只能接收120个字节,如果要进行大数据通信,则必须对串口进行处理。
在TCP/IP及GPRS方面,Wavecom将整个协议完全封装,我们只需要进行简单系统配置,就可以连上Internet,不需要了解什么链路层、传输层......
Wavecom在协议优化上应当是做得不错的,在我的平台上(基于移动,静止状态,Q24Plus),上行速率大概:1.5KByte-2KByte,下行速率稳定在:4.5Kbyte(Ftp下载)

今天我主要说的是Ftp客户端的实现。

对于ftp来说,其实际上是基于TCP/IP的一个封装协议,Wavecom的OpenAT SDK本身也具备Ftp client/Server的开发功能,但我不知道为什么,Wavecom对中国销售的平台是做了限

制,一些功能加了逻辑锁,导致我们不能正常使用。
Ftp client 就是其中之一,在使用Ftp Client时会提示:ERRLOG ftp.c:101: Internet Protocol Feature not activated。

在与经销商了解后,得知Q24Plus 分411和408,408不能使用模块内嵌Ftp Client,如果要用,就得用411,但却要贵几美金。
想来想去,觉得Wavecom这哥们太不厚道了,就这样的差别,还要多收钱。

由于我们所买的模块全是408系列的,所以不能使用OpenAT SDK自带的FtpClient,只能自己另外想办法来实现。

前面我已经表述过了,Ftp 协议是基于TCP/IP协议的一个封装协议,其通讯方式就是TCP数据报文,有了这个基础,我就准备用OpenAT SDK 所提供的 TCP Socket来实现一个

Ftpclient.


在实现之前,我们需要了解一下ftp的工作原理。

Ftp Server有两个工作模式,PORT和PASV,对于PORT来说,需要客户端有公网IP(或者客户端能"直接"与服务器通信),PASV只需要客户端能与服务器通信即可,不需要公网IP,由

于的项目是基于移动GPRS的,GPRS拔号后,是没有公网IP的,所以,服务器只能工作在PASV模式下,目前市面上流行的Ftp服务器工具,都是支持这种工作模式的(如:Serv-u)。
FTP 在工作时,会同时有两个TCP通信,一个称为FTP命令,另一个为FTP数据,FTP数据Socket用来进行数据的上传、下载(如:上传图片至服务器,下载文件到本机);FTP命令是

用来与FTP服务器进行协议通信的,客户端与服务器端的各种通信即是通过这个通道传输的。

FTP协议格式:

从机->主机
命令头 空格 参数

主机->从机
状态码 空格 描述

我用Ftp Client的原因是我要做Wavecom OpenAT的远程更新,需要从服务器上下载数据,我只需要做到能够正常登录服务器并能将指定文件下载到我的运行平台即可,所以我就没

有做一个完整的Ftp 通信。

以下是我用到的Ftp服务器相关状态及协议:
主机->从机
150 开始进行数据传输
200 设置传输模式完成(TYPE I)
220 服务器就绪,等待用户名
226 数据下载完成
227 设置服务器工作模式(PSAV)正常
230 用户登录成功
331 用户名正常,等待密码
350 断点绪传设置成功
530 tcp连接超时
550 远程服务器没有请求的文件

从机->主机
USER  用户名    登录用户名
PASS  密码    登录密码
PASV      设置服务器被动工作模式  
RETR  文件名     请求的文件名
REST 文件起始位置   断点续传时的请求位置


OpenAT SDK实现 Ftp client流程
1.创建两个全局的 tcp channel,一个用于ftp 命令,一个用于ftp数据传输
2.使用ftp 命令登录服务器
3.设置服务器工作模式:被动模式 PASV
在执行此命令后,客户端会收到如下提示
Response: 227 Entering Passive Mode (ip1,ip2,ip3,ip4,port1,port2)
ip1.ip2.ip3.ip4 为服务器的IP地址
port1,port2 服务器等待客户端的数据连接端口,端口号计算方式为:port1*256+port2
4.用ftp数据通道连接 刚才收到的地址及端口
5.向ftp命令通道发送获取文件指令,此时,如果ftp数据通道建立正常,即可收到服务器发来的数据包

 

上述功能,我花了两天时间来编码,调试,目前整工作正常。