Xamarin.Android
Xamarin.Android - Bluetooth-Kommunikation
Suche…
Einführung
In Xamarin.Android werden die Eigenschaften BluetoothSocket.InputStream und BluetoothSocket.OutputStream automatisch in System.IO.Stream konvertiert. Im Falle des sogenannten interaktiven Kommunikationsprotokolls, wenn der Server nur dann antwortet, wenn der Client mit ihm spricht, ist System.IO.Stream nicht geeignet, da er keine Methode oder Eigenschaft hat, um die Anzahl der verfügbaren Antwortbytes vor dem Lesen der Antwort zu erhalten.
Parameter
Parameter | Einzelheiten |
---|---|
Steckdose | Eine Instanz des BluetoothSocket-Objekts. Socket muss vor dem Aufruf dieser Methode geöffnet werden. |
cmd | Befehl als Byte-Array zum Senden an das BT-Gerät. |
_mx | Da diese Methode eine Hardwareressource verwendet, ist es besser, sie von einem separaten Arbeitsthread aus aufzurufen. Dieser Parameter ist eine Instanz des System.Threading.Mutex-Objekts und wird verwendet, um den Thread mit anderen Threads zu synchronisieren, die diese Methode optional aufrufen. |
Auszeit | Wartezeit in Millisekunden zwischen Schreib- und Lesevorgängen. |
Senden und empfangen Sie Daten von und zu einem Bluetooth-Gerät über Socket
Im folgenden Beispiel werden die Typen Android.Runtime.InputStreamInvoker und Android.Runtime.OutputStreamInvoker verwendet, um Java.IO.InputStream und Java.IO.OutputStream zu erhalten . Sobald wir eine Java.IO.InputStream- Instanz haben, können wir die .Available () -Methode verwenden, um die Anzahl der verfügbaren Antwortbytes abzurufen, die wir in der .Read () -Methode verwenden können:
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;
}