Невозможно обнаружить устройства Bacnet после привязки Android-приложения с конкретным сетевым интерфейсом (Ethernet/Wi-Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно обнаружить устройства Bacnet после привязки Android-приложения с конкретным сетевым интерфейсом (Ethernet/Wi-

Сообщение Anonymous »

`Я разрабатываю приложение для 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»