KDE Connect for Android 添加不了 IPv6 地址的设备
最近在尝试 Linux 桌面环境的时候,又重新留意到了 KDE Connect ,于是就想尝试下。
测试用到的设备:
Windows 10 / Debian 12 KDE,直连光猫
Redmi K50 (MIUI 14.0.7),连接路由器 WIFI
Raspberry Pi,连接路由器
由于家里网络布局比较特殊,Redmi 和 PC 通过 IPv6 互联的话比较简单。而且如今 IPv6 都挺普遍了。 于是也没多想,直接在 KDE Connect 中添加 IPv6 地址。然后结果就让人很懵逼了,显示找不到可用的设备。 看了下防火墙,设置错了,重来,但还是找不到。尝试下 PC ping Redmi ,能通。Redmi 用 Termux App, ping6 PC ,也能通。
尝试过在同一路由器下,Redmi 能发现 PC 。于是怀疑是否代码的问题。下载源码,经过一番调试,发现 DatagramSocket 发送的数据并没收到。用 DatagramSocket 写一个简单的 App,PC 能收到数据。但当 DatagramPacket length > 1452 时,PC 会收不到数据。用 IPv4 时,则不会出现这种情况。搜索相关的问题,又没有准确的答案。
于是转换思路。1452 这个数字,加上类似丢包的情况,很容易让人联想到 MTU 1500 。于是又去了解了下 IPv6 UDP 分包相关的东西。IPv6 UDP fragment 不会在路由器中进行重组,于是刚开始的时候怀疑是否中间某个网络设备的 MTU 小导致丢包。尝试过修改路由器 MTU,但没效果。 后来了解到有 IPv6 MTU Path Discovery 这种机制,排除了 MTU 的问题。还看到网上有人试过 IPv6 UDP fragment checksum 出错导致数据丢失,但自己又不会抓包相关的东西,遂放弃了。
之后怀疑是否 WIFI 导致的问题,用 Android Studio 的 Android 10 模拟器测试,还是一样的结果。
于是怀疑是否路由器坏了。用 Python 在 Pi 和 PC 间测试,没问题。用 DatagramSocket 写一个 server App,PC 用 Python 写一个 client,发现也没问题。于是尝试下 tcpdump ,想看下是否收到数据包。用 Redmi 发送数据,发现 udp 分包后,tcpdump 没任何输出。用 PC 给 Pi 发送长点的数据,tcpdump 也没输出。。。
只好再换一种思路。用 Java 写个 client ,发现数据长度不影响。排除 Java 的问题。用最新的 JDK 编译 App,结果没变化。
于是尝试 Redmi 直接运行 java。
发现还是一样的情况。
最后,在某个时刻灵光一闪,换手机尝试(家里只有 HarmonyOS 3.0.0),PC 能收到数据。KDE Connect 也能连上。。。