How to get each device's IP address in Wi-Fi Direct scenario?

前端 未结 6 1943
陌清茗
陌清茗 2020-11-28 06:21

Starting from ICS, Wi-Fi Direct is introduced. Normally, we use the WifiP2pManager class to operate on Wi-Fi Direct, but it seems that it can only retrieve the

6条回答
  •  青春惊慌失措
    2020-11-28 06:57

    I encountered the same problem. Since both devices know the group owner's ip, it is already possible to send a message to the group owner. The first message you send can contain the ip address of the other device; from then on, bidirectional communication is possible.

    Here's a possibility for retrieving your ip in java:

    private byte[] getLocalIPAddress() {
        try { 
            for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
                NetworkInterface intf = en.nextElement(); 
                for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
                    InetAddress inetAddress = enumIpAddr.nextElement(); 
                    if (!inetAddress.isLoopbackAddress()) { 
                        if (inetAddress instanceof Inet4Address) { // fix for Galaxy Nexus. IPv4 is easy to use :-) 
                            return inetAddress.getAddress(); 
                        } 
                        //return inetAddress.getHostAddress().toString(); // Galaxy Nexus returns IPv6 
                    } 
                } 
            } 
        } catch (SocketException ex) { 
            //Log.e("AndroidNetworkAddressFactory", "getLocalIPAddress()", ex); 
        } catch (NullPointerException ex) { 
            //Log.e("AndroidNetworkAddressFactory", "getLocalIPAddress()", ex); 
        } 
        return null; 
    }
    
    private String getDottedDecimalIP(byte[] ipAddr) {
        //convert to dotted decimal notation:
        String ipAddrStr = "";
        for (int i=0; i 0) {
                ipAddrStr += ".";
            }
            ipAddrStr += ipAddr[i]&0xFF;
        }
        return ipAddrStr;
    }
    
    ip = getDottedDecimalIP(getLocalIPAddress());
    

    Wrap this ip in a Serializable object and send it to the group owner like you would send any other object. Consider this the first step in your wifi-direct protocol... Now, the group owner also has an IP to send answers to.

    This works for me, although I think it's weird that I had to implement this myself and I could only find the group owner ip easily (info.groupOwnerAddress.getHostAddress(); //with info a WifiP2pInfo instance). Maybe there is a comparable way to retrieve the ip of the other peers, but I couldn't find it. Please contact me if you do.

    Good luck...

提交回复
热议问题