Xamarin.Android
Xamarin.Android - Comunicacion Bluetooth
Buscar..
Introducción
En Xamarin.Android, las propiedades BluetoothSocket.InputStream y BluetoothSocket.OutputStream se convierten automáticamente por diseño a System.IO.Stream . En el caso del llamado protocolo de comunicación interactivo, cuando el servidor responde solo cuando el cliente habla con él, System.IO.Stream no es bueno porque no tiene ningún método o propiedad para obtener el número de bytes de respuesta disponibles antes de leer la respuesta.
Parámetros
Parámetro | Detalles |
---|---|
enchufe | Una instancia del objeto BluetoothSocket. El zócalo debe estar abierto antes de llamar a este método. |
cmd | Comando como una matriz de bytes para enviar al dispositivo BT. |
_mx | Dado que este método utiliza un recurso de hardware, es mejor llamarlo desde un subproceso de trabajo separado. Este parámetro es una instancia del objeto System.Threading.Mutex y se usa para sincronizar el hilo con otros hilos que, opcionalmente, llaman a este método. |
se acabó el tiempo | Tiempo de espera en milisegundos entre las operaciones de escritura y lectura. |
Envíe y reciba datos desde y hacia un dispositivo bluetooth usando un socket
El ejemplo siguiente utiliza Android.Runtime.InputStreamInvoker y Android.Runtime.OutputStreamInvoker tipos obtienen java.io.InputStream y java.io.OutputStream . Una vez que tengamos una instancia de Java.IO.InputStream , podemos usar su método .Available () para obtener el número de bytes de respuesta disponibles que podemos usar en el método .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;
}