iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、陀螺仪、CAN总线、RS485总线、500万摄像头等模块,稳定运行Android 4.0.3/Android 4.4操作,系统通用Linux-3.0.15+Qt操作系统(QT支持5.7版本),Ubuntu版本:12.04,接口智能分配 方便好用。
第十九章 搭建和测试TFTP服务器
在前面的视频中介绍了控制 led 的程序的实现,需要把编译好的 led 可执行文件拷贝到文件系统里面,用 make_ext4fs 命令重新制作 system.img 文件系统,然后再烧写到 iTOP- 4412 开发板,然后再运行 led 可执行文件。这种方式的缺点是每次修改了应用程序,都需要重新制作文件系统,在重新烧写文件系统,效率很低。
这一章先讲解如何通过 TFTP 来实现在线传输文件,先在虚拟机 Ubuntu 上搭建一个服务器,并在虚拟机 Ubuntu 上做客户端进行测试。
TFTP(Trivial File Transfer Protocol,简单文件传输协议),是一个基于 UDP 协议实现的用于在客户机和服务器之间进行简单文件传输的协议,适合于开销不大、不复杂的应用场合。TFTP 协议专门为小文件传输而设计,只能从服务器上获取文件,或者向服务器写入文件,不能列出目录,也不能进行认证。
本章配套视频为:
"视频 08TFTP 服务器搭建和测试"
Linux 网络部分的学习方法
这里并不会费劲的去介绍 TFTP 协议,那个意义不大,主要是教大家如何操作,在这个过程中进步。网络协议非常复杂,完整的网络协议一个人将资料看一遍,估计这辈子就过去了。在这个庞大的网络工程中,不同的工程师分别做不同的工作,作为嵌入式 linux 工程师,要做的就是拿别人做好的东西移植,在嵌入式上完善功能。
其实嵌入式上的所有功能从最开始,几乎都是从 PC 上移植过来的,很多代码以及软件都是在 PC 机上实现过,嵌入式 ARM 处理器的发展相对于滞后(ARM 的流行是 2000 年之后的事情),所以在嵌入式上移植就成了非常重要的一项能力。
19.1 Ubuntu服务端的搭建
在虚拟机 Ubuntu 上打开终端,如下图

首先输入命令"sudo apt-get install xinetd",安装 xinetd,如下图。

安装完 xinetd,如下图。

接下来输入命令"sudo apt-get install tftp tftpd"安装 tftp 和 tftpd,如下图。

安装完成后,如下图

然后建立 TFTP 的配置文件,使用命令"vi /etc/xinetd.d/tftp"建立文件,如下图。

写入下面的内容:
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/tftpboot/
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
如下图。

注意:如上图所示,这个文件在粘贴内容之后,必须按照上面的格式严格对齐。
退出并保存。其中 server_args 设置的/var/tftpboot 目录是 tftp 服务器的目录,TFTP 客户端就是从这个目录里面获取服务器上的文件的。使用命令 mkdir /var/tftpboot 建立 tftp 服务器的目录,如下图。

然后设置/var/tftpboot 的访问权限为 777,如下图。

输入:sudo /etc/init.d/xinetd restart 命令重启 xinetd 服务,如下图。

服务器到这一步就搭建好了,后面来进行测试。
服务器测试
本机测试:在/var/tftpboot 下面建立一个文件 test,在里面输入 hello world,然后保存该文件,如下图。

在启动另外一个终端,如下图。

然后输入:tftp 127.0.0.1,如下图。

输入 get test 获取 test 文件,如下图。

在上图看到获取到 test 的信息 13 字节,然后输入 q 退出 tftp,如下图。

然后输入 ls 查看当前目录下是否有 test 文件了,通过查看,发现当前目录下应经有 test 文件了,这就是/var/tftpboot 目录下的那个 test 文件,如下图。

使用 cat 命令查看一下 test 文件的内容,如下图。

通过上面的截图,看到 test 文件里面的内容是 hello world,与/var/tftpboot 目录的test 是一样的,至此的 TFTP 服务器端的配置和测试就完成了。
19.2 开发板实现TFTP文件传输
本章介绍如何使用 TFTP 服务器在开发板和虚拟机的 Ubuntu 进行传文件。
本章配套视频为:
"视频 09_01 同一网段的概念"
"视频 09_02 开发板实现 TFTP 文件传输"
在不少实验中,都会需要用到局域网的一些基础知识,在技术支持的过程中,发现不少用户对于这个概念非常模糊,导致 IP 地址或者网络环境稍微有点变化,就无法完成实验。如果没有接触过这个概念,建议将这一小节好好看一下,最好手动计算并验证两个 IP 地址是不是在同一网段。
局域网通信中会经常用到"同一网段"的概念。要弄明白这个概念需要结合 IP 地址以及子网掩码。
19.3 IP地址
关于 IP 地址的理论知识,网络上有大量的文章。
这里主要是介绍和开发板有关系需要注意的 IP 地址。
如下图所示,使用 ifconfig,可以查看 Ubuntu 系统下的 IP,下图表面 Ubuntu 的 IP 地址是 192.168.0.226。

在使用 SSH 软件和 Ubuntu 连通传文件,就需要先在 Ubuntu 下查看 IP 地址。
再来看一下开发板的 IP,如下图所示,在查看最小文件系统的 etc 文件可以看到默认的IP 地址为 192.168.1.230。

上图是没有打包编译的最小系统,如下图所示,是运行着的最小 linux 系统,也是可以查询和修改 IP 地址的。

最小系统在开发板上运行的时候,也可以使用 vi 命令来修改 IP 地址。
子网掩码
子网掩码的查询和 IP 的查询方式一模一样。
如下图所示,使用 ifconfig,可以查看 Ubuntu 系统下的子网掩码,下图表面 Ubuntu 的子网掩码是 255.255.255.0。

再来看一下开发板的子网掩码,如下图所示,在查看最小文件系统的 etc/eth0-setting 文件可以看到默认的子网掩码。

上图是没有打包编译的最小系统,如下图所示,是运行着的最小 linux 系统,也是可以查询和修改子网掩码。

最小系统在开发板上运行的时候,也可以使用 vi 命令来修改 IP 地址。
确认IP在同一网段
本小节主要介绍如何确认两个 IP 是不是在同一网段。
如果大家计算发现 Ubuntu 系统的 IP 和开发板的 IP 不在同一网段,则需要修改开发板的IP。
单纯的两个 IP 不能直接拿来确认是不是在同一网段,必须结合子网掩码经过计算才能得出结论。计算方法是:两个 IP 分别和相应的子网掩码做与运算,得出的结果相等则表明在同一网段。这里给大家举例说明:
Ubuntu 系统的 IP 和子网掩码分别是:192.168.0.226 和 255.255.255.0
开发板的 IP 地址和子网掩码分别是:192.168.1.230 和 255.255.255.0
进行与运算需要转换为二进制
Ubuntu 系统:
IP:11000000 10101000 00000000 11100010
MASK:11111111 11111111 11111111 00000000
Result 二进制:11000000 10101000 00000000 00000000
Result 十六进制:192.168.0.0
开发板:
IP:11000000 10101000 00000001 11100110
MASK:11111111 11111111 11111111 00000000
Result 二进制:11000000 10101000 00000001 00000000
Result 十六进制:192.168.1.0
对比上面两个十六进制结果,可以发现这两个例子中的 IP 地址并不在同一个网段。开发板需要重新根据路由器或者交换机来修改 IP
根据实际情况修改 IP 和子网掩码
如下图所示,作者的路由器地址为 192.168.0.1,大家根据实际情况登陆路由器,路由器背面一般都有这个地址,如果没有查一下路由器的手册。

注意上图中 WAN 设置界面中的网关是 192.168.1.1,这个是广域网的网关,实验中使用的是局域网的网关,需要选择"LAN 口设置"再查找网关。
如下图所示,选择 DHCP 服务器,这里会有一个分配局域网中的 IP 区间。也就是说 IP 可以设置为 192.168.0.220 到 192.168.0.250 这个区间。

如下图所示,选择"LAN 口设置"再查找,子网掩码为 255.255.255.0。
另外在后面的 NFS 文件系统实验的时候需要上面的 192.168.0.1 这个地址,可以把这个地址看成局域网的网关,而不能使用 WAN 中的网关!

了解了 IP 地址,子网掩码,查看了路由器设置之后,首先可以确定子网掩码为255.255.255.0,然后 IP 地址可以处于 192.168.0.220 到 192.168.0.250 这个区间。大家可以在这个区间取一个地址来计算。
最后根据大家的实际情况,确认了 IP 地址和 MASK 地址之后,修改最小 linux 系统中的etc/eth0-setting 文件,将它们的 IP 设置到同一网段!
弄明白"同一网段"的概念之后,后面和网络相关的实验会简单很多。
19 . 4 配置
注意:搭建最小 Linux 文件系统的目录是在"/home/minilinux"上,用户只要在对应的目录下修改即可。学习到这里,大家对于 linux 的目录应该是搞得清楚了,不会成为大家学习的障碍
iTOP-4412 开发板制作的 linux 文件系统已经支持 TFTP 客户端命令了,编译 Busybox 时默认是支持该命令的,linux 文件系统在启动的时候通过脚本设置了以太网的 IP 地址是192.168.1.230,这个脚本是在文件系统的 etc/eth0-setting 文件,查看这个文件,如下图。

如果想修改默认的 IP,子网掩码,网关,DNS,MAC 就编辑这个文件对应的选项就可以了。
19 .5 客户端的测试
在 iTOP-4412 上获取 TFTP 服务器上的文件,首先看一下 TFTP 服务器的 IP 地址,如下图。

通过上面的截图可以知道 TFTP 虚拟机的 IP 地址是 192.168.1.109,开发板的默认 IP 是192.168.1.230,它们在同一个网段,如果不在同一个网段需要修改开发板的 IP 地址,修改方法就是设置前面介绍的 etc 目录下的 eth0-setting 文件。
连接开发板的网口到路由器上,然后输入 ping 命令确认开发板和 TFTP 服务器是连通的,如下图。

如果返回上面的信息就表示开发板和 TFTP 服务器是连通的,现在获取 TFTP 上的文件, 在开发板的串口输入:tftp -g -l test -r test 192.168.1.109,如下图。

执行完上面的命令,已经把 TFTP 上的 test 文件下载到开发板的当前目录下了,使用 cat 查看当前目录下 test 文件中的内容,如下图。

通过上面的截图,可以看到文件的内容和 TFTP 上的文件内容是一样的,至此 TFTP 搭建完成了,以后再调试程序的时候可以用 TFTP,这样就避免了每次都要生成镜像,烧写镜像了。
19 .6 TFTP传输应用程序
下面给大家演示一下调试应用程序的方法,在虚拟机的 Ubuntu 上编写过一个输出helloworld 的小程序,然后通过交叉编译器编译这个程序生成了可执行文件 helloworld,通过 cp 命令把这个可执行程序 helloworld 拷贝到了/var/tftpboot 目录下面,接下来我要在开发板端把 hello 文件下载到开发板上,需要在开发板的串口上执行"tftp -g -l helloworld -r helloworld 192.168.1.109",如下图。

然后输入 ls 命令查看一下当前目录,可以看到已经有 helloworld 这个文件了,如下图, 使用命令"./helloworld"运行程序,提示没有权限。

因为 helloworld 这个文件现在没有执行权限,所以需要输入 chmod 777 helloworld 命令来修改下 helloworld 的权限,然后运行 helloworld,如下图。

看到程序输出:"hello world!"了。通过 TFTP 这种方式可以提高调试程序的效率。