This is my code for finding IP addresses in local network.
First you have to find your device IP Address then ping each ip addresses using subnet
of that ip address. Suppose device ip address is 192.168.0.100
then local subnet
is 192.168.0.
. and then ping each IP addresses from 192.168.0.1
to 192.168.0.255
for finding ip address of device you can use two method:
1 Method:
String ip = "";
Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface.getNetworkInterfaces();
while(enumNetworkInterfaces.hasMoreElements())
{
NetworkInterface networkInterface = enumNetworkInterfaces.nextElement();
Enumeration<InetAddress> enumInetAddress = networkInterface.getInetAddresses();
while(enumInetAddress.hasMoreElements())
{
InetAddress inetAddress = enumInetAddress.nextElement();
String ipAddress = "";
if(inetAddress.isSiteLocalAddress())
{
ipAddress = "SiteLocalAddress: ";
}
ip += ipAddress + inetAddress.getHostAddress() + "\n";
String subnet = getSubnetAddress(ip);
private String getSubnetAddress(int address)
{
String ipString = String.format(
"%d.%d.%d",
(address & 0xff),
(address >> 8 & 0xff),
(address >> 16 & 0xff));
return ipString;
}
2 Method:
WifiManager mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo mWifiInfo = mWifiManager.getConnectionInfo();
String subnet = getSubnetAddress(mWifiManager.getDhcpInfo().gateway);
After finding subnet address, ping each IP addresses in network:
private void checkHosts(String subnet)
{
try
{
int timeout=5;
for (int i=1;i<255;i++)
{
String host=subnet + "." + i;
if (InetAddress.getByName(host).isReachable(timeout))
{
Log.d(TAG, "checkHosts() :: "+host + " is reachable");
}
}
}
catch (UnknownHostException e)
{
Log.d(TAG, "checkHosts() :: UnknownHostException e : "+e);
e.printStackTrace();
}
catch (IOException e)
{
Log.d(TAG, "checkHosts() :: IOException e : "+e);
e.printStackTrace();
}
}
After pinging each IP Addresses then android kernel file stored those IP address who are in networks. You can get this list by calling AndroidOS file. This file is arp
which is stored in /proc/net/
in android. You can get in through the code. Just execute particular command programatically and stored in your modelData then notify your listView Through Adapter:
ArrayList<IpAddress> mIpAddressesList;
private boolean getIpFromArpCache()
{
BufferedReader br = null;
char buffer[] = new char[65000];
String currentLine;
try
{
br = new BufferedReader(new FileReader("/proc/net/arp"));
while ((currentLine = br.readLine()) != null)
{
Log.d(TAG, "getIpFromArpCache() :: "+ currentLine);
String[] splitted = currentLine.split(" +");
if (splitted != null && splitted.length >= 4)
{
String ip = splitted[0];
String mac = splitted[3];
if (!splitted[3].equals(emptyMac))
{
if (!splitted[0].equals(IP))
{
// int remove = mac.lastIndexOf(':');
// mac = mac.substring(0,remove) + mac.substring(remove+1);
mac = mac.replace(":", "");
Log.i(TAG, "getIpFromArpCache() :: ip : "+ip+" mac : "+mac);
mIpAddressesList.add(new IpAddress(ip, mac));
}
}
}
}
return true;
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
br.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
return false;
}
public class IpAddress
{
private String ipAddressName;
private String macAddress;
public IpAddress(String ipAddressName, String macAddress)
{
setIpAddressName(ipAddressName);
setMacAddress(macAddress);
}
public void setIpAddressName(String ipAddressName)
{
this.ipAddressName = ipAddressName;
}
public String getIpAddressName()
{
return this.ipAddressName;
}
public void setMacAddress(String macAddress)
{
this.macAddress = macAddress;
}
public String getMacAddress()
{
return this.macAddress;
}
}
But for performing these networking operation on main thread is not good. You have to push all code on thread. and perform all network related isses on background thread. Hope it helps you. let me know weather it works or not.
If you need I would like to share .apk
of this demo.