2016-04-24 6 views
3

Ich muss 20+ Android-Geräte in einem Client-Server-Netzwerk verbinden. Jedes Client-Android-Gerät kommuniziert mit dem Server Android-Gerät und umgekehrt. Die Client-Geräte müssen nicht miteinander kommunizieren. Das Servergerät benötigt für kurze Zeit Zugriff auf das Internet, während es mit den Clients verbunden ist.Wie viele Geräte kann ich mit Wi-Fi P2P verbinden?

Meine Frage ist, kann Wi-Fi P2P so viele Verbindungen zuverlässig unterstützen? Und wenn ja, wie gehe ich vor, sie umzusetzen? Oder muss ich sicherstellen, dass alle Geräte im selben WLAN sind?

+0

Wie würden Sie Wifi P2P zwischen zwei Android-Geräten initiieren? Oder zwischen zwei Apps auf zwei Android-Geräten? Was denkst du mit Wifi P2P? – greenapps

+0

@greenapps: Ich hatte gehofft, den android docs [hier] (http://developer.android.com/guide/topics/connectivity/wifip2p.html) zu folgen und den Beispielcode zu verwenden, um darauf aufzubauen. Ich bin neu in der Netzwerkprogrammierung. Die Geräte müssen verbunden werden, um Anweisungen zwischen Client-Server zu senden, auf deren Grundlage die Benutzeroberfläche aktualisiert wird. – Ritz

+0

Ich werde Ihrem Link nicht folgen. Ich erwarte, dass Sie hier einen lesbaren, verständlichen Text veröffentlichen. – greenapps

Antwort

1

Erfahrungsgemäß sollten in einer realen Anwendung einer Android Wi-Fi Direct-Anwendung 20 Geräte kein Problem darstellen.

Theoretisch beträgt die maximale Anzahl von Geräten in einer Wi-Fi P2P-Gruppe, bei der es sich bei dem GO um ein Android-Gerät handelt, 254. Dem Gruppenbesitzer wird die IP 192.168.49.1 zugewiesen. Den Clients wird eine IP aus dem Bereich 192.168.49.2 bis 192.168.49.254 zugewiesen.

Der Gruppeneigentümer-Adresse wird durch die folgende in WifiP2pServiceImpl.java definiert:

/* 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"; 

den Bereich für die Kunden Bestimmung wie folgt durchgeführt wird:

In WifiP2pServiceImpl.java wird die startDhcpServer(String intf) Methode den DHCP-Server starten eine gegebene Schnittstelle - keine Überraschung. Diese Methode wird aufgerufen, wenn die Gruppe gestartet wurde und das Gerät der Gruppenbesitzer ist.

Wenn wir uns diesen Code genauer ansehen, sehen wir, dass im InterfaceConfiguration-Objekt die Linkadresse auf 192.168.49.1 gesetzt ist und die Präfixlänge 24 ist (Präfixlänge ist die Anzahl der in einer Subnetzmaske gesetzten Bits). hier entspricht 255.255.255.0) - dies impliziert die Antwort, aber wir können ein wenig weiter graben.

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

Als nächstes werden die folgenden Befehle wird neu gestartet, mit dem DHCP-Bereich durch den String angegeben Anbindehaltung [], tetheringDhcpRanges. Die Aufrufe von mNwService-Methoden (Network Management Service) führen die entsprechenden netd-Befehle aus.

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); 

Und cm.getTetheredDhcpRanges() ist letztlich eine Bezugnahme auf die folgenden (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", 
} 

und:

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.

Natürlich ist es für den Gerätehersteller möglich, diesen Code zu ändern, also ist dies auch eine Überlegung wert.

Für diejenigen, die Anwendungen bereitstellen möchten, bei denen viele Benutzer vorhanden sind, ist ein Mechanismus erforderlich, um mehr als ein Gerät GO zu ermöglichen. Wenn Daten zwischen Geräten synchronisiert werden müssen, ist es einfach, "Churn" zu simulieren und GOs sind nur ein GO für einen Zeitraum, bevor sie ein Client für ein anderes GO werden und alle Daten synchronisieren.

0

Denken Sie daran, dass Geräte nicht mit einem Netzwerk verbunden sein müssen, um eine Verbindung herzustellen. Wi-Fi Direct ermöglicht ihnen eine direkte Verbindung. Hier

ist eine Liste mit Wi-Fi Direct-Ressourcen, die Sie nützlich finden können: https://groups.google.com/forum/#!topic/wi-fi-direct/uWpuOzHY6y0

Ich empfehle Androids folgenden würde Service Discovery Demo und versuchen Sie es selbst zu implementieren. Und hier ist die source code für die Demo.

1

Die maximale Anzahl, soweit ich weiß, ist nicht angegeben, so dass Sie dies testen müssen, um sicher zu sein. Auch könnte es Unterschiede zwischen Hardware geben.

Wie auch immer, die grundlegende Implementierung wäre ziemlich einfach. Der Server würde GreateGroup anrufen, also wäre es in allen Fällen der Gruppenbesitzer. Und dann starten Sie Einheimische Service-Werbung. Clients würden dann einfach nach der Werbung suchen und sobald sie sie sehen, würden sie den Verbindungsprozess zum Server starten. Wenn die Serververbindung über Wifi direkt hergestellt wird, würden Sie einfach die Socket-Kommunikation vom Client zum Server starten (der Server würde zu jeder Zeit eine Verbindung herstellen).

Beachten Sie, dass die Verbindung erfordert, dass der Benutzer auf den angezeigten Dialog klickt, wenn der Client versucht, eine Verbindung zum Gruppenbesitzer herzustellen. Und wenn Sie das loswerden wollen. Dann könnten Sie den von GreateGroup erstellten Accesspoint verwenden und den Namen des Access Points sowie das Passwort der Werbung hinzufügen. Dann könnten Ihre Kunden tatsächlich den Access Point zum Verbinden verwenden (wie bei jedem Wlan-Zugangspunkt)

Beachten Sie jedoch, dass der Wifi Direkte Weg, Wifi-Verbindungen nicht stören würde, nicht würde es erfordern. Der Access Point-Weg würde jedoch bedeuten, dass eine bestehende Wifi-Verbindung vom Client getrennt wird, und das Gerät denkt, dass die Verbindung zum Server eine normale Internetverbindung herstellen würde.

Verwandte Themen