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.
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
@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
Ich werde Ihrem Link nicht folgen. Ich erwarte, dass Sie hier einen lesbaren, verständlichen Text veröffentlichen. – greenapps