Я работаю над собственным 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-соединение.