当前位置:   article > 正文

rt_thread-tftp设备端作为客户端上传与下载文件_rtthread tftp

rtthread tftp

   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)

  1. int tftp_send_request(struct tftp_xfer *xfer, uint16_t cmd, const char *remote_file)
  2. {
  3. struct tftp_packet *send_packet;
  4. struct tftp_xfer_private *_private;
  5. int size, r_size;
  6. int res;
  7. _private = xfer->_private;
  8. /* Check connection type */
  9. if (xfer->type != TFTP_XFER_TYPE_CLIENT)
  10. {
  11. res = tftp_xfer_type_set(xfer, TFTP_XFER_TYPE_CLIENT);
  12. if (res != TFTP_OK)
  13. {
  14. return res;
  15. }
  16. }
  17. /* malloc mem */
  18. send_packet = malloc(sizeof(struct tftp_packet));
  19. if (send_packet == NULL)
  20. {
  21. return -TFTP_EMEM;
  22. }
  23. /* Packing request packet header */
  24. send_packet->cmd = htons(cmd);
  25. #ifdef MY_TFTP
  26. size = sprintf(send_packet->info.filename, "%s%c%s%c%s%c%d%c%s%c%d%c",
  27. remote_file, 0, xfer->mode, 0, "blksize", 0, xfer->blksize, 0,"tsize", 0, 0, 0) + 2;
  28. #else
  29. size = sprintf(send_packet->info.filename, "%s%c%s%c%d%c", remote_file, 0, xfer->mode, 0, xfer->blksize, 0) + 3;
  30. #endif
  31. /* send data */
  32. r_size = sendto(xfer->sock, send_packet, size, 0,
  33. (struct sockaddr *)&_private->server, sizeof(struct sockaddr_in));
  34. free(send_packet);
  35. if (size != r_size)
  36. {
  37. return -TFTP_EXFER;
  38. }
  39. return TFTP_OK;
  40. }

 如果不修改这个函数,那么设备作为客户端时候,读取服务器上面的文件时候,会报错:

 b.修改 littlefs 文件 系统的头文件 lfs.h

  1. // File open flags
  2. enum lfs_open_flags {
  3. //============================修改前==========================================
  4. // // open flags
  5. // LFS_O_RDONLY = 1, // Open a file as read only
  6. //#ifndef LFS_READONLY
  7. // LFS_O_WRONLY = 2, // Open a file as write only
  8. // LFS_O_RDWR = 3, // Open a file as read and write
  9. //==============================修改后========================================
  10. // open flags
  11. LFS_O_RDONLY = 0, // Open a file as read only
  12. #ifndef LFS_READONLY
  13. LFS_O_WRONLY = 1, // Open a file as write only
  14. LFS_O_RDWR = 2, // Open a file as read and write
  15. //==============================end============================================
  16. LFS_O_CREAT = 0x0100, // Create a file if it does not exist
  17. LFS_O_EXCL = 0x0200, // Fail if a file already exists
  18. LFS_O_TRUNC = 0x0400, // Truncate the existing file to zero size
  19. LFS_O_APPEND = 0x0800, // Move to end of file on every write
  20. #endif

    如果不修改该头文件,会报错:

   

 客户端命令如下:

  1. ### 2.3.1 TFTP 命令详解
  2. TFTP 客户端读取文件命令详解
  3. tftp -r/-w ip_addr file_name [-p]
  4. - tftp : 第一个参数固定 `tftp`
  5. - -w : 往服务器写文件
  6. - -r : 从服务器读文件
  7. - ip_addr : 服务器 IP 地址
  8. - file_name : 文件名字
  9. - -p : 服务器端口号
  10. ### 2.3.2 TFTP 读文件
  11. tftp -r ip_addr file_name
  12. 使用上述命令将 tftp 服务器上的一个文件下载到本地。命令示例如下:
  13. eg: tftp -r 192.168.1.13 text.txt
  14. 192.168.1.13 这个服务器上下载 text.txt 文件到本地根路径下
  15. ### 2.3.2 TFTP 写文件
  16. tftp -w ip_addr file_name
  17. 使用上述命令将本地的一个文件上传到 tftp 服务器。命令示例如下:
  18. eg: tftp -w 192.168.1.13 text.txt
  19. 把本地根路径下 text.txt 文件上传到 192.168.1.13 服务器上

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/779905
推荐阅读
相关标签
  

闽ICP备14008679号