Не удается открыть сокет ESP32 из приложения Xamarin.Forms после обновления до Android 9
Открытие сокета TCP, который прослушивает порт 3000 на ESP32 из приложения Xamarin.Forms, больше не работает после обновления телефона до Android 9. На Android 8 это работало, но после обновления сокет открыть нельзя.
Следующее исключение выдается приложением:
System.InvalidOperationException: The operation is not allowed on non-connected sockets.
Я уже попробовал несколько методов для решения этой проблемы:
- Попробовать приложение на старом телефоне (Android 6), который работает
- Попытка открытия сокета на ESP32 с ПК с помощью netcat, который работает
- Попытка открытия сокета на ПК из приложения, которое работает
- Попытка открыть сокет на ESP32 из другого клиентского приложения TCP на смартфоне, который работает
Все вышеперечисленное работает, но попытка открыть сокет TCP на ESP32 из приложения форм xamarin - нет.
Я также пытался
- enabeling cleartextTrafficPermitted, который не работает
- добавив разрешение "ИНТЕРНЕТ" в манифест Android, который не работает
Для приложения Xamarin.Forms используется этот код
var client = new TcpClient();
var result = client.BeginConnect("192.168.1.1", 3000, null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1));
try
{
NetworkStream nwStream = client.GetStream();
byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(message);
nwStream.Write(bytesToSend, 0, bytesToSend.Length);
}
catch (Exception e)
{
Console.WriteLine(e);
}
client.EndConnect(result);
На стороне слушателя я использую это для прослушивания:
client_socket = accept(soc, (struct sockaddr *)&remote_addr, &socklen);
read(client_socket, recv_buf, sizeof(recv_buf));
Похоже, Android не может открыть сокет на ESP32, вопрос в том, почему?
1 ответ
У меня тоже была проблема с сокетом при обновлении до Android 9. У меня было приложение ionic-cordova и приложение Xamarin, чтобы попробовать базовое соединение через сокет tcp на локальном wifi (размещенном на распреде)
Все работало на предыдущей версии для Android и на ноутбуке, но я получал тайм-аут в Android-пироге.
Оказывается, поскольку у моего Raspberry не было подключения к Интернету, при попытке открыть сокет по IP-адресу Android 9 не использовал сеть WLAN, но попытался использовать подключение 4G к Интернету и потерпел неудачу. После того как я выключил 4G, ему удалось подключиться к Rasp.
мой простой пример кода для открытия соединения в Xamarin:
private TcpClient m_client;
async public void connect(string address, int port)
{
if(m_client.Connected)
{
m_client.Close();
}
try
{
await m_client.ConnectAsync(address, port);
}catch(Exception e)
{
Console.WriteLine($"error while connecting: {e.Message}");
}
Console.WriteLine($"is connected : {m_client.Connected}");
}