在安卓设备中从WiFi热点获取IP

4

我希望能够获取Android设备通过WiFi连接的另一台计算机的WiFi热点IP地址,而不是Android设备的本地IP地址。我在真实设备上运行应用程序。

我可以扫描所有的WiFi并获取它们的名称。

public class WifiConnectorActivity extends Activity {
    TextView mainText;
      WifiManager mainWifi;
      WifiReceiver receiverWifi;
      List<ScanResult> wifiList;
      StringBuilder sb = new StringBuilder();
    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mainWifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);

        mainText = (TextView) findViewById(R.id.text);
        mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        receiverWifi = new WifiReceiver();
        if(!mainWifi.isWifiEnabled()){
            mainWifi.setWifiEnabled(true);
        }
        registerReceiver(receiverWifi, new IntentFilter(
           WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
        mainWifi.startScan();
        mainText.setText("\nStarting Scan...\n");
    }



    class WifiReceiver extends BroadcastReceiver {
        public void onReceive(Context c, Intent intent) {
        StringBuilder sb = new StringBuilder();
        wifiList = mainWifi.getScanResults();
        for(int i = 0; i < wifiList.size(); i++){
          sb.append(new Integer(i+1).toString() + ".");
          sb.append((wifiList.get(i)).toString());
          sb.append("\n");
        }      

        mainText.setText(sb);
        }
      }


}

当然,我可以使用以下代码获取本地IP地址:
public static String getLocalIpAddressString() {
          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()) {
                          return inetAddress.getHostAddress().toString();
                      }
                  }
              }
          } catch (Exception ex) {
              Log.e("IPADDRESS", ex.toString());
          }
          return null;
         }

例如,我可以看到Android设备的本地IP地址为192.168.2.101,但如何在代码中获取WiFi热点的IP地址为192.168.2.1。 谢谢!
2个回答

0

并非所有的WiFi接入点都有IP地址!这不是必须的,它运行在不同的层。

话虽如此,如果无线接入点具有MAC地址,可以使用反向ARP获取其IP地址。同时需要注意的是,该IP地址有时与有线接口不同。

对于家庭一体化无线路由器,您还可以检查DHCP分配的网关地址,但同样,这与接入点没有直接相关性。


1
谢谢!但问题是我必须使用套接字来连接它,除非我有一个IP地址,否则我不知道该怎么做(我尝试使用WiFi名称,但它不起作用)。你有什么建议吗? - ductran
通过 WiFi 连接电脑以进行远程操作(如关机、重启、远程控制 PowerPoint 幻灯片等)。我尝试使用静态 IP 来测试 Android 设备和电脑连接,成功了。问题是我不知道如何从代码中获取电脑的 IP 地址。 - ductran
你说你想获取接入点的IP地址,而不是计算机的IP地址。你需要计算机的IP地址还是接入点的IP地址?你需要提示用户输入计算机的IP地址或主机名。否则他们怎么知道你指的是哪台计算机?另外一种方法是发送信标包,但这通常是不建议或不必要的。 - Brad
抱歉,我忘了。我使用Connectify程序,在PC上创建一个WiFi热点。一个Android设备连接到它上面。我可以看到PC上WiFi热点的IP地址是192.168.2.1,Android设备是192.168.2.101。我刚刚发现:我使用PC名称作为主机名,它可以工作,但是使用WiFi名称时就不行了。也许听起来很傻,但我不知道如何解决这个问题(是否需要为从Android获取PC名称提出新的问题?或者做些什么?)。无论如何,感谢您的帮助! - ductran
@R4j,WiFi SSID(名称)与TCP/IP无关,因此您无法直接解析它。但是,由于托管Connectify的PC将在运行AP模式的同一NIC上使用TCP/IP,因此您可以使用反向ARP来获取它。您应该从无线信息中了解它的MAC地址。您应该发布一个新的StackOverflow问题:“如何在Android上使用反向ARP从已知MAC获取IP地址?” - Brad

0

如果您正在使用默认子网,则主机IP地址192.168.2.101直接意味着访问点地址为192.168.2.1。您的IP地址属于C组。因此,对于该组中的任何地址x.x.x.y,子网本身是x.x.x.0,第一个主机地址x.x.x.1分配给访问点。所有其他地址:x.x.x.2x.x.x.254分配给连接的主机,x.x.x.255是本地广播地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接