サーチ…


前書き

Xamarin.AndroidBluetoothSocket.InputStreamBluetoothSocket.OutputStreamプロパティは、デザインによって自動的System.IO.Streamに変換されます。いわゆる対話型通信プロトコルの場合、サーバーがクライアントと通信するときだけサーバーが応答すると、応答を読み取る前に使用可能な応答バイト数を取得するメソッドまたはプロパティーがないため、System.IO.Streamは良好ではありません。

パラメーター

パラメータ詳細
ソケット BluetoothSocketオブジェクトのインスタンスです。このメソッドを呼び出す前にソケットを開く必要があります。
cmd BTデバイスに送信するバイト配列としてのコマンド。
_mx このメソッドはハードウェアリソースを使用するので、別のワーカースレッドから呼び出すほうがよいです。このパラメータは、System.Threading.Mutexオブジェクトのインスタンスであり、このメソッドを任意に呼び出す他のスレッドとスレッドを同期させるために使用されます。
タイムアウト書き込み操作と読み取り操作の間の待機時間(ミリ秒)。

ソケットを使用してBluetoothデバイスとの間でデータの送受信を行う

以下の例では、使用Android.Runtime.InputStreamInvokerAndroid.Runtime.OutputStreamInvokerタイプが取得するjava.io.InputStreamにjava.io.OutputStreamを 。私たちがするjava.io.InputStreamインスタンスを持っていたら、私たちは)(.Read方法を使用することができます可能なレスポンスのバイト数を取得するためにその.Available()メソッドを使用することができます。

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