从蓝牙服务器广播到多个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 { }
}
我不太明白你现在是怎么做的(意大利名字没有帮助…),但也许我的解决方案可以帮助你。
首先,蓝牙经典不支持广播。所以你只能一次送一个。我确实一次连接到7个串行端口设备,使用7个线程。然后告诉每个线程发送数据。这非常接近同一时间,但当然不是完全一样。
让我知道如果这有帮助,或者如果你需要一个代码示例。