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

时间:2015-10-09 10:18:50

标签: c# bluetooth server client 32feet

我遇到了有关服务器 - 客户端通信的问题。 我用Google搜索,但我没有找到解决方案。 现在我正在使用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 { }
    }

1 个答案:

答案 0 :(得分:1)

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

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

如果有帮助或者您需要代码示例,请告诉我。