Recherche…


Introduction

Dans Xamarin.Android, les propriétés BluetoothSocket.InputStream et BluetoothSocket.OutputStream sont automatiquement converties dans System.IO.Stream . Dans le cas du protocole de communication interactif, lorsque le serveur ne répond que lorsque le client lui parle, System.IO.Stream n'est pas bon car il ne possède aucune méthode ou propriété pour obtenir le nombre d'octets de réponse disponibles avant de lire la réponse.

Paramètres

Paramètre Détails
prise Une instance d'objet BluetoothSocket. Socket doit être ouvert avant d'appeler cette méthode.
cmd Commande en tant que tableau d'octets à envoyer au périphérique BT.
_mx Comme cette méthode utilise une ressource matérielle, il est préférable de l'appeler à partir d'un thread de travail distinct. Ce paramètre est une instance de l'objet System.Threading.Mutex et permet de synchroniser le thread avec d'autres threads appelant éventuellement cette méthode.
temps libre Temps d'attente en millisecondes entre les opérations d'écriture et de lecture.

Envoyer et recevoir des données depuis et vers un périphérique Bluetooth via socket

L'exemple ci-dessous utilise les types Android.Runtime.InputStreamInvoker et Android.Runtime.OutputStreamInvoker pour obtenir Java.IO.InputStream et Java.IO.OutputStream . Une fois que nous avons une instance Java.IO.InputStream , nous pouvons utiliser sa méthode .Available () pour obtenir le nombre d'octets de réponse disponibles que nous pouvons utiliser dans la méthode .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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow