KDE Connect for Android 添加不了 IPv6 地址的設(shè)備
最近在嘗試 Linux 桌面環(huán)境的時候,又重新留意到了 KDE Connect ,于是就想嘗試下。
測試用到的設(shè)備:
Windows 10 / Debian 12 KDE,直連光貓
Redmi K50 (MIUI 14.0.7),連接路由器 WIFI
Raspberry Pi,連接路由器
由于家里網(wǎng)絡(luò)布局比較特殊,Redmi 和 PC 通過 IPv6 互聯(lián)的話比較簡單。而且如今 IPv6 都挺普遍了。 于是也沒多想,直接在 KDE Connect 中添加 IPv6 地址。然后結(jié)果就讓人很懵逼了,顯示找不到可用的設(shè)備。 看了下防火墻,設(shè)置錯了,重來,但還是找不到。嘗試下 PC ping Redmi ,能通。Redmi 用 Termux App, ping6 PC ,也能通。
嘗試過在同一路由器下,Redmi 能發(fā)現(xiàn) PC 。于是懷疑是否代碼的問題。下載源碼,經(jīng)過一番調(diào)試,發(fā)現(xiàn) DatagramSocket 發(fā)送的數(shù)據(jù)并沒收到。用 DatagramSocket 寫一個簡單的 App,PC 能收到數(shù)據(jù)。但當(dāng) DatagramPacket length > 1452 時,PC 會收不到數(shù)據(jù)。用 IPv4 時,則不會出現(xiàn)這種情況。搜索相關(guān)的問題,又沒有準(zhǔn)確的答案。
于是轉(zhuǎn)換思路。1452 這個數(shù)字,加上類似丟包的情況,很容易讓人聯(lián)想到 MTU 1500 。于是又去了解了下 IPv6 UDP 分包相關(guān)的東西。IPv6 UDP fragment 不會在路由器中進(jìn)行重組,于是剛開始的時候懷疑是否中間某個網(wǎng)絡(luò)設(shè)備的 MTU 小導(dǎo)致丟包。嘗試過修改路由器 MTU,但沒效果。 后來了解到有 IPv6 MTU Path Discovery 這種機(jī)制,排除了 MTU 的問題。還看到網(wǎng)上有人試過 IPv6 UDP fragment checksum 出錯導(dǎo)致數(shù)據(jù)丟失,但自己又不會抓包相關(guān)的東西,遂放棄了。
之后懷疑是否 WIFI 導(dǎo)致的問題,用 Android Studio 的 Android 10 模擬器測試,還是一樣的結(jié)果。
于是懷疑是否路由器壞了。用 Python 在 Pi 和 PC 間測試,沒問題。用 DatagramSocket 寫一個 server App,PC 用 Python 寫一個 client,發(fā)現(xiàn)也沒問題。于是嘗試下 tcpdump ,想看下是否收到數(shù)據(jù)包。用 Redmi 發(fā)送數(shù)據(jù),發(fā)現(xiàn) udp 分包后,tcpdump 沒任何輸出。用 PC 給 Pi 發(fā)送長點(diǎn)的數(shù)據(jù),tcpdump 也沒輸出。。。
只好再換一種思路。用 Java 寫個 client ,發(fā)現(xiàn)數(shù)據(jù)長度不影響。排除 Java 的問題。用最新的 JDK 編譯 App,結(jié)果沒變化。
于是嘗試 Redmi 直接運(yùn)行 java。
發(fā)現(xiàn)還是一樣的情況。
最后,在某個時刻靈光一閃,換手機(jī)嘗試(家里只有 HarmonyOS 3.0.0),PC 能收到數(shù)據(jù)。KDE Connect 也能連上。。。