Я столкнулся с проблемой, когда мое приложение для Android не может устанавливать исходящие соединения с использованием класса TcpClient (вопрос находится в здесь). Во время отладки и проведения дальнейших исследований я обнаружил, что мое устройство Android (уровень API 22) получает маску подсети 0.0.0.0 при подключении к моей сети WiFi. Мой DHCP-сервер настроен на использование 255.255.255.0, поэтому я считаю, что это несоответствие может быть корнем моей другой проблемы. Это мой код:
//Connect to the WiFi network
int id = WiFiManager.AddNetwork(new WifiConfiguration()
{
Ssid = $"\"{ssid}\"",
PreSharedKey = $"\"{password}\""
});
WiFiManager.EnableNetwork(id, true);
WiFiManager.Reconnect();
//Retrieve subnet mask (for debugging)
int subnet_mask = WiFiManager.DhcpInfo.Netmask;
subnet_mask возвращает 0, и отформатированная версия класса DhcpInfo показывает:
{ipaddr 10.0.0.15 gateway 10.0.0.0 netmask 0.0.0.0 dns1 10.0.0.0 dns2 0.0.0.0 DHCP server
10.0.0.0 lease 43200 seconds}
В этой ситуации есть ли способ вручную изменить маску подсети (или «сетевую маску») в Android API? я пытался использовать статическую конфигурацию IP, как показано здесь, но использование этих настроек устарело на уровне API 17. Я также пытался установить свойство DhcpInfo.Netmask вручную, но для этого требуется int. Я рассчитал один на основе этот ответ, но он оказался слишком большим и стал uint. Наконец, я просмотрел множество классов, включая Android.Net.Wifi.WifiManager, чтобы узнать, есть ли способ изменить сетевую маску. Я ничего не нашел, но, возможно, я просто искал не в тех местах.
Любая помощь приветствуется!
Обновлять:
По соображениям безопасности кажется, что это невозможно со стандартным Android API. Однако может ли Android NDK изменить маску подсети? Насколько я понимаю, это обеспечивает низкоуровневый доступ к устройству, и мне не нужно размещать это приложение в магазине приложений (оно предназначено только для моего использования).
Из соображений безопасности ОС Android может не позволить вам это сделать.
Я знаю, как пользователь, я бы не хотел, чтобы приложение меняло конфигурацию моей сети.
Кажется, это можно было сделать в прошлом: https://stackoverflow.com/a/7142316/2913599 но этот API устарел/устарел на уровне API 17: https://developer.android.com/reference/android/provider/Settings.System.html#WIFI_STATIC_DNS1
В документах говорится, что вместо этого следует использовать WifiManager, но этот API не позволяет изменять ip, dns, шлюз, опять же, из соображений безопасности.
Если вам нужно изменить эти настройки, возможно, вы можете предоставить страницу с инструкциями для пользователей, чтобы они могли изменить их самостоятельно.
Я не знаком с Android NDK. Поэтому я не даю вам результат о да или нет, но Xamarin.Forms.Android не достигает этого. Xamarin.Forms.Android просто используется для разработки приложения для Android.
Хорошо. Я воздержусь от выбора этого в качестве ответа на случай, если кто-то еще внес свой вклад в эту ситуацию. Спасибо за помощь.
Прошу прощения, что не ответил @Leon. Можно ли это сделать с помощью Android NDK? Если да, то как мне начать использовать его с Xamarin.Forms.Android? Я слышал, что он обеспечивает более низкоуровневый доступ, и оговорка о невозможности опубликовать его в магазине приложений для меня не проблема (приложение предназначено только для моего использования).