C#實現(xiàn)藍(lán)牙連接、數(shù)據(jù)收發(fā)與文件傳輸功能
前言
在軟件開發(fā)中,跨設(shè)備通信已經(jīng)成為一種常見需求。尤其是在工業(yè)控制、智能家居、醫(yī)療設(shè)備等領(lǐng)域,藍(lán)牙通信因其低功耗、短距離、高安全性等優(yōu)點,被廣泛應(yīng)用于各類桌面和移動應(yīng)用中。
本文將以一個完整的 WinForm 桌面應(yīng)用程序為例,詳細(xì)介紹如何使用 InTheHand.Net.Bluetooth 庫實現(xiàn)以下核心功能:
掃描可用藍(lán)牙設(shè)備
選擇并建立藍(lán)牙連接
實現(xiàn)藍(lán)牙數(shù)據(jù)的接收與發(fā)送
支持藍(lán)牙文件傳輸(SPP協(xié)議)
通過本文的學(xué)習(xí),掌握如何在WinForm中輕松集成藍(lán)牙通信模塊,為大家項目添加更多交互性與擴展能力。
一、開發(fā)環(huán)境準(zhǔn)備
開發(fā)工具
Visual Studio 2022
.NET Framework 4.7.2 或更高版本(支持 Bluetooth)
目標(biāo)平臺:WPF / WinForm
第三方庫引用
使用 InTheHand.Net.Personal 提供的藍(lán)牙 SDK 來簡化藍(lán)牙操作:
Install-Package InTheHand.Net.Personal
該庫提供了對藍(lán)牙設(shè)備發(fā)現(xiàn)、連接、數(shù)據(jù)流讀寫等完整封裝,適用于 Windows 平臺下的藍(lán)牙 SPP 協(xié)議通信。
二、電腦端藍(lán)牙配置
確保你的電腦已開啟藍(lán)牙功能,并且系統(tǒng)支持藍(lán)牙適配器。

同時,在手機端打開藍(lán)牙設(shè)置,并允許接收來自其他設(shè)備的數(shù)據(jù)傳輸請求。
三、效果展示
以下是本項目實現(xiàn)的主要功能界面與運行效果截圖:
1、掃描藍(lán)牙設(shè)備

2、選擇設(shè)備并連接

3、接收藍(lán)牙消息

4、發(fā)送文件到手機

四、核心代碼
1、引用命名空間
using InTheHand.Net; using InTheHand.Net.Sockets; using InTheHand.Net.Bluetooth;
2、定義關(guān)鍵變量
private BluetoothClient btClient;
private NetworkStream btStream;
private BluetoothDeviceInfo selectedDevice;
private readonly Guid serviceUUID = new Guid("00001132-0000-1000-8000-00805f9b34fb"); // 標(biāo)準(zhǔn) SPP 服務(wù) UUID
注意:不同設(shè)備可能使用不同的 UUID,建議查閱設(shè)備文檔或嘗試通用 SPP UUID。
3、掃描藍(lán)牙設(shè)備
private void btnScan_Click(object sender, EventArgs e)
{
lstDevices.Items.Clear();
btClient = new BluetoothClient();
var devices = btClient.DiscoverDevices(); // 最多可發(fā)現(xiàn) 255 臺設(shè)備
foreach (var device in devices)
{
lstDevices.Items.Add($"{device.DeviceName} [{device.DeviceAddress}]");
}
}
4、選擇設(shè)備并建立連接
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、接收數(shù)據(jù)(異步監(jiān)聽)
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、發(fā)送數(shù)據(jù)(包括文件)
private void btnSend_Click(object sender, EventArgs e)
{
if (btClient?.Connected != true) return;
byte[] buffer = new byte[1024]; // 緩沖區(qū)大小可以根據(jù)需要調(diào)整
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); // 分塊發(fā)送
}
}
richTextBox1.AppendText($"[發(fā)送] {txtSend.Text}\n");
txtSend.Clear();
}
五、藍(lán)牙服務(wù) UUID 說明
藍(lán)牙服務(wù)通常通過一個唯一的 Service UUID 來標(biāo)識,例如:
00001132-0000-1000-8000-00805f9b34fb
這是藍(lán)牙串口協(xié)議(SPP)的標(biāo)準(zhǔn) UUID,適用于大多數(shù)藍(lán)牙串口設(shè)備。
如果你連接的是特定廠商的設(shè)備,請參考其官方文檔獲取正確的 UUID。
六、總結(jié)
本文詳細(xì)講解了如何在WinForm 項目中集成藍(lán)牙通信功能,使用 InTheHand.Net 庫實現(xiàn)了以下核心功能:
| 功能 | 說明 |
|---|---|
| 藍(lán)牙設(shè)備掃描 | 列出附近所有可連接的藍(lán)牙設(shè)備 |
| 設(shè)備連接 | 使用 SPP UUID 建立藍(lán)牙連接 |
| 數(shù)據(jù)接收 | 異步監(jiān)聽藍(lán)牙輸入流,實時顯示接收到的內(nèi)容 |
| 文件傳輸 | 支持發(fā)送本地文件到藍(lán)牙設(shè)備 |
成果亮點
界面簡潔直觀,適合快速集成到已有項目
支持文本和文件兩種數(shù)據(jù)格式傳輸
使用線程處理藍(lán)牙通信,避免阻塞 UI
后續(xù)優(yōu)化
添加斷開連接按鈕與異常重連機制
支持藍(lán)牙配對與自動連接
封裝成獨立類庫,便于復(fù)用
增加日志記錄與錯誤提示功能
總結(jié)
藍(lán)牙通信雖然看似復(fù)雜,但借助成熟的第三方庫,我們可以在短時間內(nèi)實現(xiàn)強大的跨設(shè)備通信功能。希望本文能為你提供清晰的開發(fā)思路和實用的代碼示例。
如果大家正在開發(fā)一個需要與硬件設(shè)備進行交互的 WPF 或 WinForm 應(yīng)用程序,不妨嘗試加入藍(lán)牙通信功能!
最后
以上就是C#實現(xiàn)藍(lán)牙連接、數(shù)據(jù)收發(fā)與文件傳輸功能的詳細(xì)內(nèi)容,更多關(guān)于C#藍(lán)牙連接、數(shù)據(jù)收發(fā)與文件傳輸?shù)馁Y料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# Winform中實現(xiàn)主窗口打開登錄窗口關(guān)閉的方法
這篇文章主要介紹了C# Winform中實現(xiàn)主窗口打開登錄窗口關(guān)閉的方法,這在需要用戶名密碼的軟件項目中是必用的一個技巧,要的朋友可以參考下2014-08-08
C#中面向?qū)ο缶幊虣C制之多態(tài)學(xué)習(xí)筆記
這篇文章主要介紹了C#中面向?qū)ο缶幊虣C制之多態(tài)學(xué)習(xí)筆記,本文總結(jié)了個人對多態(tài)的理解以及接口多態(tài)、繼承多態(tài)等內(nèi)容,并給出了代碼示例,需要的朋友可以參考下2015-01-01
C# 解決datagridview控件顯示大量數(shù)據(jù)拖拉卡頓問題
這篇文章主要介紹了C# 解決datagridview控件顯示大量數(shù)據(jù)拖拉卡頓問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

