设置直接以太网连接 LinuxAndroid

设置直接以太网连接 LinuxAndroid

我有一款 Android 6.0 SoC(ODroid C2) 我正尝试通过常规以太网或 USB 以太网(通过 g_ether 模块)直接连接到嵌入式 Linux 机器

Linux 机器上运行着 2 个服务,我需要从 Android 设备访问它们 - 一个是在端口 8088 上运行的 Web 服务器,另一个是消息队列服务(零MQ

当我将 Linux 设备和 Android 设备都连接到我们的域网络时,我可以从 Android 或我的 Windows 开发机器的浏览器中访问 Web 服务,也可以从任一环境访问消息队列端口。我现在需要做的是让 Android 设备直接连接到 Linux 机器(Android 设备将运行 Linux 机器的控制 GUI 应用程序)

这是我尝试过的:

  1. 通过直接以太网连接两台机器并重新启动
  2. 刷新两台机器上的 IP 地址缓存,并使用本地链路前缀在每一端分配一个已知的 IP 地址
    • 在Linux方面:
# ip addr flush eth0
# ip addr add 169.254.1.1/16 dev eth0
# ip addr show eth0
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:06:0c:01:10:27 brd ff:ff:ff:ff:ff:ff
    inet 169.254.1.1/16 scope global eth0
       valid_lft forever preferred_lft forever
# ip route show
169.254.0.0/16 dev eth0  src 169.254.1.1
  • 在Android端:
root@odroidc2:/ # ip addr flush eth0
root@odroidc2:/ # ip addr add 169.254.1.2/16 dev eth0
root@odroidc2:/ # ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:1e:06:35:be:c8 brd ff:ff:ff:ff:ff:ff
    inet 169.254.1.2/16 scope global eth0
       valid_lft forever preferred_lft forever
root@odroidc2:/ # ip route show
169.254.0.0/16 dev eth0  proto kernel  scope link  src 169.254.1.2
  1. 两台机器现在可以互相 ping 通,并且已经在 arp 表中解析了彼此的硬件地址
    • Linux 端:
# ping -c 5 169.254.1.2
PING 169.254.1.2 (169.254.1.2) 56(84) bytes of data.
64 bytes from 169.254.1.2: icmp_seq=1 ttl=64 time=3.83 ms
64 bytes from 169.254.1.2: icmp_seq=2 ttl=64 time=2.25 ms
64 bytes from 169.254.1.2: icmp_seq=3 ttl=64 time=2.15 ms
64 bytes from 169.254.1.2: icmp_seq=4 ttl=64 time=2.20 ms
64 bytes from 169.254.1.2: icmp_seq=5 ttl=64 time=2.21 ms

--- 169.254.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4011ms
rtt min/avg/max/mdev = 2.159/2.532/3.836/0.655 ms
# arp -a
? (169.254.1.2) at 00:1e:06:35:be:c8 [ether] on eth0
  • Android端:
root@odroidc2:/ # ping -c 5 169.254.1.1
PING 169.254.1.1 (169.254.1.1) 56(84) bytes of data.
64 bytes from 169.254.1.1: icmp_seq=1 ttl=64 time=2.27 ms
64 bytes from 169.254.1.1: icmp_seq=2 ttl=64 time=1.56 ms
64 bytes from 169.254.1.1: icmp_seq=3 ttl=64 time=1.75 ms
64 bytes from 169.254.1.1: icmp_seq=4 ttl=64 time=1.69 ms
64 bytes from 169.254.1.1: icmp_seq=5 ttl=64 time=1.82 ms

--- 169.254.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 1.565/1.823/2.278/0.242 ms
root@odroidc2:/ # arp -a
? (169.254.1.1) at 00:06:0c:01:10:27 [ether]  on eth0
  1. 重新启动了绑定 webservice/消息队列端点的 Linux 端的应用程序进程
  2. 169.254.1.1但是,当我尝试使用Linux 计算机的地址从 Android 访问 Web 服务端点或消息队列端点时,无论我是尝试169.254.1.1:8088在浏览器中访问 Web 服务器,还是从我们的控制应用程序向消息队列发送连接请求,都没有任何反应。我尝试通过查看来自 Android 设备的出站流量,tcpdump -i eth0 -Q out但它没有显示任何出站数据包,就像浏览器和控制应用程序都没有尝试建立连接一样。

所以问题是 - 我在这里遗漏了什么?正如我所说的那样,当我尝试连接到任一端点时,根本没有生成出站数据包 - 在浏览器中我收到一条ERR_INTERNET_DISCONNECTED错误消息 - 是否有一个我遗漏的Android系统设置,我需要在系统在没有有效互联网连接的情况下尝试出站连接之前进行更改?我还想知道使用较新版本的Android内核是否会有更好的运气 - 我们现在使用的设备运行的是硬件制造商提供的图像中的Android 6.0,但这个硬件迭代只会持续到今年年底,所以它不适合我们的发布时间表,我们将在某个时候更新到较新的设备,如果Android 6阻碍了我们,也许会更早而不是更晚。

相关内容