Xamarin.Android
Xamarin.Android - 블루투스 통신
수색…
소개
Xamarin.Android 에서는 BluetoothSocket.InputStream 및 BluetoothSocket.OutputStream 속성이 자동으로 System.IO.Stream 으로 자동 변환됩니다. 소위 대화식 통신 프로토콜의 경우 서버가 클라이언트와 대화 할 때만 응답 할 경우 응답을 읽기 전에 사용 가능한 응답 바이트 수를 얻기위한 메서드 나 속성이 없기 때문에 System.IO.Stream은 좋지 않습니다.
매개 변수
매개 변수 | 세부 |
---|---|
소켓 | BluetoothSocket 객체의 인스턴스입니다. 이 메소드를 호출하기 전에 소켓을 열어야합니다. |
cmd | BT 장치에 보낼 바이트 배열로 명령. |
_mx | 이 방법은 하드웨어 자원을 사용하기 때문에 별도의 작업자 스레드에서 호출하는 것이 좋습니다. 이 매개 변수는 System.Threading.Mutex 객체의 인스턴스이며이 메서드를 선택적으로 호출하는 다른 스레드와 스레드를 동기화하는 데 사용됩니다. |
timeOut | 쓰기 및 읽기 작업 사이의 대기 시간 (밀리 초). |
소켓을 사용하여 블루투스 장치와 데이터주고 받기
아래 예제에서는 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;
}
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow