2

我有关于服务器-客户端通信的问题。我四处搜索,但没有找到解决方案。现在我正在使用 32feet 来联系 2 个或更多(直到 7 个)BT 客户端到 1 个 BT 服务器。我需要同时从服务器向每个设备广播一条消息,但我不知道该怎么做。我想出的唯一方法是使用连接列表来每次发送一条消息,但这意味着发送的每条消息之间存在延迟(每台设备大约 100 毫秒)。不幸的是,这意味着最后一个有很大的延迟。有人可以给我一个关于如何解决这个问题的建议吗?有没有办法同时向所有设备广播消息?

如果有帮助,这里有连接和从设备读取的句柄。

谢谢你的帮助

 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 { }
    }
4

1 回答 1

1

我不完全明白你现在是怎么做的(意大利名字没有帮助......)但也许我的解决方案可以帮助你。

首先,蓝牙经典不支持广播。所以你必须一次交付一个。我一次连接到 7 个串行端口设备,使用 7 个线程。然后我告诉每个线程发送数据。这非常接近同一时间,但当然不完全一致。

让我知道这是否有帮助或者您是否需要代码示例。

于 2016-04-15T16:59:23.653 回答