Die eigene IP zu ermitteln, mit der man im WLAN angemeldet ist, war eine echte Herausforderung. Über die App "Einstellungen" auf dem Smartphone ist möglich, sich diese anzeigen zu lassen. Aber das gleiche per Java zu machen, war nicht einfach. Die meisten der Tipps aus dem Internet funktionierten nicht. Ähnlich kompliziert war es auf dem PC. Hier gewinnt man schon über den Aufruf von ipconfig in der Command-Box einen Eindruck darüber, dass das Ganze etwas komplexer ist. 

Der häufigste Tipp für das Smartphone war die Adresse per InetAddress.getLocalHost() abzurufen. Hier wird aber die IP des localhost zurückgeliefert. Diese ist i.d.R. "127.0.0.1", eben die übliche localhost-Adresse (wie der Methoden-Name schon sagt ...). Ein anderer gern gegebener Hinweis war ServerSocket.getInetAddress() zu benutzen. Die Android-Dokumentation sagt: "Gets the local IP address of this server socket or null if the socket is unbound.". Zurückgegeben wird die IP, der es erlaubt ist, Verbindung mit dem Server aufzunehmen (So sagen zumindest andere Internet-Hinweise.). im Regelfall wird "0.0.0.0" zurückgegeben. Für den PC sah es ähnlich aus.

 Die Lösungen für das Smartphone und den PC sind im wesentlichen identisch. Ein funktionierende Version inspiziert alle Netzwerk-Interfaces und sucht das heraus, das mit dem WLAN verbunden ist. Von diesem Interface wird dann die IPv4-Adresse genommen. Problematisch kann es werden, wenn das Gerät mehr als einen WLAN-Adapter besitzt. Bei mir ist das nicht der Fall, deshalb habe ich der Einfachheit halber alle genommen. Das führt zwar zu Fehlern, wenn es wirklich mehrere Adapter geben würde. Aber man würde es merken.

Ich habe versucht, den Code für die Java- und die VB-Variante möglichst gleich zu halten. Die Objekt-Modelle im WiFi-Bereich sind recht ähnlich, so dass dies gut möglich ist. Ein inhaltlicher Unterschied liegt in der Auswahl des richtigen Netzwerk-Adapters. Zunächst wird geprüft, ob der Adapter aktiv ist (Eigenschaft up). Auf dem Smartphone werden die ausgelassen die das Attribut isLoopback besitzen (das ist die mit der Adresse "127.0.0.1". Auf den PC ist dies nicht ausreichend, hier gibt es üblicherweise sowohl aktive LAN- als auch WLAN-Adapter. Hier hilft das Überprüfen der NetworkInterfaceType-Eigenschaft. Diese muss den Wert Wireless80211 besitzen.

Der Java-Code:

/**
 * Ermittelt die IP-Adressen, mit denen das Gerät im WLAN angemeldet ist.<p>
 * Es werden alle bekannten Netzwerk-Interfaces durchsucht und die genommen,
 * die aktiv und nicht als isLoopback markiert sind.
 * Genommen werden die IPv4-Adressen.<p>
 * Werden mehr als eine Adresse gefunden, enthält der Rückgabewert alle
 * gefundenen Adressen. Diese sind durch ein Leerzeichen getrennt.
 * 
 * @return Die eigene WLAN-IP-Adresse (ggf. mehrere oder Leer-String).
 */  
public static String getWlanIp() {  
   String returnData = ""; // Rückgabewert  
   try {  
      for (Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); 
                                                             networkInterfaces.hasMoreElements();) {  
         NetworkInterface networkInterface = networkInterfaces.nextElement();
         if (networkInterface.isUp() && !networkInterface.isLoopback())  
            for (Enumeration<InetAddress> enumIpAddr = networkInterface.getInetAddresses(); enumIpAddr.hasMoreElements();) {  
               InetAddress inetAddress = enumIpAddr.nextElement();
               if (InetAddressUtils.isIPv4Address(inetAddress.getHostAddress()))  
                  returnData += " " + inetAddress.getHostAddress();  
            } // for Enumeration<InetAddress>  
      } // for Enumeration<NetworkInterface>  
   } catch (SocketException ex) { // nichts zu tun  
   }
   return returnData.trim();  
}

Der Visual Basic Code:

''' <summary>  
''' Ermittelt die IP-Adressen, mit denen das Gerät im WLAN angemeldet ist.  
''' </summary>  
''' <returns>Die eigene WLAN-IP-Adresse (ggf. mehrere oder Leer-String).</returns>  
''' <remarks>Es werden alle bekannten Netzwerk-Interfaces durchsucht und die genommen,  
''' die aktiv und nicht als isLoopback markiert sind.  
''' Genommen werden die IPv4-Adressen.<para/>  
''' Werden mehr als eine Adresse gefunden, enthält der Rückgabewert alle  
''' gefundenen Adressen. Diese sind durch ein Leerzeichen getrennt.  
''' </remarks>  
''' <seealso cref="System.Net.NetworkInformation">System.Net.NetworkInformation</seealso>
Public Shared Function getWlanIp() As String  
   Dim returnData As String = ""  
   Dim networkInterfaces As IEnumerable(Of NetworkInterface) = NetworkInterface.GetAllNetworkInterfaces()  
   For Each networkInterface As NetworkInterface In networkInterfaces  
      If networkInterface.OperationalStatus = OperationalStatus.Up And networkInterface.NetworkInterfaceType = NetworkInterfaceType.Wireless80211 Then  
         ' WLAN-Interface gefunden  
         Dim addresses As UnicastIPAddressInformationCollection = networkInterface.GetIPProperties.UnicastAddresses  
         For Each addressInfo As UnicastIPAddressInformation In addresses  
            Dim address As IPAddress = addressInfo.Address  
            If addressInfo.Address.AddressFamily = AddressFamily.InterNetwork Then  
               returnData &= " " & addressInfo.Address.ToString()  
            End If  
         Next  
      End If  
   Next  
   Return returnData.Trim  
End Function