1

将手机更新到 Android 9 后,从 Xamarin.Forms 应用程序打开正在侦听 ESP32 端口 3000 的 TCP 套接字不再起作用。在 Android 8 上这有效,但更新套接字后无法打开。

应用程序抛出以下异常:

System.InvalidOperationException: The operation is not allowed on non-connected sockets.

我已经尝试了一些方法来解决这个问题:

  • 在旧手机(Android 6)上试用该应用程序,该应用程序有效
  • 尝试使用有效的 netcat 从 PC 打开 ESP32 上的套接字
  • 尝试从有效的应用程序打开电脑上的套接字
  • 尝试从智能手机上的不同 TCP 客户端应用程序打开 ESP32 上的套接字

以上所有工作,但试图从 xamarin 表单应用程序打开 ESP32 上的 TCP 套接字却没有。

我也试过

  • 启用 cleartextTrafficPermitted不起作用
  • 将“INTERNET”权限添加到不起作用的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上的套接字,问题是为什么?

4

1 回答 1

0

升级到 Android 9 时,我也遇到了套接字连接问题。我有一个 ionic-cordova 和一个 Xamarin 表单应用程序来尝试本地 wifi 上的基本 tcp 套接字连接(托管在树莓上)

这一切都在以前的 android 版本上运行,并且来自笔记本电脑,但我在 android pie 中超时。

事实证明,由于我的 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}");

        }
于 2019-07-15T09:59:01.790 回答