【问题标题】:Can't ping Gateway if Access Point has no internet connection如果接入点没有互联网连接,则无法 ping 网关
【发布时间】:2018-10-11 13:01:35
【问题描述】:

在我的应用程序中,我通过WifiManagerWifiConfiguration 以编程方式连接到无法访问互联网的接入点。稍后我必须访问与其连接的设备来读取数据——但我没有走那么远。

连接到 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?) 将所有流量重新路由到移动数据“死” Wifi 的事实有关 - 例如,您仍然可以正常浏览互联网。

您可以像这样轻松复制问题:

  1. 连接到无互联网接入的接入点
  2. 检查您的互联网是否仍然可用(例如,访问 google.com)
  3. 通过adb连接您的手机并ping您的AP地址

关于如何通过 Wifi 强制流量的任何想法,即使它是“离线”的?

编辑:ip route show 的输出:

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 

【问题讨论】:

  • 您的 Android 设备是否也有数据连接,高于 wifi 设备?
  • 是的,移动数据始终开启
  • 能否请您添加以下命令的结果? ip route show(在 adb shell 中运行)
  • 是的,请看我的编辑
  • 奇怪,路由表好像没问题。您是否已经尝试过跟踪 ping 数据包的跃点?尝试到 192.168.1.1 的 traceroute,这样我们就可以看到流量是如何被引导的

标签: android sockets android-wifi


【解决方案1】:

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

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);
        }
    }
});

【讨论】:

    猜你喜欢
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多