Je dois trouver l'adresse IP de l'appareil lorsqu'il héberge un point d'accès sans fil. J'ai utilisé ce code jusqu'à présent:
//if is using Hotspot
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
if (intf.getName().contains("wlan")) {
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && (inetAddress.getAddress().length == 4)) {
return inetAddress.getHostAddress();
}
}
}
}
Cela fonctionne assez bien, mais le nom de NetworkInterface
wifi diffère sur certains appareils. Il faut donc que je trouve d'abord le nom wifi NetworkInterface
de l'appareil (pour son point d'accès). Comment puis-je trouver ce nom? Ou existe-t-il une meilleure approche pour trouver l'adresse IP du périphérique?
/// La recherche de la bonne adresse IP par le MAC ne semble pas non plus fonctionner
J'ai récemment découvert que l'adresse IP WifiAP est codée en dur dans Android. Sauf si un utilisateur a changé cette valeur manuellement (je pense que c'est très rare), l'utilisation de la valeur codée en dur est absolument suffisante. Je pense que c'est la meilleure façon de faire. L'adresse IP est "192.168.43.1": https://github.com/CyanogenMod/Android_frameworks_base/blob/cm-10.1/wifi/Java/Android/net/wifi/WifiStateMachine.java?source=c#L1299
Au début, j'ai essayé de récupérer l'adresse MAC de l'interface WiFi pour la comparer à l'adresse MAC de chaque interface. Mais il s'avère qu'au moins sur mon N4 qui exécute CM, le MAC de l'interface WiFi change lorsque le Hotspot est activé.
J'ai donc écrit du code pour parcourir la liste des périphériques afin de trouver quelque chose pour identifier l'interface wifi. Ce code fonctionne parfaitement sur mon N4:
private String getWifiIp() throws SocketException {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
if (intf.isLoopback()) {
continue;
}
if (intf.isVirtual()) {
continue;
}
if (!intf.isUp()) {
continue;
}
if (intf.isPointToPoint()) {
continue;
}
if (intf.getHardwareAddress() == null) {
continue;
}
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses();
enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (inetAddress.getAddress().length == 4) {
return inetAddress.getHostAddress();
}
}
}
return null;
}
Une seule interface correspond à toutes les conditions: wlan0
.
Autre solution possible:
Parcourez les noms d'interface les plus courants et essayez de les trouver dans la liste: new String[] { "wlan0", "eth0", ...];
Cela peut vous aider.
Appeler le shell pour demander les adaptateurs réseau et vérifier ceux dont vous avez besoin, comme dans le cas présent, suivez le code
Process p=Runtime.getRuntime().exec("ip link show | grep -o \": wlan[0-9]:\" ");
BufferedReader readCommandOutput =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line=null;
while((line=readCommandOutput.readLine())!=null){
// Lines containing wlan will be returned
// parse to get the name of that interface.
String interface=line.split(":")[1];
//this is the interface you need.
}
if (line==null){
//nothing was found.
}
readCommandOutput.close();
Notes attachées
Ou vous pouvez utiliser l'émulateur de terminal Android à partir du Play Store afin d'exécuter cette commande dans Android Shell.
Pour récupérer l'adresse IP
WifiManager wifi=(WifiManager)getSystemService(WIFI_SERVICE);
int address=wifi.getDhcpInfo().ipAddress;
Toast.makeText(this,intToIP(address),1).show();
public String intToIP(int i) {
return ((i & 0xFF)
+ "." + ((i >> 8) & 0xFF)
+ "." + ((i >> 16) & 0xFF)
+ "." + ((i >> 24) & 0xFF));
}
cette solution fonctionne lorsque vous voulez obtenir l'adresse IP du périphérique Hotspot sur le même périphérique mais ne savez pas comment l'obtenir sur un périphérique connecté (la plupart du temps l'adresse IP du serveur est 192.168.43.1, vous pouvez effectuer le travail en codant en dur).
public void serverip()
{
DhcpInfo dhcpInfo = wifiManager.getDhcpInfo();
if (dhcpInfo==null){
Toast.makeText(MainActivity.this, "No ip for server", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "ip of server "+Android.text.format.Formatter.formatIpAddress(dhcpInfo.gateway), Toast.LENGTH_SHORT).show();
}
}
Une fois essayez ce code:
public String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
String ip = Formatter.formatIpAddress(inetAddress.hashCode());
Toast.makeText(getApplicationContext(), "***** IP="+ ip, 1).show();
return ip;
}
}
}
} catch (SocketException ex) {
Toast.makeText(getApplicationContext(), "***** IP="+ex.toString(), 1).show();
}
return null;
}
Ecrivez le code lors de la création pour vérifier, hotspot est Activer ne sont pas .....
WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);
wifiManager.setWifiEnabled(false);
boolean wifiEnabled = wifiManager.isWifiEnabled();
if (wifiEnabled) {
Toast.makeText(getApplicationContext(),"on",Toast.LENGTH_SHORT).show();
getLocalIpAddress();
}else {
Toast.makeText(getApplicationContext(),"off",Toast.LENGTH_SHORT).show();
}
Veuillez remplacer intf.getName()
par intf.getDisplayName()
, puis essayez.
user2224350 a déclaré: "J'ai récemment découvert que l'adresse IP WifiAP est codée en dur dans Android."
Sauf si un utilisateur a changé cette valeur manuellement (je pense que c'est très rare), l'utilisation de la valeur codée en dur est absolument suffisante. Je pense que c'est la meilleure façon de faire. L'adresse IP est "192.168.43.1", comme on le voit ici .
Cela fonctionne sur mon Samsung A3 et Huawei PRA-LX1, mais le HTC Desires 530 renvoie également 192.168.1.1
.