Ошибка ETIMEDOUT и HOSTROUTE в сокете TCP через WiFi без интернета в приложении React Native для Android - PullRequest
0 голосов
/ 18 января 2019

Я работаю над собственным IoT-приложением, которое требует от меня подключения к локальному устройству через точку доступа и предоставления ему учетных данных WiFi.

Я пробую это в 3 телефонах: Vevo1601 (Android 6), Asus Zenfone Z00LD (Android 6.1) и Redmi Note 5 (Android 8.1)

Подключение к точке доступа работает без проблем, но TCP-сокет выдает ошибки 8/10 раз в Vevo, 2/10 раз в Asus и 5/10 раз в Redmi.

Я использую нативную TCP-библиотеку по технологиям очистки: https://www.npmjs.com/package/react-native-tcp

let ip = "";
let port = "1884";
ip = this.generateDeviceIP(sortedWifiDevice.BSSID);
wifi.forceWifiUsage(true); //method in self created android library to    bind socket to wifi network
var net = require("react-native-tcp");
let tcpClient = net.createConnection({ host: ip, port: port }

Android-метод forceWifiUsage

public void forceWifiUsage(boolean useWifi) {
    boolean canWriteFlag = false;
    if (useWifi) {
        Log.d("> Wifi Logs >> ", "usewifi is true : ");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                Log.d("> Wifi Logs >> ", "build >M line 1327 ");
                canWriteFlag = Settings.System.canWrite(context);

                if (!canWriteFlag) {
                    Log.d("> Wifi Logs >> ", "build >M .... !canwrite 1331 ");
                    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                    intent.setData(Uri.parse("package:" + context.getPackageName()));
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);
                }
            }

            if (((Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) && canWriteFlag) ||
                    ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) &&
                            !(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M))) {
                Log.d("> Wifi Logs >> ", "build >M .... canwrite 1342 ");
                final ConnectivityManager manager = (ConnectivityManager) context
                        .getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkRequest.Builder builder;
                builder = new NetworkRequest.Builder();
                //set the transport type do WIFI
                builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);


                manager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
                    @Override
                    public void onAvailable(Network network) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            manager.bindProcessToNetwork(network);
                            Log.d("> Wifi Logs >> ", "bindprocess 1356");
                        } else {
                            //This method was deprecated in API level 23
                            ConnectivityManager.setProcessDefaultNetwork(network);
                            Log.d("> Wifi Logs >> ", "setprocess default network 1360");
                        }
                        try {
                        } catch (Exception e) {
                            Log.d("> Wifi Logs >> ", "exception 1364");
                            e.printStackTrace();
                        }
                        manager.unregisterNetworkCallback(this);
                        Log.d("> Wifi Logs >> ", "unregisternetwork 1368");
                    }
                });
            }
        }
    } else {
        Log.d("> Wifi Logs >> ", "usewifi false");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Log.d("> Wifi Logs >> ", "usewifi false..... greater than marshmallow... 1376");
            ConnectivityManager manager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            manager.bindProcessToNetwork(null);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Log.d("> Wifi Logs >> ", "usewifi false..... greater than lollipop....1381");
            ConnectivityManager.setProcessDefaultNetwork(null);
        }
    }
}

Я перепробовал все, начиная от официальных документов Android и заканчивая материалами на этом портале, но он просто выбрасывал ETIMEDOUT или Host недоступными в большинстве случаев, но иногда это работает.

У меня даже в телефоне Vevo нет сим-карты, а работает только через WiFi-соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...