2016-04-24 119 views
3

我需要連接客戶端 - 服務器網絡中的20多個android設備。每個客戶端Android設備將與服務器Android設備進行通信,反之亦然。客戶端設備不需要相互通信。 服務器設備在連接到客戶端時需要短暫的時間訪問互聯網。我可以使用Wi-Fi P2P連接多少臺設備?

我的問題是,Wi-Fi P2P能夠可靠地支持多連接嗎?如果是的話,我該如何去實施它們? 或者我必須確保所有設備都在同一個WLAN上?

+0

你將如何啓動兩個Android設備之間的WiFi p2p?或兩個Android設備上的兩個應用程序之間?你對WiFi p2p有什麼想法? – greenapps

+0

@greenapps:我希望能夠遵循android文檔[這裏](http://developer.android.com/guide/topics/connectivity/wifip2p.html)並使用示例代碼進行構建。我是網絡編程的新手。需要連接這些設備才能在用戶界面將要更新的客戶端 - 服務器之間發送指令。 – Ritz

+0

我不會跟隨你的鏈接。我希望你在這裏發表可讀的可理解文本。 – greenapps

回答

1

根據經驗,在實際部署的Android Wi-Fi Direct應用程序中,20個設備應該不成問題。

理論上,GO是Android設備的Wi-Fi P2P組中的設備的最大數量是254.組所有者被分配了IP 192.168.49.1。客戶端分配的IP範圍爲192.168.49.2至192.168.49.254。

組所有者的地址是由以下中WifiP2pServiceImpl.java定義:

WifiP2pServiceImpl.java,該startDhcpServer(String intf)方法將啓動DHCP服務器爲:

/* Is chosen as a unique address to avoid conflict with 
    the ranges defined in Tethering.java */ 
private static final String SERVER_ADDRESS = "192.168.49.1"; 

確定對於客戶端的範圍被如下進行一個給定的界面 - 並不意外。當組啓動並且設備是組所有者時調用此方法。

仔細看看這段代碼,我們可以看到在InterfaceConfiguration對象上,鏈接地址設置爲192.168.49.1,前綴長度爲24(前綴長度是在子網掩碼中設置的位數,這裏相當於255.255.255.0) - 這意味着答案,但我們可以進一步挖掘。

ifcg = mNwService.getInterfaceConfig(intf); 
ifcg.setLinkAddress(new LinkAddress(NetworkUtils.numericToInetAddress(
        SERVER_ADDRESS), 24)); 
ifcg.setInterfaceUp(); 
mNwService.setInterfaceConfig(intf, ifcg); 

接着,下面的命令將重新啓動與由所述字符串[],tetheringDhcpRanges指定DHCP範圍栓系。 mNwService(網絡管理服務)方法的調用將執行適當的netd命令。

ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(
    Context.CONNECTIVITY_SERVICE); 
String[] tetheringDhcpRanges = cm.getTetheredDhcpRanges(); 
if (mNwService.isTetheringStarted()) { 
    if (DBG) logd("Stop existing tethering and restart it"); 
    mNwService.stopTethering(); 
} 
mNwService.tetherInterface(intf); 
mNwService.startTethering(tetheringDhcpRanges); 

而且cm.getTetheredDhcpRanges()最終是以下的引用(ConnectivityManager.getTetheredDhcpRanges() - > ConnectivityService.getTetheredDhcpRanges() - > Tethering.getTetheredDhcpRanges()):

// USB is 192.168.42.1 and 255.255.255.0 
// Wifi is 192.168.43.1 and 255.255.255.0 
// BT is limited to max default of 5 connections. 192.168.44.1 to 192.168.48.1 
// with 255.255.255.0 
// P2P is 192.168.49.1 and 255.255.255.0 

private String[] mDhcpRange; 
private static final String[] DHCP_DEFAULT_RANGE = { 
    "192.168.42.2", "192.168.42.254", "192.168.43.2", "192.168.43.254", 
    "192.168.44.2", "192.168.44.254", "192.168.45.2", "192.168.45.254", 
    "192.168.46.2", "192.168.46.254", "192.168.47.2", "192.168.47.254", 
    "192.168.48.2", "192.168.48.254", "192.168.49.2", "192.168.49.254", 
} 

和:

mDhcpRange = context.getResources().getStringArray(
    com.android.internal.R.array.config_tether_dhcp_range); 
if ((mDhcpRange.length == 0) || (mDhcpRange.length % 2 ==1)) { 
    mDhcpRange = DHCP_DEFAULT_RANGE; 
} 

in com.android.server.connectivity.Tethering

當然,設備製造商可能會更改此代碼,因此這也值得考慮。

對於那些計劃部署應用程序的地方會有很多用戶,需要一種允許多個設備進行GO的機制。如果數據需要在設備之間進行同步,則模擬「流失」很容易,並且在GO成爲另一個GO的客戶端並同步任何數據之前,GO只能成爲GO一段時間。

1

據我所知,沒有指定最大數量,所以你需要測試一下。硬件之間也可能存在差異。

無論如何,基本的實現將會相當簡單。服務器將調用GreateGroup,所以它將在所有情況下都是Groupowner。然後啓動當地人服務廣告。然後,客戶只需查找廣告,一旦他們看到廣告,他們就會開始連接到服務器。一個服務器連接是通過Wifi直接創建的,您只需從客戶端向服務器啓動套接字通信(服務器始終都會有監聽套接字)。

請注意,連接將要求用戶單擊客戶端嘗試連接到組所有者時顯示的對話框。如果你想擺脫這一點。然後,您可以使用由GreateGroup創建的訪問點,並將訪問點名稱和密碼添加到廣告中。然後你的客戶可以實際使用接入點來連接(比如任何Wlan接入點)

請注意,雖然Wifi Direct方式不會干擾Wifi連接,但它不需要它。但是,接入點的方式意味着客戶端的任何現有Wifi連接都將斷開連接,並且設備認爲與服務器建立的連接將提供正常的互聯網連接。

相關問題