在Android的WiFi热点获取无线网络的广播地址(Getting wifi broadcast

2019-08-05 01:04发布

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 from many cellphones having an external AP, that's my router.

But given the case that there's no AP, I want users to be able to use their phone's Wifi Hotspot feature so they can still use my aplication. So one of the cellphones would be the wifi hotspot, and all the others would connect to that.

I require users to connect to a wifi by they own. Either to an external AP or to the said hotspot. Then when my application starts, it checks whether the phone is connected to a wifi network, calling the WifiManager.isWifiEnabled() and NetworkInfo.isConnected().

The problem is that if I call these functions in the cellphone that's using hotspot, the function isConnected() will return false. And I can't get the broadcast address using WifiManager.getDhcpInfo(). The other phones that are connected to the hotspot they do work perfectly. But the hotspot cellphone can't send any broadcast, since WifiManager is disabled.

So, my question would be "Is there any way to check if a cellphone is currently being a wifi hotspot? And if so, is there any way I can get its broadcast address?"

Answer 1:

首先,你可以检查什么是您的IP地址:

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

我用这个IP拿到转播这样:

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

它当然可以在一个方法来完成,但是在我执行它分成两个方法是有用的。

要确定是否无线上网系绳上,你可以使用此代码:

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

    }
}

如果客户端设备需要知道服务器设备的移动热点,可以使用特定的IP地址。 据我所知,所有的网络共享设备具有相同的地址192.168.43.1这是在Android 2.3和4 +一样的,经过许多手机和平板电脑。 当然,这不是最好的解决方案,但它的速度很快。 在我的应用的客户端设备检查(发送数据包至该地址),并在如“yesIamInTheterModeIamYourServer”预定义的方式我的服务器设备的响应。



文章来源: Getting wifi broadcast address in Android wifi hotspot