Buscar..


Introducción

En Xamarin.Android, las propiedades BluetoothSocket.InputStream y BluetoothSocket.OutputStream se convierten automáticamente por diseño a System.IO.Stream . En el caso del llamado protocolo de comunicación interactivo, cuando el servidor responde solo cuando el cliente habla con él, System.IO.Stream no es bueno porque no tiene ningún método o propiedad para obtener el número de bytes de respuesta disponibles antes de leer la respuesta.

Parámetros

Parámetro Detalles
enchufe Una instancia del objeto BluetoothSocket. El zócalo debe estar abierto antes de llamar a este método.
cmd Comando como una matriz de bytes para enviar al dispositivo BT.
_mx Dado que este método utiliza un recurso de hardware, es mejor llamarlo desde un subproceso de trabajo separado. Este parámetro es una instancia del objeto System.Threading.Mutex y se usa para sincronizar el hilo con otros hilos que, opcionalmente, llaman a este método.
se acabó el tiempo Tiempo de espera en milisegundos entre las operaciones de escritura y lectura.

Envíe y reciba datos desde y hacia un dispositivo bluetooth usando un socket

El ejemplo siguiente utiliza Android.Runtime.InputStreamInvoker y Android.Runtime.OutputStreamInvoker tipos obtienen java.io.InputStream y java.io.OutputStream . Una vez que tengamos una instancia de Java.IO.InputStream , podemos usar su método .Available () para obtener el número de bytes de respuesta disponibles que podemos usar en el método .Read () :

byte[] Talk2BTsocket(BluetoothSocket socket, byte[] cmd, Mutex _mx, int timeOut = 150)
{
    var buf = new byte[0x20];

    _mx.WaitOne();
    try
    {
        using (var ost = socket.OutputStream)
        {
            var _ost = (ost as OutputStreamInvoker).BaseOutputStream;
            _ost.Write(cmd, 0, cmd.Length);
        }

        // needed because when skipped, it can cause no or invalid data on input stream
        Thread.Sleep(timeOut);

        using (var ist = socket.InputStream)
        {
            var _ist = (ist as InputStreamInvoker).BaseInputStream;
            var aa = 0;
            if ((aa = _ist.Available()) > 0)
            {
                var nn = _ist.Read(buf, 0, aa);
                System.Array.Resize(ref buf, nn);
            }
        }
    }
    catch (System.Exception ex)
    {
        DisplayAlert(ex.Message);
    }
    finally
    {
        _mx.ReleaseMutex();     // must be called here !!!
    }

    return buf;
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow