C#实现蓝牙连接、数据收发与文件传输功能
作者:小码编匠
前言
在软件开发中,跨设备通信已经成为一种常见需求。尤其是在工业控制、智能家居、医疗设备等领域,蓝牙通信因其低功耗、短距离、高安全性等优点,被广泛应用于各类桌面和移动应用中。
本文将以一个完整的 WinForm 桌面应用程序为例,详细介绍如何使用 InTheHand.Net.Bluetooth 库实现以下核心功能:
扫描可用蓝牙设备
选择并建立蓝牙连接
实现蓝牙数据的接收与发送
支持蓝牙文件传输(SPP协议)
通过本文的学习,掌握如何在WinForm中轻松集成蓝牙通信模块,为大家项目添加更多交互性与扩展能力。
一、开发环境准备
开发工具
Visual Studio 2022
.NET Framework 4.7.2 或更高版本(支持 Bluetooth)
目标平台:WPF / WinForm
第三方库引用
使用 InTheHand.Net.Personal 提供的蓝牙 SDK 来简化蓝牙操作:
Install-Package InTheHand.Net.Personal
该库提供了对蓝牙设备发现、连接、数据流读写等完整封装,适用于 Windows 平台下的蓝牙 SPP 协议通信。
二、电脑端蓝牙配置
确保你的电脑已开启蓝牙功能,并且系统支持蓝牙适配器。

同时,在手机端打开蓝牙设置,并允许接收来自其他设备的数据传输请求。
三、效果展示
以下是本项目实现的主要功能界面与运行效果截图:
1、扫描蓝牙设备

2、选择设备并连接

3、接收蓝牙消息

4、发送文件到手机

四、核心代码
1、引用命名空间
using InTheHand.Net; using InTheHand.Net.Sockets; using InTheHand.Net.Bluetooth;
2、定义关键变量
private BluetoothClient btClient;
private NetworkStream btStream;
private BluetoothDeviceInfo selectedDevice;
private readonly Guid serviceUUID = new Guid("00001132-0000-1000-8000-00805f9b34fb"); // 标准 SPP 服务 UUID
注意:不同设备可能使用不同的 UUID,建议查阅设备文档或尝试通用 SPP UUID。
3、扫描蓝牙设备
private void btnScan_Click(object sender, EventArgs e)
{
lstDevices.Items.Clear();
btClient = new BluetoothClient();
var devices = btClient.DiscoverDevices(); // 最多可发现 255 台设备
foreach (var device in devices)
{
lstDevices.Items.Add($"{device.DeviceName} [{device.DeviceAddress}]");
}
}
4、选择设备并建立连接
private void lstDevices_SelectedIndexChanged(object sender, EventArgs e)
{
var devices = btClient.DiscoverDevices();
selectedDevice = devices[lstDevices.SelectedIndex];
richTextBox1.AppendText($"已选择:{selectedDevice.DeviceName}\n");
}
private void btnConnect_Click(object sender, EventArgs e)
{
try
{
btClient.Connect(selectedDevice.DeviceAddress, serviceUUID);
btStream = btClient.GetStream();
StartListening();
richTextBox1.AppendText("连接成功\n");
}
catch (Exception ex)
{
MessageBox.Show($"连接失败:{ex.Message}");
}
}
5、接收数据(异步监听)
private void StartListening()
{
new Thread(() =>
{
byte[] buffer = new byte[1024];
while (btClient?.Connected == true)
{
try
{
int bytesRead = btStream.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
string received = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Invoke((MethodInvoker)delegate { richTextBox1.AppendText($"[接收] {received}\n"); });
}
}
catch { break; }
}
}).Start();
}
6、发送数据(包括文件)
private void btnSend_Click(object sender, EventArgs e)
{
if (btClient?.Connected != true) return;
byte[] buffer = new byte[1024]; // 缓冲区大小可以根据需要调整
using (FileStream fs = new FileStream(txtSend.Text, FileMode.Open, FileAccess.Read))
{
int bytesRead;
while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
{
btClient.GetStream().Write(buffer, 0, bytesRead); // 分块发送
}
}
richTextBox1.AppendText($"[发送] {txtSend.Text}\n");
txtSend.Clear();
}
五、蓝牙服务 UUID 说明
蓝牙服务通常通过一个唯一的 Service UUID 来标识,例如:
00001132-0000-1000-8000-00805f9b34fb
这是蓝牙串口协议(SPP)的标准 UUID,适用于大多数蓝牙串口设备。
如果你连接的是特定厂商的设备,请参考其官方文档获取正确的 UUID。
六、总结
本文详细讲解了如何在WinForm 项目中集成蓝牙通信功能,使用 InTheHand.Net 库实现了以下核心功能:
| 功能 | 说明 |
|---|---|
| 蓝牙设备扫描 | 列出附近所有可连接的蓝牙设备 |
| 设备连接 | 使用 SPP UUID 建立蓝牙连接 |
| 数据接收 | 异步监听蓝牙输入流,实时显示接收到的内容 |
| 文件传输 | 支持发送本地文件到蓝牙设备 |
成果亮点
界面简洁直观,适合快速集成到已有项目
支持文本和文件两种数据格式传输
使用线程处理蓝牙通信,避免阻塞 UI
后续优化
添加断开连接按钮与异常重连机制
支持蓝牙配对与自动连接
封装成独立类库,便于复用
增加日志记录与错误提示功能
总结
蓝牙通信虽然看似复杂,但借助成熟的第三方库,我们可以在短时间内实现强大的跨设备通信功能。希望本文能为你提供清晰的开发思路和实用的代码示例。
如果大家正在开发一个需要与硬件设备进行交互的 WPF 或 WinForm 应用程序,不妨尝试加入蓝牙通信功能!
最后
以上就是C#实现蓝牙连接、数据收发与文件传输功能的详细内容,更多关于C#蓝牙连接、数据收发与文件传输的资料请关注脚本之家其它相关文章!
