Getting wifi broadcast address in Android wifi hotspot

前端 未结 1 614
攒了一身酷
攒了一身酷 2021-02-06 00:07

I\'m developing an app that uses wifi to broadcast UDP messages between all the mobiles that are in the same network that have my app.

I managed to send/receive packets

相关标签:
1条回答
  • 2021-02-06 00:53

    First you can check what is your IP address :

    public InetAddress getIpAddress() {
      InetAddress inetAddress = null;
      InetAddress myAddr = null;
    
      try {
        for (Enumeration<NetworkInterface> networkInterface = NetworkInterface
          .getNetworkInterfaces(); networkInterface.hasMoreElements();) {
    
          NetworkInterface singleInterface = networkInterface.nextElement();
    
          for (Enumeration<InetAddress> IpAddresses = singleInterface.getInetAddresses(); IpAddresses
            .hasMoreElements();) {
            inetAddress = IpAddresses.nextElement();
    
            if (!inetAddress.isLoopbackAddress() && (singleInterface.getDisplayName()
                .contains("wlan0") ||
                singleInterface.getDisplayName().contains("eth0") ||
                singleInterface.getDisplayName().contains("ap0"))) {
    
              myAddr = inetAddress;
            }
          }
        }
    
      } catch (SocketException ex) {
        Log.e(TAG, ex.toString());
      }
      return myAddr;
    }
    

    and I used this IP to get Broadcast this way:

    public InetAddress getBroadcast(InetAddress inetAddr) {
    
        NetworkInterface temp;
        InetAddress iAddr = null;
        try {
            temp = NetworkInterface.getByInetAddress(inetAddr);
            List<InterfaceAddress> addresses = temp.getInterfaceAddresses();
    
            for (InterfaceAddress inetAddress: addresses)
    
                iAddr = inetAddress.getBroadcast();
            Log.d(TAG, "iAddr=" + iAddr);
            return iAddr;
    
        } catch (SocketException e) {
    
            e.printStackTrace();
            Log.d(TAG, "getBroadcast" + e.getMessage());
        }
        return null;
    }
    

    It can be done of course in one method, but in my implementation separating it into two method was useful.

    To identify if Wifi Tether is on you can use this code:

    WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    Method[] wmMethods = wifi.getClass().getDeclaredMethods();
    for (Method method: wmMethods) {
        if (method.getName().equals("isWifiApEnabled")) {
    
            try {
                if ((Boolean) method.invoke(wifi)) {
                    isInetConnOn = true;
                    iNetMode = 2;
    
                } else {
                    Log.d(TAG, "WifiTether off");
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    If client devices needs to know if server device is mobile Hotspot, specific IP address can be used. As far as I know, all Tethering devices have the same address 192.168.43.1 It is the same on Android 2.3 and on 4.+, Checked on many phones and tablets. Of course it is not best solution but it is fast. In my application client devices checks (sends packet to this address) and my server devices response in predefined way like "yesIamInTheterModeIamYourServer".

    0 讨论(0)
提交回复
热议问题