Szukaj…


Wprowadzenie

W Xamarin.Android właściwości BluetoothSocket.InputStream i BluetoothSocket.OutputStream są z założenia automatycznie konwertowane na System.IO.Stream . W przypadku tak zwanego interaktywnego protokołu komunikacyjnego, gdy serwer odpowiada tylko wtedy, gdy klient z nim rozmawia, System.IO.Stream nie jest dobry, ponieważ nie ma metody ani właściwości, aby uzyskać liczbę dostępnych bajtów odpowiedzi przed odczytaniem odpowiedzi.

Parametry

Parametr Detale
gniazdo elektryczne Instancja obiektu BluetoothSocket. Gniazdo musi zostać otwarte przed wywołaniem tej metody.
cmd Polecenie jako tablica bajtów, aby wysłać do urządzenia BT.
_mx Ponieważ ta metoda wykorzystuje zasób sprzętowy, lepiej jest wywoływać go z osobnego wątku roboczego. Ten parametr jest instancją obiektu System.Threading.Mutex i służy do synchronizacji wątku z innymi wątkami opcjonalnie wywołującymi tę metodę.
koniec czasu Czas oczekiwania w milisekundach między operacjami zapisu i odczytu.

Wysyłaj i odbieraj dane zi do urządzenia Bluetooth za pomocą gniazda

Poniższy przykład wykorzystuje Android.Runtime.InputStreamInvoker i Android.Runtime.OutputStreamInvoker uzyskują Java.IO.InputStream i Java.IO.OutputStream . Gdy mamy już instancję Java.IO.InputStream , możemy użyć jej metody .Available () , aby uzyskać liczbę dostępnych bajtów odpowiedzi, których możemy użyć w metodzie .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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow