TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。
有时需要我们手动获取与下载文件,那么tftp协议比较简洁。
搭建好服务器
注意事项:
选择合适的软件版本netutils-v1.3.1
为了支持tftp 客户端功能,需要调整两个地方代码,原代码运行存在问题。文件系统移植的是littlefs 文件系统
a.调整netutils-v1.3.1\tftp\
修改函数代码,
int tftp_send_request(struct tftp_xfer *xfer, uint16_t cmd, const char *remote_file)
int tftp_send_request(struct tftp_xfer *xfer, uint16_t cmd, const char *remote_file)
{
struct tftp_packet *send_packet;
struct tftp_xfer_private *_private;
int size, r_size;
int res;
_private = xfer->_private;
/* Check connection type */
if (xfer->type != TFTP_XFER_TYPE_CLIENT)
{
res = tftp_xfer_type_set(xfer, TFTP_XFER_TYPE_CLIENT);
if (res != TFTP_OK)
{
return res;
}
}
/* malloc mem */
send_packet = malloc(sizeof(struct tftp_packet));
if (send_packet == NULL)
{
return -TFTP_EMEM;
}
/* Packing request packet header */
send_packet->cmd = htons(cmd);
#ifdef MY_TFTP
size = sprintf(send_packet->info.filename, "%s%c%s%c%s%c%d%c%s%c%d%c",
remote_file, 0, xfer->mode, 0, "blksize", 0, xfer->blksize, 0,"tsize", 0, 0, 0) + 2;
#else
size = sprintf(send_packet->info.filename, "%s%c%s%c%d%c", remote_file, 0, xfer->mode, 0, xfer->blksize, 0) + 3;
#endif
/* send data */
r_size = sendto(xfer->sock, send_packet, size, 0,
(struct sockaddr *)&_private->server, sizeof(struct sockaddr_in));
free(send_packet);
if (size != r_size)
{
return -TFTP_EXFER;
}
return TFTP_OK;
}
如果不修改这个函数,那么设备作为客户端时候,读取服务器上面的文件时候,会报错:
b.修改 littlefs 文件 系统的头文件 lfs.h
// File open flags
enum lfs_open_flags {
//============================修改前==========================================
// // open flags
// LFS_O_RDONLY = 1, // Open a file as read only
//#ifndef LFS_READONLY
// LFS_O_WRONLY = 2, // Open a file as write only
// LFS_O_RDWR = 3, // Open a file as read and write
//==============================修改后========================================
// open flags
LFS_O_RDONLY = 0, // Open a file as read only
#ifndef LFS_READONLY
LFS_O_WRONLY = 1, // Open a file as write only
LFS_O_RDWR = 2, // Open a file as read and write
//==============================end============================================
LFS_O_CREAT = 0x0100, // Create a file if it does not exist
LFS_O_EXCL = 0x0200, // Fail if a file already exists
LFS_O_TRUNC = 0x0400, // Truncate the existing file to zero size
LFS_O_APPEND = 0x0800, // Move to end of file on every write
#endif
如果不修改该头文件,会报错:
客户端命令如下:
### 2.3.1 TFTP 命令详解
TFTP 客户端读取文件命令详解
tftp -r/-w ip_addr file_name [-p]
- tftp : 第一个参数固定 `tftp`
- -w : 往服务器写文件
- -r : 从服务器读文件
- ip_addr : 服务器 IP 地址
- file_name : 文件名字
- -p : 服务器端口号
### 2.3.2 TFTP 读文件
tftp -r ip_addr file_name
使用上述命令将 tftp 服务器上的一个文件下载到本地。命令示例如下:
eg: tftp -r 192.168.1.13 text.txt
从 192.168.1.13 这个服务器上下载 text.txt 文件到本地根路径下
### 2.3.2 TFTP 写文件
tftp -w ip_addr file_name
使用上述命令将本地的一个文件上传到 tftp 服务器。命令示例如下:
eg: tftp -w 192.168.1.13 text.txt
把本地根路径下 text.txt 文件上传到 192.168.1.13 服务器上