2013-07-29 30 views
5

我們正在開發一款適用於Android的小應用程序,以便在同一網絡(相同的SSID和相同的網絡配置,但不同的物理位置)中的兩個不同無線接入點之間平滑切換,目的是不丟棄現有連接在切換執行之後。我一直在閱讀幾篇文章,解釋如何以編程方式控制wifi,現在我們有一半的工作解決方案。Android中的平滑WiFi切換

我們實現它的方式是,服務根據我們的標準以最佳信號掃描AP,如果它不同於系統當前連接的AP,它將切換到新的AP。代碼的相關部分:

... 
// Some initializations and bestOne is the ScanResult with the best signal 
conf.BSSID = bestOne.BSSID; 
actualNid = mWifiManager.updateNetwork(conf); 
mWifiManager.enableNetwork(actualNid, false); 
mWifiManager.saveConfiguration(); 
conf = getWifiConfiguration(mWifiManager, conf); 
if(conf == null) { 
    return; 
} 
if(!mWifiManager.enableNetwork(conf.networkId, true)) { 
    return; 
} 
if (mWifiManager.reconnect()) { 
    // Great 
} else { 
    // Error 
} 

問題是所有的執行都會經過預期的代碼路徑。然而,切換並未真正執行,日誌顯示爲執行重新連接,並返回true。此外,沒有收到任何來自SUPPLICANT_CONNECTION_CHANGE_ACTION或SUPPLICANT_STATE_CHANGED_ACTION的事件,所以似乎甚至沒有觸發切換。

另一個事實是,如果我們在啓用網絡之前插入一個mWifiManager.disconnect()切換實際上執行。不過,這並不是一種選擇,因爲正在運行的應用程序會失去連接,從而導致會話中斷,這正是我們想要避免的。

任何建議都是值得歡迎的。

+2

我不認爲這是可能實現從應用程序內。在可能的WiFi驅動程序級別上,但它不是那麼容易:http://code.google.com/p/android/issues/detail?id=12649(說「這是一個硬件特定的功能」 - 所以可能甚至沒有驅動程序級別) – zapl

回答

1

這可能不只是軟件相關的問題。通常,網絡適配器(wifi)負責跟蹤信號電平並決定何時漫遊和何處漫遊。這些算法是特定於供應商的,並且可能無法影響它們。漫遊是通過從客戶端發送802.11重關聯幀(請求)完成的,漫遊過程在L2級(在您的方案中)完成。但是這個過程可能不是那麼簡單。兩個AP都應該知道客戶端是否漫遊,並且向這些AP發送幀的交換機應該在其CAM表中進行更新。客戶端從中漫遊的AP可能會緩衝發往客戶端的所有幀,並在客戶端重新關聯時將其發送給新的AP,從而導致數據丟失。由於這不是802.11標準所要求的,漫遊可能導致數據丟失,並且明顯地重新連接到具有更強信號的AP會導致連接下降,因爲它不僅漫遊而且完全斷開並且重新連接到網絡。

這可能不會幫助你解決你的問題,但我試圖指出,這是真正應該在較低級別(物理,數據鏈接或傳輸)而不是在應用程序級別上完成的事情。天氣漫遊將實際上是無縫的,取決於很多使用的硬件(雙方)和網絡的配置,並且你可以做的很多事情來改變它。唯一需要考慮的是發送802.11探測請求,以便客戶端知道其他可能具有更強信號的AP,這些信號已經在您的代碼中執行,並且決定漫遊到網絡適配器。

+0

我看,如果是硬件限制,那麼可以做的不多。不過,我想知道,即使在斷開/連接循環中,是否有辦法避免操作系統丟棄現有連接。我們有一個遠程顯示器超時並在切換時完全斷開連接,我們正在尋找一些解決方法,如果可能的話,不涉及完全重新連接應用程序。 –

+0

即使網絡連接不穩定,如果可以,最好關注如何維持應用內連接。這是wifi的一種可能的情況,除此之外,即使漫遊到另一個AP,根據硬件和網絡實施情況,即使漫遊過程持續時間小於0.1s,連接中斷也可持續幾秒。如果您的應用閒置一段時間,某些路由器/ FW也可以向您發送TCP/IP RST(重置您的連接)。你應該在應用程序中有一些控制來處理這些類型的問題,因爲不幸的是你不能消除所有這些問題。 – pajaja

+0

這對於實時應用程序來說可能很棘手,當斷開/連接到另一個AP而不是漫遊時,可能會有更嚴重的缺陷。例如,除了完全重置TCP連接以外,DHCP還可以向您發出另一個IP地址,根據您實施的身份驗證方式,可以爲您再次提供更多工作,以便再次快速建立連接。 對不起,我不能對你有更多的幫助。我不是Android的專家,因此可能已經有一些內置的機制可以完成(或幫助您),但完全不可能完全避免。 – pajaja