树莓派通过串口接入网络

如果树莓派无法使用以太网或者WiFi,该如何接入到TCP/IP网络呢?这个需求看似奇怪,还真给我遇到了。其实树莓派可以通过串口线和其他设备实现网络通信。

以使用WiFi接入到网络为例,WiFi定义了OSI模型中的物理层和数据链路层,在WiFi之上承载了网络层的IP协议,再往上就是传输层,传输层最重要的协议是TCP。树莓派的UART串口不适合直接传输TCP/IP数据,需要用PPP协议(Point-to-Point Protocol,点对点协议)封装串口数据,那么数据链路层使用的是PPP协议,然后再在PPP协议上承载IP协议,就有了网络接口。另一个可用在串口线上的数据链路层协议是SLIP(Serial Line IP),在互联网发展早期很流行,现在已经被PPP协议取代了。

我们就使用上面提到的思路。先做如下准备:

  1. 树莓派有两个串口,硬件串口默认分配给蓝牙模块上,所以需要做一些设置,恢复硬件串口与GPIO的映射关系,这样就可以通过GPIO使用高性能的硬件串口。网上很容易找到方法,这里就不多说了。
  2. 通信双方都要安装ppp协议,树莓派上使用sudo apt-get install ppp命令安装。
  3. 如果通信的另一方也是个树莓派,可以用3根杜邦线连接两个树莓派的TXD、RXD和GND引脚,TXD与RXD要交叉连接。如果通信的另一方是个Linux主机,需要一个串口转USB模块,USB一端插到计算机上,另一端也和上面一样,用3根杜邦线接到树莓派的串口上。本文以另一方是Linux主机为例讲解。

上面的准备工作做好之后,在树莓派上通过/dev/ttyAMA0访问串口,在Linux主机上通过/dev/ttyUSB0访问串口。先使用minicom等串口工具测试串口,确保工作正常,然后往下看。

在树莓派上,运行如下的命令开启PPP守护进程,在串口线上创建一个连接:

1
2
3
stty -F /dev/ttyAMA0 raw
stty -F /dev/ttyAMA0 -a
pppd /dev/ttyAMA0 115200 10.0.0.2:10.0.0.1 noauth local debug dump defaultroute nocrtscts persist maxfail 0 holdoff 1

persist maxfail 0 holdoff 1参数设置pppd永远开启连接,其他参数的意义可以看pppd的man page。上面设置的IP地址中,10.0.0.2是树莓派的IP地址,10.0.0.1是Linux主机的地址。IP地址可以自由选择,无冲突即可。

在Linux主机上也开启pppd守护进程:

1
2
sudo stty -F /dev/ttyUSB0 raw
sudo pppd /dev/ttyUSB0 115200 10.0.0.1:10.0.0.2 proxyarp local noauth debug nodetach dump nocrtscts passive persist maxfail 0 holdoff 1

当两个设备都运行了pppd时,它们会握手并建立一条通信链路。屏幕上会打印很多输出字符,提示通过ppp接口构建了网络连接。此时可以在Linux主机上ping树莓派的IP地址来验证通信是否正常。

接下来就可以通过IP地址互相访问。我测试了一下文件传输,当串口波特率设置为115200时,传输速率为10KB/s左右,和计算结果是相符的。

参考链接

  1. Connect the Raspberry Pi to Network Using UART
  2. RPi Serial Connection