藍牙(Bluetooth)是一種讓裝置間(特別是行動裝置)在短距離間交換資料的一種無線通訊技術。最初是 1994年由電信業者 Ericsson 發展出來,希望能建立替代 RS-232技術的無線通訊版本。
藍牙技術分為 BR/EDR(基礎/增強) 和 LE(低耗能)兩種技術,BR/EDR 主要是建立一對一通訊裝置,而LE 則是有一對一、一對多(廣播)、網格(多對多)等架構。
使用藍芽技術商品已經遍佈在我們的生活中,就知名的應用例子有:
藍牙版本 | 發佈時間 | 最大傳輸速度 | 傳輸距離 |
---|---|---|---|
1.0 | 1998 | 723.1 Kbit/s | 10 M |
1.2 | 2003 | 1 Mbit/s | 10 M |
2.0+EDR | 2004 | 2.1 Mbit/s | 10 M |
3.0+HS | 2009 | 24 Mbit/s | 10 M |
4.0 | 2010 | 24 Mbit/s | 50 M |
4.2 | 2014 | 24 Mbit/s | 50 M |
5.0 | 2016 | 48 Mbit/s | 300 M |
根據玩學機的規格,ESP32-WROOM-32晶片支援 Bluetooth 4.2 BR/EDR 與 BLE 通訊協定,最大傳輸速度為 24 Mbit/s 與最長傳輸距離 50M。
因此我們可以利用這個帶電池的玩學機,進行一些藍牙通訊的實驗。接著,我們就來了解玩學機有內建哪些函數可以用來開發藍牙通訊的應用程式?
要查看系統內建的藍牙通訊函式庫,請先執行 import ubluetooth; help(ubluetooth)。您將會看到:
>>> help(ubluetooth)
object <module 'ubluetooth'> is of type module
__name__ -- ubluetooth
BLE -- <class 'BLE'>
UUID -- <class 'UUID'>
FLAG_READ -- 2
FLAG_WRITE -- 8
FLAG_NOTIFY -- 16
FLAG_INDICATE -- 32
FLAG_WRITE_NO_RESPONSE – 4
目前 MicroPython 的 藍牙函式庫使用起來不算容易,可能還需要再等幾個版本,才會有更完整的支援,讓一般使用者可以輕鬆地寫出應用程式。要注意一件事,因為使用到 IRQ 中斷的方式來處理藍牙通訊,用 Thonny 執行底下的程式會出錯,請改用 WiFiBoy Python Playground 軟體來執行。
import bluetooth
def ok_irq(event, data):
if event==5:
addr_type, addr, adv_type, rssi, adv_data = data
print(addr_type, bytes(addr).hex(), adv_type, rssi, bytes(adv_data).hex())
ble = bluetooth.BLE()
ble.active(True)
ble.irq(ok_irq)
ble.gap_scan(1000, 50000, 50000)
name = b'okesp'
ble.gap_advertise(100, b'\x02\x01\x02'+bytearray((len(name)+1,0x09))+name)