`Я разрабатываю приложение для Android, которое намеревалось использовать Ethernet для обнаружения устройств Bacnet в локальной сети, в то время как Wi-Fi используется для общего интернет-подключения. Устройство имеет одновременно подключенные интерфейсы Ethernet и Wi-Fi. или Wi-Fi), привязка сети, по-видимому, удастся, как указано в журналах. Тем не менее, я не могу обнаружить устройства Bacnet по Ethernet после связывания, когда активны и Ethernet, и Wi-Fi. Эта проблема возникает на Android 12 (API -уровне 31). Тот же код работает на старых версиях Android (например, Android 7), где я могу успешно обнаружить устройства, используя любой интерфейс. Поведение приложения: < /strong> < /p>
Когда активен только один интерфейс (Ethernet или Wi-Fi), приложение успешно обнаруживает устройства в этой сети.
Когда оба интерфейса (Ethernet и Wi-Fi) активны, я связываюсь с требуемым интерфейсом с использованием BindProcessonetWork (). Журналы показывают, что процесс успешно связан, но обнаружение устройства не работает по Ethernet (обнаружены устройства Bacnet, но я не могу получить объекты).
наблюдаемое поведение: < /p>
Журналы приложений показывают, что процесс связан с Ethernet (transport_ethernet), но устройства Bacnet не обнаружены.
Когда я отключаю Wi-Fi, устройства на Ethernet успешно обнаружены.
Тот же код отлично работает на Android 7, где приложение может обнаружить устройства, используя любой интерфейс, даже если оба активны. < /P>
среда: < /strong>
версия Android: 12 (уровень API 31)
Приложение Требование: < /strong>
Wi-Fi необходим для общего Интернета доступ.
Ethernet используется для обнаружения устройств Bacnet в локальной сети. li> Используется DatagramSocket для обнаружения устройства Bacnet после привязки к Ethernet. < /li>
Обеспеченные разрешения установлены для доступа к сети (access_network_state, Change_network_state). < /Li>
Проверьте, что обнаружение устройства работает, когда активен только один интерфейс (Ethernet или Wi-Fi). < /Li>
Протестировал тот же код на Android 7, где это работает, как и ожидалось. private static void bindToBestNetwork() {
Network[] networks = connectivityManager.getAllNetworks();
Network ethernetNetwork = null;
Network wifiNetwork = null;
// Check available networks and prioritize Ethernet
for (Network network : networks) {
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
if (capabilities != null) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
ethernetNetwork = network;
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
wifiNetwork = network;
}
}
}
// Prioritize Ethernet, fall back to Wi-Fi if Ethernet is not available
if (ethernetNetwork != null) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(false);
ConnectivityManager.setProcessDefaultNetwork(ethernetNetwork);
boolean success = connectivityManager.bindProcessToNetwork(ethernetNetwork);
wifiManager.disconnect();
WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock("bacnetLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
try {
Log.d(TAG,"Binding socket to Ethernet network");
DatagramSocket socket = new DatagramSocket();
ethernetNetwork.bindSocket(socket);
} catch (Exception e) {
Log.d(TAG,"Exception while binding socket to Ethernet network");
e.printStackTrace();
}
if (success) {
Log.d(TAG, "Ethernet network successfully bound");
} else {
Log.d(TAG, "Ethernet network binding failed");
}
} else if (wifiNetwork != null) {
boolean success = connectivityManager.bindProcessToNetwork(wifiNetwork);
if (success) {
Log.d(TAG, "Wi-Fi network successfully bound");
} else {
Log.d(TAG, "Wi-Fi network binding failed");
}
} else {
connectivityManager.bindProcessToNetwork(null);
}
}
// Register a callback for Ethernet network
private static void registerEthernetListener() {
Log.d(TAG, "Registering Ethernet listener");
NetworkRequest ethernetRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
ethernetCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
Log.d(TAG, "Ethernet network Available");
bindToBestNetwork();
}
@Override
public void onLost(Network network) {
Log.d(TAG, "Ethernet network lost");
bindToBestNetwork();
}
};
connectivityManager.requestNetwork(ethernetRequest,ethernetCallback);
}
// Register a callback for Wi-Fi network
private static void registerWifiListener() {
Log.d(TAG, "Registering Wi-Fi listener");
NetworkRequest wifiRequest = new NetworkRequest.Builder()
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
wifiCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
Log.d(TAG, "Wi-Fi network Available");
bindToBestNetwork();
}
@Override
public void onLost(Network network) {
Log.d(TAG, "Wi-Fi network lost");
bindToBestNetwork();
}
};
connectivityManager.requestNetwork(wifiRequest, wifiCallback);
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... ic-network
Невозможно обнаружить устройства Bacnet после привязки Android-приложения с конкретным сетевым интерфейсом (Ethernet/Wi- ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как связать гнездо Android с конкретным сетевым интерфейсом (Wi-Fi/Cellular)
Anonymous » » в форуме Android - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как связать гнездо Android с конкретным сетевым интерфейсом (Wi-Fi/Cellular)
Anonymous » » в форуме Android - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-