 Android Auto 無線發(fā)現(xiàn)的完整指南)
Open Headunit 的 NearbySocket 與 NearbyManager用 Google Nearby 實現(xiàn) Android Auto 無線發(fā)現(xiàn)的完整指南【免費下載鏈接】open-headunitHeadunit App for displaying Android Auto項目地址: https://gitcode.com/GitHub_Trending/he/open-headunitOpen Headunit 是一款把 Android 平板變成 Android Auto 車機接收端的開源應(yīng)用。本文帶你讀懂其中負(fù)責(zé)找到手機并建立無線鏈路的一對核心類NearbySocket與NearbyManager——它們基于 Google Nearby Connections 完成設(shè)備發(fā)現(xiàn)、點對點連接與雙向數(shù)據(jù)隧道是無線 Helper 模式下默認(rèn)的自動發(fā)現(xiàn)方案。 為什么需要 Nearby 發(fā)現(xiàn)傳統(tǒng)的無線連接方式同網(wǎng)段掃描、Wi-Fi Direct、熱點都要求兩臺設(shè)備恰好在網(wǎng)絡(luò)層面可見而 Google Nearby Connections 用藍(lán)牙/Wi-Fi 混合廣播直接宣告設(shè)備存在——無需預(yù)配置網(wǎng)絡(luò)開機即發(fā)現(xiàn)。在 HelperStrategy.kt 中可以看到Helper 模式共有 5 種策略其中NEARBY_DEVICES(2) // Google Nearby —— 且是 DEFAULT 默認(rèn)策略也就是說當(dāng)你什么都不改時Open Headunit 啟動后默認(rèn)走的就是 Nearby 發(fā)現(xiàn)。? 架構(gòu)速覽平板只做發(fā)現(xiàn)者NearbyManager.kt 的類注釋寫得很直白The Tablet acts as a DISCOVERER only平板只做發(fā)現(xiàn)者。整個體系分工如下組件職責(zé)源碼位置NearbyManager發(fā)現(xiàn)手機、發(fā)起連接、組裝流隧道、診斷故障NearbyManager.ktNearbySocket用兩條 Nearby 數(shù)據(jù)流拼出一個標(biāo)準(zhǔn)Socket假象NearbySocket.ktWifiLauncherHelperHelper 模式入口策略路由與隧道就緒回調(diào)WifiLauncherHelper.kt發(fā)現(xiàn)到的設(shè)備通過StateFlowListDiscoveredEndpoint暴露給 UI主界面列表實時刷新用戶點擊設(shè)備或觸發(fā)自動重連時都走同一個connectToEndpoint()入口。 連接四步走從廣播到隧道NearbyManager 內(nèi)部用回調(diào)串聯(lián)起整個生命周期每一步都會上報連接階段見 ConnectionStage.ktSEARCHING—start()校驗定位 藍(lán)牙廣播/掃描/連接權(quán)限后以SERVICE_ID com.andrerinas.openhu、策略P2P_POINT_TO_POINT開始發(fā)現(xiàn)PHONE_ANSWERED—onEndpointFound發(fā)現(xiàn)手機寫入設(shè)備列表若開啟自動重連且設(shè)備名匹配上次記錄立即發(fā)起連接PHONE_JOINING—onConnectionInitiated自動接受連接同時把設(shè)備名存為lastNearbyDeviceName備用并立即停止發(fā)現(xiàn)找到目標(biāo)就不再掃描建隧道— 連接結(jié)果 OK 且?guī)捝壍?HIGH 后maybeBuildTunnel()創(chuàng)建NearbySocket通過ParcelFileDescriptor.createPipe()建管道以Payload.fromStream把管道一端發(fā)給手機隨即回調(diào)onSocketReady(socket)交給CommManager啟動 Android Auto 握手 關(guān)鍵設(shè)計maybeBuildTunnel()同時被連接成功和帶寬變化兩個回調(diào)觸發(fā)。因為 Nearby 的回調(diào)到達(dá)順序不保證拆出這個統(tǒng)一判斷點可以杜絕先收到 HIGH 但端點還沒記錄導(dǎo)致隧道永遠(yuǎn)建不起來的時序坑。 NearbySocket 內(nèi)部一個由兩條流拼成的假 SocketNearby 傳輸?shù)氖?*數(shù)據(jù)流Stream Payload**而不是 TCP 套接字。為了讓上層 AAP 協(xié)議棧無感知地讀寫NearbySocket.kt 繼承java.net.Socket并偽裝isConnected()恒返回truegetInetAddress()返回回環(huán)地址——對上層屏蔽了這不是真網(wǎng)絡(luò)套接字的事實getInputStream()/getOutputStream()返回內(nèi)部包裝流讀寫最終落到 Nearby 的兩條流上寫入后強制 flush因為 GMS Nearby 流會大量緩沖不刷就會卡在握手最巧妙的地方是有界等待手機那條入站流可能晚于我方出站流到達(dá)讀取前必須等它注冊。源碼用CountDownLatch實現(xiàn)等待超時定值為STREAM_WAIT_MS 8_000LNearbySocket.kt#L41。這個 8 秒是精心夾在兩個已知時間之間的實測握手 1.2~1.3 s 8 s 10 s上層握手總預(yù)算 16 sNearby 自身的 payload 超時這樣一旦手機端助手沒有注冊自己的流日志會在 8 秒時明確指出手機端從未送達(dá)流的一半而不是像舊實現(xiàn)那樣讓握手線程無限掛起、數(shù)分鐘后才冒出無頭無尾的報錯。?? 帶寬升級與 10 秒超時Wi-Fi 就緒信號Nearby 連接初始可能跑在低功耗鏈路上必須等onBandwidthChanged報告HIGH質(zhì)量即已切到 Wi-Fi 直連才建隧道。lastQuality按端點緩存看到過的最高質(zhì)量不依賴回調(diào)順序質(zhì)量級別含義是否建隧道LOW / MEDIUM仍在低功耗鏈路? 繼續(xù)等HIGH已升級到 Wi-Fi? 立即建隧道10 秒內(nèi)未見 HIGH升級超時? 斷開并提示檢查 Wi-Fi/藍(lán)牙設(shè)置超時斷開是有意為之——寧可放棄也不讓鏈路回落到藍(lán)牙否則 Android Auto 投屏帶寬完全不夠用。 自動重連與故障自診斷兩個很實用的細(xì)節(jié)都出自 NearbyManager.kt記住你的手機每次onConnectionInitiated都會保存設(shè)備名下次發(fā)現(xiàn)階段一旦匹配到同名設(shè)備且開啟自動連接無需人工點選直接連上隧道失敗二分診斷連接時記錄當(dāng)前網(wǎng)絡(luò)句柄networkAtConnect隧道失敗時再比對一次——若網(wǎng)絡(luò)沒變說明手機根本沒應(yīng)答若網(wǎng)絡(luò)已變說明平板 Wi-Fi 在升級協(xié)商期間被拆掉重建射頻無法同時維持熱點與 P2P 組網(wǎng)此時日志會直接給出建議改用同頻 Wi-Fi 或Common WiFi / Headunit Server策略因為它們復(fù)用現(xiàn)有網(wǎng)絡(luò)、不重配射頻? 排錯清單Nearby 連接失敗的常見原因現(xiàn)象可能原因處理建議設(shè)備列表始終為空定位/藍(lán)牙/NEARBY_WIFI_DEVICESAndroid 13權(quán)限缺失start()直接跳過在系統(tǒng)設(shè)置補齊權(quán)限后重啟服務(wù)卡住 10 秒后斷開帶寬未升級到 HIGH射頻無法同時維持兩個 Wi-Fi 角色兩設(shè)備同頻 Wi-Fi或換 Native/Headunit Server 模式日志報 no inbound payload from phone手機端助手 App 未注冊流確認(rèn)手機端 Wireless Helper 已啟動且版本匹配重復(fù)點擊提示忽略已連接到該端點屬正常去重?zé)o需處理 核心源碼文件導(dǎo)航文件說明NearbyManager.ktNearby 發(fā)現(xiàn)與連接全生命周期管理NearbySocket.kt流隧道包裝成 Socket含 8 秒有界等待WifiLauncherHelper.ktHelper 模式策略入口隧道就緒后接入 CommManagerHelperStrategy.kt5 種 Helper 連接策略枚舉NEARBY 為默認(rèn)ConnectionStage.kt連接階段定義SEARCHING→PHONE_ANSWERED→PHONE_JOINING一句話總結(jié)NearbyManager 負(fù)責(zé)找得到、連得上、診斷得出NearbySocket 負(fù)責(zé)把流偽裝成 Socket、把等待限制住。兩者配合讓 Open Headunit 在開機后幾乎零配置就能自動發(fā)現(xiàn)并連上你的手機 【免費下載鏈接】open-headunitHeadunit App for displaying Android Auto項目地址: https://gitcode.com/GitHub_Trending/he/open-headunit創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考