基於C#使用WPF開發的低功耗藍牙調試助手,使用C#調用win10SDK操作筆記本,台式電腦上的藍牙發送接收數據


上截圖先看一下,有一個換膚的功能

左邊顯示的是當前連接中的藍牙,藍牙的服務與特征會全部顯示,中間是運行日志,右邊是一個配置文件窗口,可以存一些常用的指令。

暗色

 

 

 

 

 

 

 

亮色

 

需要基於WIN10SDK,需要在NuGet里面搜索下圖紅框的東西,網上說只有win10才支持低功耗藍牙。

講一下藍牙的大概把,每一個藍牙設備里面會有服務,服務里面會有一些叫特征的東西,一個藍牙設備會有多個服務,然后每一個服務里面呢,又會有多個特征。

每一個特征會又一些屬性,當然這些屬性都是定義在了藍牙設備的藍牙芯片里面,不知道我說得對不對。每一個服務跟特征都有一個叫UUID的東西,這個UUID都是看自定義的,當然我們肯定不能改他。它反映到c#里面就是一個GUID。具體的可以參考這個連接

 

 

網上其他大神發的關於c#操作藍牙實例都是很多的代碼 看着頭大。我就盡量通俗易懂的話來簡單的帶領大家入門。不懂可以加我+q 11656012,

首先想要控制藍牙發送接收數據肯定得要一個藍牙對象把,就跟我們使用串口收發數據得用到SerialPort類,這個藍牙對象叫BluetoothLEDevice,如下圖

怎么獲取這個藍牙對象呢。我目前了解到有兩種方式,我就說一種在微軟官方文檔里面推薦的一種。它需要用另外一個類,叫做DeviceWatcher,如下圖

 

 這個類怎么使用的呢,肯定不能通過new來得到,所以這個時候又會用到另外一個類叫做DeviceInformation,如下圖

 

 

 使用方法如下

private DeviceWatcher DeviceWatcher;
        
public WatcherViewModel()
        {
            string[] requestedProperties = { "System.Devices.Aep.IsConnected", "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.Bluetooth.Le.IsConnectable", "System.Devices.Aep.SignalStrength", "System.Devices.Aep.IsPresent" };

            DeviceWatcher =
                        DeviceInformation.CreateWatcher(
                                BluetoothLEDevice.GetDeviceSelectorFromPairingState(false),
                                requestedProperties,
                                DeviceInformationKind.AssociationEndpoint);

            DeviceWatcher.Added += DeviceWatcher_Added;
            DeviceWatcher.Updated += DeviceWatcher_Updated;
            DeviceWatcher.Removed += DeviceWatcher_RemoStoppedved;
            DeviceWatcher.Stopped += DeviceWatcher_Stopped;
        }

調用DeviceInformation.CreateWatcher()方法會返回一個DeviceWatcher 對象,需要給這個CreateWatcher()方法傳入三個參數,這三個參數目前可以不用管什么意思。因為我也不太清楚,照抄就行,這些參數可以理解為電腦對搜索到藍牙設備的時候對它的過濾規則。我目前還沒搞懂這個規則是怎么樣子的,以至於現在的調試助手不能像電腦系統設置里添加藍牙頁面里面搜到的設備一樣,目前只能搜到正在廣播的設備。有時候還能搜到一些莫名奇妙的藍牙。什么摩拜單車,沒有名字的藍牙啥的。主要我們就拿到一個用於獲取藍牙設備的對象了。

介紹完怎么獲取DeviceWatcher對象之后,我們我們看到上面的代碼的下面還訂閱了DeviceWatcher對象的四個事件,分別的是Added,Updated,Removed,Stopped,稍后就解釋一下這四個事件什么意思。

我們在拿到DeviceWatcher對象之后,就需要調用它的Start方法,才能開始搜索(官方話就做枚舉)。當然它也有一個Stop方法。在調用Start方法之后,就會開始搜索了,我們必須在調用Start方法之前訂閱這些事件。

下面我着重介紹這個Added事件(因為主要靠他),我們可以理解為每搜索到一個設備就會觸發一次Added事件,然后這個事件它有一個事件參數,類型是DeviceInformation類型的,沒錯這個類型也是用來創建DeviceWatcher對象的那個類。

這個類可以理解為就是代表搜到的設備的基本參數,如下圖為DeviceInformation類的全貌,重點在紅框內的東西,我們主要用到的是它的 Id 這個屬性。你看上面它還有一些方法,看名字都是用來獲取一些DeviceInformation集合的。

 

 在真實情況中是很多設備的,所以這個時候Added事件會觸發很多次,但是可能會出現相同的mac地址的設備會觸發這個事件(這是我這邊遇到的),所以需要自己維護一個設備列表。出現了重復的設備就直接return,靠這個Id屬性來辨識。

然后就是Updated事件,這個事件觸發之后會帶着一個DeviceInformationUpdate對象,我們看名字就知道它是一個更新的信息,比如信號的強弱。

 Removed事件,就是在設備消失的時候,這個事件會觸發,事件參數里面回攜帶是哪個設備,都是靠里面的id屬性。

回到前面,怎么獲取一個藍牙對象。一句話:就是通過這個Added事件的事件參數傳過來的DeviceInformation對象里面的Id屬性。

用法如下:

 

 先向上看圖,就是通過BluetoothLEDevice的靜態方法FromIdAsync,這是個異步方法,返回一個異步操作,在異步的結果里面就是我們要的BluetoothLEDevice對象。通過傳入DeviceInformation對象里面的Id屬性來獲得,你看它里面還有兩中方法可以用。可以自己試一試。

現在拿到了BluetoothLEDevice對象就好辦了,一般在拿到藍牙設備對象之后第一個就是先 獲取服務,調用BluetoothLEDevice.GetGattServicesAsync()方法。這是一個異步方法,也是返回一個異步操作,在異步的結果里面是一個GattDeviceServicesResult對象,如下圖

 

 着重看那個Services屬性。它是一個GattDeviceService類型的一個集合對象。藍牙里面的每一個服務都是一個GattDeviceService對象。來看一下GattDeviceService里面有哪些成員

 

 你看底下的幾個屬性,有代表這個服務的UUID,屬於哪個藍牙設備的Device,還有幾個其他的,自己研究把,對於目前來說,其他的不重要。

當我們獲取到了某一個服務之后,我們需要再調用這個服務的GetCharacteristicsAsync()方法來獲取服務里面的特征,這也是一個異步的,也是返回一個異步操作,異步的結果是一個GattCharacteristicsResult類型,下面是GattCharacteristicsResult類型的成員,

 

 着重看里面的第一個屬性Characteristics,它是一個GattCharacteristic類型的一個集合,服務里面的每一個特征都是一個GattCharacteristic對象,

我們來看看GattCharacteristic對象里面的成員

 

 你看它里面有一些ReadValueAsync();  WriteValueAsync(IBuffer value);  這樣的一些方法。我們通過調用這寫方法,就可以跟藍牙設備通訊啦。

具體怎么寫,怎么讀,直接看代碼吧。

github: shijianoo/BluetoothLEAssistant (github.com)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM