STM32+LWIP+FTP客户端下载文件

发布者:TranquilSoul最新更新时间:2024-08-13 来源: cnblogs关键字:STM32  LWIP  下载文件 手机看文章 扫描二维码
随时随地手机看文章

前提


在学习FTP客户端之前需要学会socket,FTP客户端与服务器之间的通讯就是使用socket的过程。

思路:


整个过程需要两个socket,一个用于与服务器端之间的操作,比如输入账号密码、读取文件大小或者删除文件之类的操作,另外一个socket用于接收文件内容、一个流;具体流程看下面的流程图。


流程图:

FTP命令:

命令描述
ABOR中断数据连接程序
ACCT系统特权帐号
ALLO为服务器上的文件存储器分配字节
APPE添加文件到服务器同名文件
CDUP改变服务器上的父目录
CWD改变服务器上的工作目录
DELE删除服务器上的指定文件
HELP返回指定命令信息
LIST如果是文件名列出文件信息,如果是目录则列出文件列表
MODE传输模式(S=流模式,B=块模式,C=压缩模式)
MKD在服务器上建立指定目录
NLST列出指定目录内容
NOOP无动作,除了来自服务器上的承认
PASS系统登录密码
PASV请求服务器等待数据连接
PORT
IP 地址和两字节的端口 ID
PWD显示当前工作目录
QUIT从 FTP 服务器上退出登录
REIN重新初始化登录状态连接
REST由特定偏移量重启文件传递
RETR从服务器上找回(复制)文件
RMD在服务器上删除指定目录
RNFR对旧路径重命名
RNTO对新路径重命名
SITE由服务器提供的站点特殊参数
SMNT挂载指定文件结构
STAT在当前程序或目录上返回信息
STOR储存(复制)文件到服务器上
STOU储存文件到服务器名称上
STRU数据结构(F=文件,R=记录,P=页面)
SYST返回服务器使用的操作系统
TYPE数据类型(A=ASCII,E=EBCDIC,I=binary)
USER >系统登录的用户名

FTP响应码:

响应代码解释说明
110新文件指示器上的重启标记
120服务器准备就绪的时间(分钟数)
125打开数据连接,开始传输
150打开连接
200成功
202命令没有执行
211系统状态回复
212目录状态回复
213文件状态回复
214帮助信息回复
215系统类型回复
220服务就绪
221退出网络
225打开数据连接
226结束数据连接
227进入被动模式(IP 地址、ID 端口)
230登录因特网
250文件行为完成
257路径名建立
331要求密码
332要求帐号
350文件行为暂停
421服务关闭
425无法打开数据连接
426结束连接
450文件不可用
451遇到本地错误
452磁盘空间不足
500无效命令
501错误参数
502命令没有执行
503错误指令序列
504无效命令参数
530未登录网络
532存储文件需要帐号
550文件不可用
551不知道的页类型
552超过存储分配
553文件名不允许

实际使用例子

int FTP_Updata_Check(tFTP_DATA *pFtpData_cmd, tFTP_DATA *pFtpData_data)

{

int sock_ftp_cmd, sock_ftp_data;

struct sockaddr_in ftp_cmd, ftp_data;

uint32_t version_num = 0;

memset(pFtpData_data, 0, sizeof(tFTP_DATA));

memset(pFtpData_cmd, 0, sizeof(tFTP_DATA));

        if ((sock_ftp_cmd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 

{

printf('FTP: Socket_cmd application failed. . .');

return -1;

}

ftp_cmd.sin_family = AF_INET;

ftp_cmd.sin_port = htons(FTP_PORT_IND);

ftp_cmd.sin_addr.s_addr = inet_addr(FTP_IP_ADDR);

USER_INFO(ePRINTF_LV2, 'FTP: Connect Server IP:%s:%d', FTP_IP_ADDR, FTP_PORT_IND);

if (connect(sock_ftp_cmd, (struct sockaddr *)&ftp_cmd, sizeof (ftp_cmd)) < 0)

{

printf('FTP: The server connection failed. . .');

closesocket(sock_ftp_cmd);

return -1;

}

read(sock_ftp_cmd, pFtpData_cmd->recevice_buf, sizeof(pFtpData_cmd->recevice_buf) - 1);

sprintf(pFtpData_cmd->send_buf, 'USER %srn', FTP_USERNAME);

write(sock_ftp_cmd, pFtpData_cmd->send_buf, strlen(pFtpData_cmd->send_buf));

read(sock_ftp_cmd, pFtpData_cmd->recevice_buf, sizeof(pFtpData_cmd->recevice_buf) - 1);

sprintf( pFtpData_cmd->send_buf, 'PASS %srn', FTP_PASS);

write(sock_ftp_cmd, pFtpData_cmd->send_buf, strlen(pFtpData_cmd->send_buf));

read(sock_ftp_cmd, pFtpData_cmd->recevice_buf, sizeof(pFtpData_cmd->recevice_buf) - 1);

sprintf( pFtpData_cmd->send_buf, 'PASVrn');

write(sock_ftp_cmd, pFtpData_cmd->send_buf, strlen(pFtpData_cmd->send_buf));

read(sock_ftp_cmd, pFtpData_cmd->recevice_buf, sizeof(pFtpData_cmd->recevice_buf) - 1);

pFtpData_data->port = ftp_get_port(pFtpData_cmd->recevice_buf);

if ((sock_ftp_data = socket(AF_INET, SOCK_STREAM, 0)) < 0) 

{

printf('FTP: Socket_dat application failed. . .');

closesocket(sock_ftp_cmd);

return -1;

}

ftp_data.sin_family = AF_INET;

ftp_data.sin_port = htons(pFtpData_data->port);

ftp_data.sin_addr.s_addr = inet_addr(FTP_IP_ADDR);

if (connect(sock_ftp_data, (struct sockaddr *)&ftp_data, sizeof (ftp_data)) < 0)

{

printf('FTP: The server connection failed. . .');

closesocket(sock_ftp_data);

closesocket(sock_ftp_cmd);

return -1;

}

sprintf(pFtpData_cmd->send_buf, 'SIZE abc.textrn');

write(sock_ftp_cmd, pFtpData_cmd->send_buf, strlen(pFtpData_cmd->send_buf));

memset(pFtpData_cmd->recevice_buf, 0, sizeof(pFtpData_cmd->recevice_buf));

read(sock_ftp_cmd, pFtpData_cmd->recevice_buf, sizeof(pFtpData_cmd->recevice_buf) - 1);

USER_INFO(ePRINTF_LV3, 'FTP: <<<<%s', pFtpData_cmd->recevice_buf);

if(strstr(pFtpData_cmd->recevice_buf, 'File not found'))

{

printf('FTP: There is no file. return');

closesocket(sock_ftp_data);

closesocket(sock_ftp_cmd);

return 0;

}

sprintf(pFtpData_cmd->send_buf, 'RETR abc.textrn');

write(sock_ftp_cmd, pFtpData_cmd->send_buf, strlen(pFtpData_cmd->send_buf));

memset(pFtpData_cmd->recevice_buf, 0, sizeof(pFtpData_cmd->recevice_buf));

read(sock_ftp_cmd, pFtpData_cmd->recevice_buf, sizeof(pFtpData_cmd->recevice_buf) - 1);

if(strstr(pFtpData_cmd->recevice_buf, 'File not found'))

{

printf('FTP: There is no file. return');

closesocket(sock_ftp_data);

closesocket(sock_ftp_cmd);


return 0;

}

read(sock_ftp_data, pFtpData_data->recevice_buf, sizeof(pFtpData_data->recevice_buf) - 1);//读文件内容

closesocket(sock_ftp_data);

closesocket(sock_ftp_cmd);


return 1;

}


关键字:STM32  LWIP  下载文件 引用地址:STM32+LWIP+FTP客户端下载文件

上一篇:STM32F103C8T6使用SPI接口驱动WS2812b灯条
下一篇:STM32之旅7——PWMN

推荐阅读最新更新时间:2024-11-17 18:02

基于STM32的超声波传感器测距(含代码)
1. 实验原理 超声波传感器采用的是HC-SR04,具有VCC、GND、Trig、Echo四个引脚,其使用方法为:将Trig 设置为高电平并保持至少10us,传感器将发出 8 个脉冲的声波。对于声波产生回声所需的整个时间内, Echo 为高电平。测量该高电平时间即可知经过的时间,则可计算障碍物的距离。 测量Echo 为高电平的时间是利用STM32的通用定时器进行输入捕获,测量得到的高电平时间通过公式:距离 = Thigh *340/2 (m) ,其中Thigh 单位为秒(s), 340米/秒(m/s)为声速。 2. 设计分析 由STM32F4xx数据手册可知,所采用的板子有TM2-TM5四个
[单片机]
基于<font color='red'>STM32</font>的超声波传感器测距(含代码)
一种无OS的STM32实用软件框架
介绍 一种无OS的STM32实用软件框架,包括任务轮询管理,命令管理器、低功耗管理、环形缓冲区等实用模块。系统中广泛利用自定义段技术减少各个模块间的耦合关系,大大提供程序的可维护性。 主要功能 支持模块自动化管理,并提供不同优先等级初始化声明接口。 支持任务轮询管理,通过简单的宏声明即可实现,不需要复杂的声明调用。 支持低功耗管理,休眠与唤醒通知。 支持命令行解析,命令注册与执行。 blink设备支持,统一管理LED、震动马达、蜂鸣器 使用说明 点击STM32嵌入式开发公众号文末的“阅读原文”,可以完整的工程代码,系统开发平台如下: MCU:STM32F401RET6 IDE:IAR 7.4或者K
[单片机]
STM32中,systick具体延时时间计算
/**************************************************************************** * STM32单片机SysTick系统滴答定时器实验程序 * * * *****************************************************************************/ #ifndef _SYSTICK_H #define _SYSTICK_H #include SysTick.h #define SYSTICK_CSR (*((volatile unsigned long *) 0xE
[单片机]
STM32 DMA 应用之(一)SRAM 与flash 间数据传输
一、为什么要用DMA? DMA 全称:Direct MemoryAccess 就是可以直接内存存取; 正是它可以直接操作内存所以具备以下优点: 而无需经过CPU去操作内存的存取,这样可以解放CPU出来干其他的事情; 因为他可以进行存储器时间的数据传输,而不需经过cpu,所以大大加快了数据传输速度—是一种高速的数据传输; 二.DMA有几种传输数据方式: (1)内存到 内存之间的;即:SRAM?à SRAM (2)内存到 外设之间的; (例如:串口收到的数据 从数据寄存器 à 内存) (3) 外设到内存之间的; 三.传输的数据宽度是怎样的,数据是什么样的形式传输?DMA 能传输多大的数据量? A. 数据源地址到数据目的地址 传
[单片机]
stm32 FSMC的函数解释
介于网上找的库函数中文版没有FSMC的,所有只能在这边转载一下FSMC的函数解析,供像我这样的菜鸟学习 typedef struct { uint32_t FSMC_Bank;//nor被分为四块,其中这个参数是说明对那个块编程 uint32_t FSMC_DataAddressMux;//地址\数据是否复用 uint32_t FSMC_MemoryType;//存储器类型 uint32_t FSMC_MemoryDataWidth;//数据总线宽度 8位/16位 uint32_t FSMC_BurstAccessMode;//是否进行成组模式访问 uint32_t FSMC_WaitSignalPo
[单片机]
STM32的上拉和下拉电阻
STM32F10X I/O可以通过配置寄存器使能弱上拉或下拉电阻,根据datasheet,这个电阻为:min=20K, typ=30K, max=40K。 STM32F10X I/O的输入可以配置为floating/pull up/pull down三种方式。 对STM32F10X来说,系统reset后I/O的状态为Floating input。所以如果有电路的输入依赖于I/O的电平,必须设置合适的上拉或下拉电阻,否则会出现不定态或者毛刺。 STM32F10X JTAG 输入管脚上电复位后的上拉/下拉状态: ● NJTRST: Internal pull-up ● JTDI: Internal pull-up ● JTMS/SWD
[单片机]
STM32 串口中的硬件BUG,注意!
调试串口时,发现串口会出现频繁跳中断,导致无法执行主循环的问题! 调试发现是串口中断硬件BUG: 1. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了接收中断,那么ORE中断也同时被开启了。 2. ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时) 解决办法: 1. 初始化时,开启中断 USART_ITConfig(USART1, USART_IT_PE, ENABLE); //开启PE错误接收中断Bit 8PEIE: PE interrupt enable
[单片机]
<font color='red'>STM32</font> 串口中的硬件BUG,注意!
STM32的FSMC学习手记(一)
FSMC应用简介 FSMC全称 静态存储器控制器 ,STM32可以通过FSMC与SRAM、ROM、PSRAM、Nor Flash和NandFlash存储器的引脚相连,从而进行数据的交换。 一、FSMC的特点: 1、 FSMC的一大特点是支持不同位宽的异步读写操作。 2、 FSMC的映射地址空间中,不同的BANK是独立的,可用于扩展不同类型的存储器。当FSMC同时使用多个外部存储器时,FSMC会通过总线悬空延时时间参数,来防止访问冲突发生。 3、 支持代码从FSMC扩展的外部存储器中直接运行。不需要首先调入内部SRAM。 二、FSMC的结构组成: 如图所示,FSMC主要分为四部分: 1、 FSMC一端连
[单片机]
<font color='red'>STM32</font>的FSMC学习手记(一)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved