从蓝牙服务器广播到多个32英尺的蓝牙客户端

本文关键字:客户端 服务器 广播 | 更新日期: 2023-09-27 18:16:58

我有一个关于服务器-客户端通信的问题。我谷歌了一下,但我没有找到解决这个问题的方法。现在我使用32英尺来连接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 { }
    }

从蓝牙服务器广播到多个32英尺的蓝牙客户端

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

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

让我知道如果这有帮助,或者如果你需要一个代码示例。