Zoeken…


Invoering

In Xamarin.Android worden de BluetoothSocket.InputStream en BluetoothSocket.OutputStream eigenschappen automatisch geconverteerd naar System.IO.Stream . In het geval van een zogenaamd interactief communicatieprotocol, wanneer de server alleen reageert wanneer de client er tegen praat, is System.IO.Stream niet goed omdat het geen methode of eigenschap heeft om het aantal beschikbare responsbytes te verkrijgen voordat het antwoord wordt gelezen.

parameters

Parameter Details
stopcontact Een exemplaar van het BluetoothSocket-object. Socket moet worden geopend voordat deze methode wordt aangeroepen.
cmd Commando als een byte-array om naar BT-apparaat te verzenden.
_mx Omdat deze methode een hardwarebron gebruikt, is het beter om deze vanuit een afzonderlijke werkthread aan te roepen. Deze parameter is een instantie van het System.Threading.Mutex-object en wordt gebruikt om de thread te synchroniseren met andere threads die optioneel deze methode aanroepen.
time-out Wachttijd in milliseconden tussen schrijf- en leesbewerkingen.

Verzend en ontvang gegevens van en naar Bluetooth-apparaat met behulp van socket

Onderstaand voorbeeld worden Android.Runtime.InputStreamInvoker en Android.Runtime.OutputStreamInvoker types verkrijgen Java.IO.InputStream en Java.IO.OutputStream . Zodra we een Java.IO.InputStream- instantie hebben, kunnen we de .Available () -methode gebruiken om het aantal beschikbare responsbytes te krijgen dat we kunnen gebruiken in de .Read () -methode:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow