Ricerca…


introduzione

In Xamarin.Android le proprietà BluetoothSocket.InputStream e BluetoothSocket.OutputStream sono progettate automaticamente in System.IO.Stream . Nel caso del cosiddetto protocollo di comunicazione interattiva, quando il server risponde solo quando il client parla con esso, System.IO.Stream non va bene perché non ha alcun metodo o proprietà per ottenere il numero di byte di risposta disponibili prima di leggere la risposta.

Parametri

Parametro Dettagli
presa di corrente Un'istanza dell'oggetto BluetoothSocket. Il socket deve essere aperto prima di chiamare questo metodo.
cmd Comando come array di byte da inviare al dispositivo BT.
_mx Poiché questo metodo utilizza una risorsa hardware, è preferibile chiamarlo da un thread di lavoro separato. Questo parametro è un'istanza dell'oggetto System.Threading.Mutex e viene utilizzato per sincronizzare il thread con altri thread che facoltativamente chiamano questo metodo.
tempo scaduto Tempo di attesa in millisecondi tra operazioni di scrittura e lettura.

Invia e ricevi dati da e verso dispositivi Bluetooth tramite socket

L'esempio seguente utilizza i tipi Android.Runtime.InputStreamInvoker e Android.Runtime.OutputStreamInvoker per ottenere Java.IO.InputStream e Java.IO.OutputStream . Una volta che abbiamo un'istanza Java.IO.InputStream , possiamo usare il suo metodo .Available () per ottenere il numero di byte di risposta disponibili che possiamo usare nel metodo .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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow