Не удается пропинговать шлюз, если у точки доступа нет подключения к интернету - PullRequest
0 голосов
/ 11 октября 2018

В моем приложении я программно подключаюсь к точке доступа, у которой нет доступа к Интернету через WifiManager и WifiConfiguration.Позже мне нужно получить доступ к устройству, подключенному к нему, для чтения данных - но я не зашел так далеко.

После подключения к Wi-Fi я получаю свои настройки DHCP просто отлично, но если я пытаюсьПроверьте адрес шлюза, набрав:

$ 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?) перенаправляет весь трафик вслучай «мертвого» Wi-Fi на мобильных данных - например, вы все еще можете просматривать Интернет очень хорошо.

Вы можете легко повторить проблему, как это:

  1. Подключение кТочка доступа без доступа к Интернету
  2. Проверьте, работает ли ваш интернет (например, перейдите на google.com)
  3. Подключите телефон через adb и отправьте пинг по адресу вашей точки доступа

Любые идеи о том, как форсировать трафик через Wi-Fi, даже если он "отключен"?

Редактировать: Вывод 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 

1 Ответ

0 голосов
/ 11 октября 2018

Хорошо, я нашел решение.Нужно привязать текущий процесс к правильной сети, что можно сделать так:

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