Xamarin.Android
Xamarin.Android - Bluetooth-связь
Поиск…
Вступление
В Xamarin.Android свойства BluetoothSocket.InputStream и BluetoothSocket.OutputStream автоматически преобразуются в System.IO.Stream . В случае так называемого интерактивного протокола связи, когда сервер отвечает только тогда, когда клиент общается с ним, System.IO.Stream не подходит, потому что у него нет метода или свойства для получения количества доступных байтов ответа перед чтением ответа.
параметры
параметр | подробности |
---|---|
разъем | Экземпляр объекта BluetoothSocket. Перед вызовом этого метода необходимо открыть сокет. |
CMD | Команда в качестве байтового массива для отправки на устройство BT. |
_mx | Поскольку этот метод использует аппаратный ресурс, лучше назвать его из отдельного рабочего потока. Этот параметр является экземпляром объекта System.Threading.Mutex и используется для синхронизации потока с другими потоками, необязательно вызывающего этот метод. |
Тайм-аут | Время ожидания в миллисекундах между операциями записи и чтения. |
Отправлять и получать данные с устройства bluetooth с помощью сокета
В приведенном ниже примере используются типы Android.Runtime.InputStreamInvoker и Android.Runtime.OutputStreamInvoker получают Java.IO.InputStream и Java.IO.OutputStream . Когда у нас есть экземпляр Java.IO.InputStream , мы можем использовать его метод .Available () для получения количества доступных байтов ответа, которые мы можем использовать в методе .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;
}