Suche…


Einführung

In Xamarin.Android werden die Eigenschaften BluetoothSocket.InputStream und BluetoothSocket.OutputStream automatisch in System.IO.Stream konvertiert. Im Falle des sogenannten interaktiven Kommunikationsprotokolls, wenn der Server nur dann antwortet, wenn der Client mit ihm spricht, ist System.IO.Stream nicht geeignet, da er keine Methode oder Eigenschaft hat, um die Anzahl der verfügbaren Antwortbytes vor dem Lesen der Antwort zu erhalten.

Parameter

Parameter Einzelheiten
Steckdose Eine Instanz des BluetoothSocket-Objekts. Socket muss vor dem Aufruf dieser Methode geöffnet werden.
cmd Befehl als Byte-Array zum Senden an das BT-Gerät.
_mx Da diese Methode eine Hardwareressource verwendet, ist es besser, sie von einem separaten Arbeitsthread aus aufzurufen. Dieser Parameter ist eine Instanz des System.Threading.Mutex-Objekts und wird verwendet, um den Thread mit anderen Threads zu synchronisieren, die diese Methode optional aufrufen.
Auszeit Wartezeit in Millisekunden zwischen Schreib- und Lesevorgängen.

Senden und empfangen Sie Daten von und zu einem Bluetooth-Gerät über Socket

Im folgenden Beispiel werden die Typen Android.Runtime.InputStreamInvoker und Android.Runtime.OutputStreamInvoker verwendet, um Java.IO.InputStream und Java.IO.OutputStream zu erhalten . Sobald wir eine Java.IO.InputStream- Instanz haben, können wir die .Available () -Methode verwenden, um die Anzahl der verfügbaren Antwortbytes abzurufen, die wir in der .Read () -Methode verwenden können:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow