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
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".