Не удается открыть сокет 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}");

        }
Другие вопросы по тегам