暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

我在鸿蒙上成功运行了一个TFTP服务器!

51CTO技术栈 2020-12-04
811
送 福 利 啦

关注HarmonyOS技术社区,回复【鸿蒙】价值399元的鸿蒙开发板套件即将开奖,赶快参与哦!,还可以免费下载鸿蒙入门资料


👇扫码立刻关注👇

专注开源技术,共建鸿蒙生态

前几天唐老师发布了能够运行在鸿蒙 Hi3861 开发板上的 Python 解释器,不知道的可以看看这篇《鸿蒙开发终于可以用Python了!》。

我们知道,Python 是一种脚本语言,可以解释执行,不需要编译。

有了 Python 解释器,大家可能会希望——如果能直接把 Python 脚本文件上传到开发板上,然后发个命令就可以执行就好了,而不需要像 C 代码那样需要编译、烧录才能运行。

于是,我开始尝试——将 TFTP 服务器移植到鸿蒙 Hi3861 开发板上。经过半天的移植和一天的调试,终于把 TFTP 服务器在 Hi3861 上移植成功了。

没错,在内存 352KB、闪存 2M 的 Hi3861 开发板上成功运行了一个 TFTP 服务器,你可以将 PC 上的文件上传到开发板上,而且可以断电持久保存!当然,你上传的文件不能太大。

以下是整个移植和调试过程中的关键过程记录。

 

01

TFTP 是什么?

TFTP 是简单文件传输协议 Trivial File Transfer Protocol 的英文缩写。

TFTP 是基于 UDP 的,协议本身比较简单,它的 RFC 1350 官方文档也只有 11 页(TCP 的 RFC 793 文档有 85 页)。

如果大家如果有兴趣,完全可以自己从零实现一个;而我为了能够快速验证在 Hi3861 的可行性,选择了直接移植。

02

TFTP 服务器实现了哪些功能?

已经实现了 TFTP 该有的功能:

  • 支持文件上传。

  • 支持文件下载。

  • 支持文件持久保存,使用了鸿蒙的文件系统 API 接口。

03

运行效果

PC 通过网线连接无线路由器,虚拟机网口桥接网卡,IP 地址:192.168.1.157。

开发板连接通过 WiFi 连接到无线路由器,IP 地址:192.168.1.151。

下图是运行效果,左边为虚拟机上 shell 执行的命令:

其中的用到的几个命令格式为:

  • put 命令,将本地文件上传到服务器,格式:put localfile remotefile。

  • get 命令,将服务器上的文件下载到本地,格式:get remotename localname。

  • quit 命令,退出会话。

想尝试运行效果的,可以直接下载本帖附件的代码进行编译,运行。

04

如何编译

步骤如下:

  • 将本帖附件 tftp 代码解压到 openharmony 源码顶层目录。

  • 修改 openharmony 的 build/lite/product/wifiiot.json 文件,将其中的 applications/sample/wifi-iot/app 替换为 tftp:tftp。

  • 在 openharmony 源码的顶层目录,执行 python build.py wifiiot。

05

调试过程中用到的工具和方法

除了常规的串口工具之外,还用到了几个工具(移植其他网络协议时可供参考):

  • tftp 客户端命令行工具(sudo apt install tftp下载)。

  • tcpdump 抓包工具:抓取某个网口上的全部数据包:sudo tcpdump -i eth0 -w tftp.pcap(-i 指定网口,-w 指定保存的数据文件)。

  • WireShark 抓包和分析工具:tcpdump 抓到的数据包是这个网口上的全部数据,用 WireShark 分析时,可以用过滤表达式:tftp 过滤 TFTP 协议的数据包。

06

解决的问题

移植过程中解决了这么几个问题:

  • 解决了报错"Mode too long/not NULL terminated",导致的上传失败。

  • 解决了文件读取时 size 超过了文件实际尺寸的问题。

  • 解决了 DATA 响应数据为空,导致的下载失败的问题。

07

附件说明


tftp.zip 是本移植项目源码。


rfc1350.pdf 是 TFTP 协议参考文档。(请通过阅读原文下载)


“阅读原文”下载源码

文章转载自51CTO技术栈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论