PARENTS
親子
TEACHERS
教師
GOODS
產品
OUR ESG
社會責任
CONTACT
聯絡我們
NEWS
最新消息
首頁
教學資源
Raspberry Pi 樹莓派系列
掌握Pico W上的藍牙
教學資源
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.py
和
pico_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__
方法中初始化服務時,我們得到了句柄),然後是
notification
或
indicates
。此時兩者之間沒有區別,但如果我們確實指出,那麼當中央確認已收到數據時就會發生一個事件(見方框)。此代碼使用
notify
(它在演示方法中設置),但使用
indicator
同樣可以很好地工作。
原文出處:
https://www.raspberrypi.com/news/getting-to-grips-with-bluetooth-on-pico-w/
返回列表
電話:04-2375-3535
傳真:04-2256-9949
統編:90386785
E-mail:service@oursteam.com.tw
LINE ID:@oursteam
學校機關報價
經銷通路報價
客製產品規劃
師資培訓課程
教師研習辦理
社團營隊活動
關於我們
代理商品
教學資源
最新消息
聯絡我們
購物說明
訂單查詢
付款回覆
Copyright © 奧斯丁國際 All Rights Reserved.