Xamarin.Android
Xamarin.Android - Bluetooth-communicatie
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;
}