前情提要
這次客戶的需求是一個手機的 POS 軟體,希望透過藍芽 Socket 的方式從 Windows 傳輸交易紀錄到手機上的 App
意思是手機上的 App 會是藍芽的 Server 端,而 Windows 則是 Client 端
一開始還真沒有頭緒怎麼弄,就先去找了 .Net 環境下可以用的藍芽套件
InTheHand.Net.Bluetooth
Nuget: https://www.nuget.org/packages/InTheHand.Net.Bluetooth/
Github: https://github.com/inthehand/32feet
網路上找到很多都是 32feet 相關的文獻,看來這個應該是 32feet 的新版本,是用 InTheHand 命名
搜尋所有的藍芽裝置
Bluetooth 是需要先 Scan 找到所有的 Bluetooth 裝置,有了裝置再透過 Device Address 做連接
所以如果能夠儲存 Device Address 就可能直接進行連接,不用做 Scan
using InTheHand.Net;
using InTheHand.Net.Sockets;
var bluetoothClient = new BluetoothClient();
BluetoothDeviceInfo device = null;
Console.WriteLine("Search...");
foreach (var dev in bluetoothClient.DiscoverDevices())
{
Console.WriteLine("Device: " + dev.DeviceName);
if (dev.DeviceName == "Realme X3")
{
device = dev;
}
}
與藍芽服務連接
再來可以透過 BluetoothClient 的 Connect 進行連接
bluetoothClient.Connect(device.DeviceAddress, Guid.Parse("00001101-0000-1000-8000-00805F9B34FB"));
這裡比較需要注意的是第二個參數,是一個 Guid 的格式,這個就是 Bluetooth 的 UUID
一開始搞不懂這個是用來做什麼的,卡了很久一直無法和裝置連線
這個 UUID 必須要和 Server 端的 UUID 一致才能夠連線成功,而藍芽核心規範有針對這些 UUID 列出一些常見到的格式,也就是 Profile
因為一個藍芽裝置(手機)裡面開啟藍芽,但是很可能許多程式有在做藍芽的 Server
所以這時候就是用這個 Profile 來決定是連上這個裝置的哪一個服務,UUID 就是唯一不可以重複的
像我透過 BluetoothClient 連接的裝置,找到的 InstalledService 就有 13 個,表示這手機上藍芽的服務就有 13 個
必須連接正確才能夠與自己真正要連接的 App 連結成功
傳輸資料
而後面就是和一般的 Web Socket 一樣的傳輸方式了
var socket = bluetoothClient.Client.Send(data);
byte[] tradeBytes = new byte[Int16.MaxValue];
int tradeBytesRec = bluetoothClient.Client.Receive(tradeBytes);
紀錄一下第一次搞懂藍芽的 UUID
不過概念懂了,其實用一些現成的套件,要做藍芽傳輸是非常方便跟快速的,套件真是好東西,感謝所有開發者前輩