极客秀
搜索

基于C#的软件大杂烩(6.1)——简单的蓝牙助手

本期以及往期的源码都会分享到QQ交流群 :656210280. …..感兴趣的小伙伴可以加群探讨一下。

在很久之前有一期公众号介绍了如何 使用HC05来实现蓝牙通信

,但是事实上并没有很好的蓝牙通讯助手(手机上调试的是一个广告很多的软件),电脑端是利用另一个蓝牙模块接上CH340转TTL模块,将HC05/06的蓝牙转为串口进行通信。因此本期旨在开发一个蓝牙助手可以直接连接蓝牙模块进行通讯。
框架
利用ESP32来模拟BT蓝牙(BLE低功耗蓝牙后续也会进行测试)
C#利用32feet.NET库来实现蓝牙的使用。 ** 准备工作 **
界面布局

这个界面基本也是搬运至前面的串口助手界面,目前制作了发送和接收界面。并且代码逻辑也比较简单,还需要有很大的修改。 ** 软件流程 **
(1)初始化扫描蓝牙设备写入选择框 (2)连接蓝牙设备,连接成功则开启监听线程 (3)监听线程接收到数据设置回调函数将接收到的内容显示在文本框上。
(4)点击发送按钮后将文本框的内容发送给接收端。
** 核心代码 ** ** 初始化 **


private async void Booth_Init(){    try    {        client = new BluetoothClient();        // 使用 Task.Run 来在另一个线程中执行 DiscoverDevices        devices = await Task.Run(() => client.DiscoverDevices());        BoothChoose.Items.Clear();        foreach (BluetoothDeviceInfo device in devices)        {            // 确保 UI 更新在 UI 线程上执行            this.Invoke((MethodInvoker)delegate            {                BoothChoose.Items.Add(device.DeviceName);            });  
            Console.WriteLine(device.DeviceName);        }  
        // 确保在 UI 线程上修改 SelectedIndex        this.Invoke((MethodInvoker)delegate        {            if (BoothChoose.Items.Count > 0)            {                BoothChoose.SelectedIndex = 0;            }        });    }    catch (Exception ex)    {        Console.WriteLine("错误: " + ex.Message);    }}  

初始化的代码是使用异步的方式扫描设备,并且将设备名称显示在选择控件上,之所以是采用异步的方式原因是不采用异步会占用UI线程导致UI线程无法使用。所以需要单独开线程来初始化,同时该函数也可以用于重新扫描设备。
** 蓝牙连接 **


private async void BoothConnect(){    try    {        if (BoothChoose.Items.Count != 0)        {            string selectedDeviceName = BoothChoose.SelectedItem.ToString();  
            // 寻找匹配的设备            BluetoothDeviceInfo deviceToConnect = devices.FirstOrDefault(d => d.DeviceName == selectedDeviceName);            if (deviceToConnect != null)            {                // 连接到设备                await Task.Run(() => client.Connect(deviceToConnect.DeviceAddress, BluetoothService.SerialPort));                MessageBox.Show("连接成功", "信息");                if (client.Connected)                {                    stream = client.GetStream();                    StartListening(OnDataReceived); // 开始监听数据并指定回调                }            }            else            {                MessageBox.Show("未找到选定的设备", "警告");            }        }        else        {            MessageBox.Show("未检测到设备", "警告");        }    }    catch (Exception ex)    {        MessageBox.Show("蓝牙连接失败: " + ex.Message, "错误");    }}

连接蓝牙的代码,根据选择控件选择的蓝牙名称匹配对应的蓝牙设别,接着使用异步的方式来连接蓝牙,防止连接蓝牙的过程中导致UI线程卡顿无法使用。
并且使用一个Stream流变量来接收蓝牙传输的信息,调用StartListening函数来实现蓝牙设备的监听 ** 监听函数 **


private void StartListening(Action<string> callback){    Task.Run(() =>    {        byte[] buffer = new byte[1024]; // 数据缓冲区        int bytes;  
        try        {            while (client.Connected)            {                bytes = stream.Read(buffer, 0, buffer.Length);                if (bytes > 0)                {                    string receivedData = Encoding.UTF8.GetString(buffer, 0, bytes);                    this.Invoke((MethodInvoker)delegate                    {                        callback(receivedData); // 在UI线程上调用回调                    });                }            }        }        catch (IOException ex)        {            // 连接丢失或读取错误            this.Invoke((MethodInvoker)delegate            {                MessageBox.Show("读取数据错误: " + ex.Message, "错误");            });        }    });}  
  
private void OnDataReceived(string data){    if (Receive.InvokeRequired)    {        // 如果调用线程不是创建Receive控件的线程,则使用Invoke调用        Receive.Invoke(new MethodInvoker(delegate        {            Receive.AppendText(data);        }));    }    else    {        // 如果已经在UI线程,则直接更新        Receive.AppendText(data);    }}  

监听函数中我们异步监听数据,并且设置OnDataReceived回调函数处理接收到的数据。
** 发送数据 **


private void TransButton_Click(object sender, EventArgs e){    try    {        // 获取要发送的文本        string dataToSend = TransText.Text;        if (NewLine.Checked)        {            dataToSend += Environment.NewLine;        }        if (client != null && client.Connected)        {            Stream stream = client.GetStream();            if (stream.CanWrite)            {                // 将文本转换为字节数据                byte[] buffer = Encoding.UTF8.GetBytes(dataToSend);                // 发送数据                stream.Write(buffer, 0, buffer.Length);            }        }        else        {            MessageBox.Show("Bluetooth is not connected.");        }    }    catch (Exception ex)    {        MessageBox.Show("Error sending data: " + ex.Message);    }}  

** 效果展示 **

ESP32中的代码是利用蓝牙传输接收到的信息。
因此我们发送信息会接收到发送的信息。 缺点还有很多,后续将会进行迭代升级
往期推荐

1.转载请保留原文链接谢谢!
2.本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3.本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4.本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5.联系方式(#替换成@):pm#vimge.com

  相关内容