掌握Pico W上的藍牙|奧斯丁國際有限公司 OURSTEAM Internationl
icon教學資源
2023/08/24

掌握Pico W上的藍牙

掌握Pico W上的藍牙

Pico W現在支持使用MicroPython和C語言的藍牙。但這是什麼,為什麼您需要關心?

您以前很可能使用過藍牙,無論是鍵盤、耳機還是某種傳感器。它通過無線電信號來回發送數據。它的範圍通常為幾米到幾十米。



當您第一次啟動藍牙設備時,您通常希望它開始廣播一些數據。通常,這是為了配對,但它也可以向范圍內的任何其他設備發送少量數據。這是使用通用訪問配置文件 (GAP) 完成的。

GAP 定義了兩種角色:中央角色和外圍角色。中央設備通常是電話或計算機,它們從通常是傳感器的外圍設備接收數據。Pico W可以是中央設備,也可以是外圍設備。




您可以簡單地使用 GAP 繼續發送數據,但是,它只允許單向通信,並且每個有效負載只能包含 31 字節的數據。您可以通過連接通用屬性配置文件 (GATT) 雙向發送數據、獲得更高的安全性並通常獲得更多功能。GATT 定義了服務和特徵。在BLE術語中,特徵是一段數據,服務是特徵的集合。要使用服務,設備必須具有定義其提供的服務和特性的 GATT。這些關貿總協定是預定義的——這是它們的列表

如果您想創建藍牙外圍設備,您需要做的第一件事就是決定要使用什麼 GATT。

其中一個關鍵部分是接收軟件必須預期您的設備發送的數據類型。例如,如果您的手機上有藍牙 UART 應用程序,則該應用程序將無法與藍牙溫度傳感器通信。

配置文件、服務和特徵均使用通用唯一標識符 (UUID) 進行標識。此處記錄了分配給藍牙中不同事物的所有編號的完整列表。




現在我們對發生的事情有了一些了解,讓我們看一個例子。請注意,您還需要將ble_advertising.py程序保存到您的 Pico(使用相同的名稱)。

我們將使用pico-micropython-examples GitHub 存儲庫中的示例pico_ble_Temperature_sensor.py

為了使用它,您需要將最新版本的 MicroPython 刷新到 Pico,並且需要將 ble_advertising.pypico_ble_Temperature_sensor.py程序保存到 Pico。

以下是pico_ble_Temperature_sensor.py程序中的代碼,我們將對其進行剖析以了解發生了什麼情況。




我們稍後將更詳細地查看代碼,但我們首先設置一台計算機來接收數據。

由於現代網絡瀏覽器能夠通過網絡藍牙接口與 BLE 交互,因此您無需安裝任何東西即可獲取數據。以下是從環境傳感服務獲取溫度特徵的示例代碼。單擊“開始通知”,您應該會看到一個彈出框,其中列出了可用的藍牙設備。選擇以“Pico”開頭的那個,您應該(幾秒鐘後)看到一些數據開始出現。

它可能看起來有點神秘——有兩個以 0x 開頭的部分。該數字是一個小端整數(開頭的 0x 表示它以十六進制格式顯示),因此您需要將其從顯示的十六進製字符串轉換。刪除兩個 0x 數字,然後將其他數字粘貼到轉換器中,如下所示。將結果除以 100,即可得出 Pico 的溫度。
                                                                                                                             

             

此時,您完全有理由想知道如何知道該數字是 2 位小端整數。幸運的是,就像大多數與藍牙相關的事情一樣,這一切都在文檔中。在本例中,它位於GATT 規範補充中。一般來說,藍牙有詳細的文檔記錄,但它是一組複雜的協議,有很多選項,因此在大量可用文檔中找到您需要的東西可能是一個挑戰。我們將盡力引導您到適當的地方。

如果這一切看起來有點複雜,那是因為藍牙在具有用於發送和接收的特定代碼時確實效果最好,但我們使用一些通用代碼來接收數據。由於 Pico 既可以是中央設備,也可以是外圍設備,因此有使用第二個 Pico接收數據的代碼,但我們不會在本文中詳細介紹。


深入細節

現在我們可以讀取溫度了,讓我們回過頭來看看這一切是如何工作的。

該代碼的第一部分定義了我們正在使用的標識符:




其中大部分是構建_ENV_SENSE_SERVICE數據,該數據用作gatts_register_services的輸入。此方法記錄在此處。其中的關鍵部分是單個參數,它是(根據文檔)“服務列表,其中每個服務都是包含 UUID 和特徵列表的二元素元組。每個特徵都是一個二元或三元元組,其中包含 UUID、標誌值以及可選的描述符列表。”

可用的標誌列出如下:




在本例中,您可以看到_ENV_SENSE_SERVICE是一個包含第一個_ENV_SENSE_UUID 的二元素元組我們之前將其定義為 0x181A,它在文檔中列為環境傳感服務。在同一文件(第 6.1 節)中,列出了該服務允許的特性範圍。我們可以為我們的特定實現選擇其中的任何一個,並且我們選擇了溫度(在同一文檔中定義為 0x2A6E)。

最終的常量集:



是來自 MicroPython 藍牙模塊的事件代碼。它們的詳細信息請參見此處

這是創建藍牙溫度控制器所需的基本數據。現在讓我們更詳細地看一下代碼。
讓我們從運行腳本時啟動的演示方法開始向後工作。這將創建一個名為temp的BLETemperature對象通過創建它,這將啟動__init__方法來設置一切。



這裡的第一行告訴藍牙模塊在任何事件發生時調用該對象的_irq方法。這讓我們可以處理諸如連接、斷開連接以及中央設備是否響應我們發送帶有指示的數據之類的事情。

之後,它為藍牙模塊設置相關數據,最後調用_advertise,它本身就運行:



這顯然開始做廣告了。正是這一點使設備可以進行配對。當您嘗試從網絡瀏覽器讀取溫度時,您會看到一個包含可用設備的彈出窗口。本質上,這只是指當前正在做廣告的設備。



一旦開始,我們就可以回到我們的演示方法。從現在開始,我們可以忽略大部分藍牙內容——它並不會真正困擾我們。廣告和配對都在後台進行。我們使用類中的方法循環並更新溫度:



第一部分只是以正確的格式獲取數據,正如我們之前所看到的,它是兩個小尾數的 2 位數字,當組合在一起時,可以給出百分之一攝氏度的溫度。

格式字符串是小尾數、2 位有符號整數 - 第一個字符是尾數,第二個是數字格式(您可以在此處查看其他選項的完整列表)

發送數據分兩部分完成。首先,我們寫入句柄(當我們在__init__方法中初始化服務時,我們得到了句柄),然後是notificationindicates。此時兩者之間沒有區別,但如果我們確實指出,那麼當中央確認已收到數據時就會發生一個事件(見方框)。此代碼使用notify(它在演示方法中設置),但使用indicator同樣可以很好地工作。


原文出處: 
https://www.raspberrypi.com/news/getting-to-grips-with-bluetooth-on-pico-w/
logo
iconiconiconiconicon
icon  電話:04-2375-3535
icon  傳真:04-2256-9949
icon  統編:90386785
icon  E-mail:service@oursteam.com.tw
icon  LINE ID:@oursteam
Inspire every child to create