Android Can';t ping网关(如果接入点没有internet连接)

Android Can';t ping网关(如果接入点没有internet连接),android,sockets,android-wifi,Android,Sockets,Android Wifi,在我的应用程序中,我通过WifiManager和WifiConfiguration以编程方式连接到无法访问互联网的接入点。后来,我不得不访问一个连接到它的设备来读取数据——但我没有走那么远 连接到Wifi后,我的DHCP设置正常,但如果我尝试通过键入以下内容ping网关地址: $ adb shell OnePlus6:/ $ ping 192.168.1.1 PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data. ^C --- 192.168.1

在我的应用程序中,我通过
WifiManager
WifiConfiguration
以编程方式连接到无法访问互联网的接入点。后来,我不得不访问一个连接到它的设备来读取数据——但我没有走那么远

连接到Wifi后,我的DHCP设置正常,但如果我尝试通过键入以下内容ping网关地址:

$ adb shell
OnePlus6:/ $ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
^C
--- 192.168.1.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1015ms
网关无法检查

我怀疑这与Android(9?)将所有流量重新路由到移动数据的情况有关,例如,你仍然可以浏览互联网

您可以很容易地复制这样的问题:

connectionManager = (ConnectivityManager) 
context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connectionManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
    public void onAvailable(Network network) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            connectionManager.bindProcessToNetwork(network);
        } else {
            ConnectivityManager.setProcessDefaultNetwork(network);
        }
    }
});
  • 连接到没有internet访问的接入点
  • 检查您的互联网是否仍然可用(例如,访问google.com)
  • 通过
    adb
    连接您的手机,并ping您的AP地址
  • 有没有关于如何通过Wifi强制流量的想法,即使它是“离线”的

    编辑:ip路由显示的输出:

    OnePlus6:/ $ ip route show
    10.16.52.64/29 dev rmnet_data0 proto kernel scope link src 10.16.52.67 
    192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.116 
    

    好的,我找到了解决办法。必须将当前进程绑定到正确的网络,可以这样做:

    connectionManager = (ConnectivityManager) 
    context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest.Builder request = new NetworkRequest.Builder();
    request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
    connectionManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
        public void onAvailable(Network network) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                connectionManager.bindProcessToNetwork(network);
            } else {
                ConnectivityManager.setProcessDefaultNetwork(network);
            }
        }
    });
    

    您的Android设备是否在wifi连接之上也有数据连接?是的,移动数据总是一次可添加以下命令的结果?ip路由显示(在adb外壳中运行)是的,请查看我的编辑。这很奇怪,路由表似乎还可以。您是否已经尝试跟踪ping数据包的跳数?尝试一个到192.168.1.1的跟踪路由,这样我们就可以看到流量是如何定向的