从android中的wifi热点获取IP

从android中的wifi热点获取IP,android,ip,android-wifi,Android,Ip,Android Wifi,我想获取android设备通过wifi连接的wifi热点(从另一台计算机)的IP,而不是android的本地IP。我在真实设备中运行应用程序。 我可以扫描所有的wifi并得到它们的名字 public class WifiConnectorActivity extends Activity { TextView mainText; WifiManager mainWifi; WifiReceiver receiverWifi; List<ScanR

我想获取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);
        }
      }


}
公共类WifiConnectorActivity扩展活动{
文本视图主文本;
WifiManager mainWifi;
无线接收器接收器;
列表wifiList;
StringBuilder sb=新的StringBuilder();
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mainWifi=(WifiManager)getSystemService(Context.WIFI\u SERVICE);
mainText=(TextView)findViewById(R.id.text);
mainWifi=(WifiManager)getSystemService(Context.WIFI\u SERVICE);
receiverWifi=新WifiReceiver();
如果(!mainWifi.isWifiEnabled()){
mainWifi.setWifiEnabled(true);
}
注册接收方(接收方、新意向过滤器)(
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
mainWifi.startScan();
mainText.setText(“\n开始扫描…\n”);
}
类WifiReceiver扩展了BroadcastReceiver{
接收时公共无效(上下文c,意图){
StringBuilder sb=新的StringBuilder();
wifiList=mainWifi.getScanResults();
对于(int i=0;i
当然,我可以使用以下代码获取本地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;
         }
public静态字符串getLocalIpAddressString(){
试一试{
对于(枚举en=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){
NetworkInterface intf=en.nextElement();
对于(枚举Enumeration EnumipAddress=intf.getInetAddresses();EnumipAddress.hasMoreElements();){
InetAddress InetAddress=enumIpAddr.nextElement();
如果(!inetAddress.isLoopbackAddress()){
返回inetAddress.getHostAddress().toString();
}
}
}
}捕获(例外情况除外){
Log.e(“IPADDRESS”,例如toString());
}
返回null;
}
例如,我可以看到android设备的IP本地是192.168.2.101,但如何获取wifi热点的IP代码是192.168.2.1。
谢谢

并非所有WiFi接入点都有IP地址!这不是一项要求。它运行在不同的层上

也就是说,如果AP有IP地址,你可以在AP的无线MAC上使用反向ARP来获取其IP地址。还要注意,此IP有时与有线接口不同


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

如果您使用默认子网,那么主机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.2
x.x.254
分配给连接的主机,
x.x.255
是本地广播地址

谢谢!但问题是我必须使用socket连接它,除非我有IP地址,否则我不知道怎么做(我尝试使用wifi名称,但它不起作用)你有什么建议吗?通过wifi连接PC以进行远程it(例如关机、重新启动、远程PowerPoint幻灯片…)。我尝试使用安卓设备(如上)和PC的静态IP进行测试。成功了。问题是我不知道如何从代码中获取PC的IP。你说你想获取接入点的IP地址,而不是计算机的IP地址。您想要计算机IP还是接入点IP?您必须提示用户输入计算机的IP或主机名。否则他们怎么知道你指的是哪台计算机?唯一的其他方法是发送信标数据包,但这通常是不建议或不必要的。对不起,我忘了。我使用connectify程序,在PC上创建一个wifi热点。一个android设备连接到它。我可以看到PC上wifi热点的IP是192.168.2.1,android设备是192.168.2.101。我只是发现:我使用PC名作为主机名,它工作正常,但当使用wifi名时却不起作用。也许这听起来很愚蠢,但我不知道如何解决这个问题(提出一个新问题,从android获取PC名称?或者做些什么?)。无论如何,谢谢你的帮助@R4j,WiFi SSID(名称)与TCP/IP无关,因此无法直接解析。但是,由于托管Connectiony的PC将在以AP模式运行的同一NIC上使用TCP/IP,因此您可以使用反向ARP来获取它。你应该从无线信息中知道是MAC。你应该发布一个新的StackOverflow问题:“如何使用反向ARP从Android上已知的MAC上获取IP地址?”