Xamarin.Android
Xamarin.Android - Comunicazione Bluetooth
Ricerca…
introduzione
In Xamarin.Android le proprietà BluetoothSocket.InputStream e BluetoothSocket.OutputStream sono progettate automaticamente in System.IO.Stream . Nel caso del cosiddetto protocollo di comunicazione interattiva, quando il server risponde solo quando il client parla con esso, System.IO.Stream non va bene perché non ha alcun metodo o proprietà per ottenere il numero di byte di risposta disponibili prima di leggere la risposta.
Parametri
Parametro | Dettagli |
---|---|
presa di corrente | Un'istanza dell'oggetto BluetoothSocket. Il socket deve essere aperto prima di chiamare questo metodo. |
cmd | Comando come array di byte da inviare al dispositivo BT. |
_mx | Poiché questo metodo utilizza una risorsa hardware, è preferibile chiamarlo da un thread di lavoro separato. Questo parametro è un'istanza dell'oggetto System.Threading.Mutex e viene utilizzato per sincronizzare il thread con altri thread che facoltativamente chiamano questo metodo. |
tempo scaduto | Tempo di attesa in millisecondi tra operazioni di scrittura e lettura. |
Invia e ricevi dati da e verso dispositivi Bluetooth tramite socket
L'esempio seguente utilizza i tipi Android.Runtime.InputStreamInvoker e Android.Runtime.OutputStreamInvoker per ottenere Java.IO.InputStream e Java.IO.OutputStream . Una volta che abbiamo un'istanza Java.IO.InputStream , possiamo usare il suo metodo .Available () per ottenere il numero di byte di risposta disponibili che possiamo usare nel metodo .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;
}