我需要連接客戶端 - 服務器網絡中的20多個android設備。每個客戶端Android設備將與服務器Android設備進行通信,反之亦然。客戶端設備不需要相互通信。 服務器設備在連接到客戶端時需要短暫的時間訪問互聯網。我可以使用Wi-Fi P2P連接多少臺設備?
我的問題是,Wi-Fi P2P能夠可靠地支持多連接嗎?如果是的話,我該如何去實施它們? 或者我必須確保所有設備都在同一個WLAN上?
我需要連接客戶端 - 服務器網絡中的20多個android設備。每個客戶端Android設備將與服務器Android設備進行通信,反之亦然。客戶端設備不需要相互通信。 服務器設備在連接到客戶端時需要短暫的時間訪問互聯網。我可以使用Wi-Fi P2P連接多少臺設備?
我的問題是,Wi-Fi P2P能夠可靠地支持多連接嗎?如果是的話,我該如何去實施它們? 或者我必須確保所有設備都在同一個WLAN上?
根據經驗,在實際部署的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一段時間。
請記住,設備不需要連接到網絡以相互連接。 Wi-Fi Direct允許它們直接連接。
這裏,你會發現有用的Wi-Fi直連的資源列表:https://groups.google.com/forum/#!topic/wi-fi-direct/uWpuOzHY6y0
我建議以下Android的Service Discovery Demo,並嘗試自己實現它。演示的source code如下。
據我所知,沒有指定最大數量,所以你需要測試一下。硬件之間也可能存在差異。
無論如何,基本的實現將會相當簡單。服務器將調用GreateGroup,所以它將在所有情況下都是Groupowner。然後啓動當地人服務廣告。然後,客戶只需查找廣告,一旦他們看到廣告,他們就會開始連接到服務器。一個服務器連接是通過Wifi直接創建的,您只需從客戶端向服務器啓動套接字通信(服務器始終都會有監聽套接字)。
請注意,連接將要求用戶單擊客戶端嘗試連接到組所有者時顯示的對話框。如果你想擺脫這一點。然後,您可以使用由GreateGroup創建的訪問點,並將訪問點名稱和密碼添加到廣告中。然後你的客戶可以實際使用接入點來連接(比如任何Wlan接入點)
請注意,雖然Wifi Direct方式不會干擾Wifi連接,但它不需要它。但是,接入點的方式意味着客戶端的任何現有Wifi連接都將斷開連接,並且設備認爲與服務器建立的連接將提供正常的互聯網連接。
你將如何啓動兩個Android設備之間的WiFi p2p?或兩個Android設備上的兩個應用程序之間?你對WiFi p2p有什麼想法? – greenapps
@greenapps:我希望能夠遵循android文檔[這裏](http://developer.android.com/guide/topics/connectivity/wifip2p.html)並使用示例代碼進行構建。我是網絡編程的新手。需要連接這些設備才能在用戶界面將要更新的客戶端 - 服務器之間發送指令。 – Ritz
我不會跟隨你的鏈接。我希望你在這裏發表可讀的可理解文本。 – greenapps