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