Не удается открыть сокет ESP32 из приложения Xamarin.Forms после обновления до Android 9 - PullRequest
1 голос
/ 06 июня 2019

Открытие сокета 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 Ответ

0 голосов
/ 15 июля 2019

У меня тоже была проблема с сокетом при обновлении до Android 9. У меня было приложение ionic-cordova и приложение Xamarin, чтобы опробовать базовое соединение через tcp по локальной сети Wi-Fi (при распечатке)

Все работало на предыдущей версии для Android и на ноутбуке, но я получал таймаут в пироге для Android.

Оказывается, поскольку у моего Raspberry не было подключения к Интернету, при попытке открыть сокет по IP-адресу Android 9 не использовал сеть WLAN, но попытался использовать подключение 4G к Интернету и потерпел неудачу. После того как я выключил 4G, ему удалось подключиться к рашпилю.

мой простой пример кода для открытия соединения в 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}");

        }
...