2015-10-09 2 views
1

J'ai un problème concernant la communication serveur-client. J'ai fait un googled autour mais je n'ai pas trouvé une solution à ceci. En ce moment j'utilise 32feet pour entrer en contact 2 ou plus (jusqu'à 7) clients de BT à 1 serveur de BT. Je dois diffuser un message du serveur à tous les appareils en même temps, mais je ne sais pas comment le faire. La seule façon que j'ai trouvée était d'utiliser la liste de connexion pour envoyer le message une par fois, mais cela signifie un délai entre chaque message envoyé (environ 100 ms par périphérique). Malheureusement, cela signifie avoir un retard important sur le dernier. Quelqu'un peut-il me donner un conseil s'il vous plaît sur la façon de résoudre ce problème? Existe-t-il un moyen de diffuser le message à tous les appareils en même temps?Diffusion d'un serveur bluetooth vers plusieurs clients bluetooth avec 32feet

Si cela peut être utile, voici la poignée de connexion et de lecture des périphériques.

Merci pour votre aide

private void btnStartServer_Click(object sender, EventArgs e) 
    { 
     btnStartClient.Enabled = false; 
     ConnectAsServer(); 
    } 

    private void ConnectAsServer() 
    { 
     connessioniServer = new List<BluetoothClient>(); 

     // thread handshake 
     Thread bluetoothConnectionControlThread = new Thread(new ThreadStart(ServerControlThread)); 
     bluetoothConnectionControlThread.IsBackground = true; 
     bluetoothConnectionControlThread.Start(); 

     // thread connessione 
     Thread bluetoothServerThread = new Thread(new ThreadStart(ServerConnectThread)); 
     bluetoothServerThread.IsBackground = true; 
     bluetoothServerThread.Start(); 
    } 

    private void ServerControlThread() 
    { 
     while (true) 
     { 
      foreach (BluetoothClient cc in connessioniServer) 
      { 
       if (!cc.Connected) 
       { 
        connessioniServer.Remove(cc); 
        break; 
       } 
      } 
      updateConnList(); 
      Thread.Sleep(0); 
     } 
    } 

    Guid mUUID = new Guid("fc5ffc49-00e3-4c8b-9cf1-6b72aad1001a"); 
    private void ServerConnectThread() 
    { 
     updateUI("server started"); 
     BluetoothListener blueListener = new BluetoothListener(mUUID); 
     blueListener.Start(); 
     while (true) 
     { 
      BluetoothClient conn = blueListener.AcceptBluetoothClient(); 
      connessioniServer.Add(conn); 
      Thread appoggio = new Thread(new ParameterizedThreadStart(ThreadAscoltoClient)); 
      appoggio.IsBackground = true; 
      appoggio.Start(conn); 
      updateUI(conn.RemoteMachineName+" has connected"); 

     } 
    } 

    private void ThreadAscoltoClient(object obj) 
    { 
     BluetoothClient clientServer = (BluetoothClient)obj; 
     Stream streamServer = clientServer.GetStream(); 
     streamServer.ReadTimeout=1000; 
     while (clientServer.Connected) 
     { 
      try 
      { 
       int bytesDaLeggere = clientServer.Available; 
       if (bytesDaLeggere > 0) 
       { 
        byte[] bytesLetti = new byte[bytesDaLeggere]; 
        int byteLetti = 0; 
        while (bytesDaLeggere > 0) 
        { 
         int bytesDavveroLetti = streamServer.Read(bytesLetti, byteLetti, bytesDaLeggere); 
         bytesDaLeggere -= bytesDavveroLetti; 
         byteLetti += bytesDavveroLetti; 
        } 
        updateUI("message sent from "+clientServer.RemoteMachineName+": " + System.Text.Encoding.Default.GetString(bytesLetti)); 
       } 
      } 
      catch { } 
      Thread.Sleep(0); 
     } 
     updateUI(clientServer.RemoteMachineName + " has gone"); 
    } 



    private void updateUI(string message) 
    { 
     Func<int> del = delegate() 
     { 
      textBox1.AppendText(message + System.Environment.NewLine); 
      return 0; 
     }; 
     Invoke(del); 
    } 

    private void updateConnList() 
    { 
     Func<int> del = delegate() 
     { 
      listaSensori.Items.Clear(); 
      foreach (BluetoothClient d in connessioniServer) 
      { 
       listaSensori.Items.Add(d.RemoteMachineName); 
      } 
      return 0; 
     }; 
     try 
     { 
      Invoke(del); 
     } 
     catch { } 
    } 

Répondre

1

Je ne pas vraiment comprendre comment vous le faites en ce moment (les noms italiens ne nous aident pas ...) mais peut-être ma solution peut vous aider. Tout d'abord, bluetooth classic ne supporte pas la diffusion. donc vous devez livrer à un à la fois. Je me connecte à 7 périphériques de port série à la fois, en utilisant 7 threads. alors je dis à chaque fil d'envoyer des données. C'est très proche de la même heure, mais bien sûr pas exactement. Laissez-moi savoir si cela vous aide ou si vous avez besoin d'un exemple de code.