阅读

时间:2017-09-20 08:17:34

标签: c# android sockets xamarin bluetooth

我正在开发一个关于Android和iOS应用程序的项目(使用Xamarin Forms)。

此应用程序将能够发现并连接OBD2并与之通信以获取有关汽车的一些数据。

我的问题是下一个问题;在Android中,当我开始从设备发送和接收数据时,第一次通信没问题,我发送了一个ASCII码,设备响应我。但接下来,我发送了另一个ASCII码,当我想读取时,方法BluetoothSocket.InputStream.IsDataAvailable()是假的,所以我不能读更多,而且我不知道怎么做“unblock”这个读取阅读下一个回复。

我的代码:

获取蓝牙插座.-

 socket = device.CreateRfcommSocketToServiceRecord(uuid.Uuid);

//如果第一次失败      socket = device.CreateInsecureRfcommSocketToServiceRecord(uuid.Uuid);

向设备发送信息(第一次通话):

 byte[] cmd = new byte[6];
        cmd[0] = 02;
        cmd[1] = 65;
        cmd[2] = 84;
        cmd[3] = 32;
        cmd[4] = 90;
        cmd[5] = 03;
        //cmd[6] = 04;

        socket.OutputStream.Write(cmd, 0, cmd.Length);
        if (Read().Equals("")){
            throw new System.Exception();
        }
        socket.OutputStream.Flush();

        cmd[0] = 02;
        cmd[1] = 65;
        cmd[2] = 84;
        cmd[3] = 32;
        cmd[4] = 68;
        cmd[5] = 03;
        //cmd = Encoding.ASCII.GetBytes("AT Z");
        socket.OutputStream.Write(cmd, 0, cmd.Length);

        Console.WriteLine("After second write InputStream.IsDataAvailable="+socket.InputStream.IsDataAvailable()); //Always false
        if (Read().Equals("")){
            throw new System.Exception();
        }
        socket.OutputStream.Flush();

阅读回复:

  private  string Read()
    {
        //También probado con BufferedReader.ready() para comprobar si el stream está listo para leer; mismo resultado.



        string data = ""; 
        try

        {               
            System.Text.StringBuilder builder = new System.Text.StringBuilder();
            char c;
            byte a;
            byte[] buffer = new byte[1024];
            //Este tipo de socket no soporta Timeouts
            if (socket.InputStream.IsDataAvailable()) //only entry first time
            {                                       
                int bytes = socket.InputStream.Read(buffer, 0, buffer.Length);

                //while (((a = (byte)socket.InputStream.ReadByte()) > -1))
                for (int i = 0; i < bytes; i++)
                {
                    a = buffer[i];

                    c = (char)a;
                    if (c.Equals('\r')) //Comprobado \r es el último caracter, no llega a  ETX
                    {

                        break;

                    }
                    builder.Append(c);
                }
                data = builder.ToString();
                Console.WriteLine("Información: " + data);

                socket.InputStream.Flush();



            }

            else
            {
                Console.WriteLine("Input Stream no disponible");
            }

        }
        catch (System.Exception e)
        {
            Console.WriteLine("Error de lectura :"+e.Message);

        }

        return data;

    }

我想解决这个问题,因为我必须在不等待的情况下向设备发送大量信息。

0 个答案:

没有答案