Python 的第一支藍芽程式

ShengYu 會在本篇會介紹 Python 的擴充模組(PyBluez),可以讓你用幾行程式碼就很快速簡單地實現藍芽 bluetooth 相關功能。

Python 是一個多功能且強而有力的動態語言,支援物件導向,簡潔的語法,提供垃圾回收,自動管理記憶體使用,已至於程式設計師可以專注在演算法,而不用擔心記憶體洩漏或者其他阿雜事。

Python 雖然有很巨大很廣泛全面的內建標準函式庫,但內建標準函式庫卻還不包含藍芽的功能。PyBluez 是用 C 寫成的 Python 擴充模組,提供介面來去存取作業系統裡的藍芽裝置,支援 Windows, MacOS, Linux 和 Raspberry Pi。

第一支藍芽小程式

範例 findmyphone.py 演示了使用一個 Python 小程式去尋找附近名稱為 My Phone 的藍芽裝置。範例如下所示,請自行修改 target_name 成你要尋找的藍芽裝置名稱即可,

findmyphone.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import bluetooth

target_name = "My Phone"
target_address = None

nearby_devices = bluetooth.discover_devices()

for bdaddr in nearby_devices:
if target_name == bluetooth.lookup_name( bdaddr ):
target_address = bdaddr
break

if target_address is not None:
print "found target bluetooth device with address ", target_address
else:
print "could not find target bluetooth device nearby"

藍芽位址是由 xx:xx:xx:xx:xx:xx 的形式所組成,xx 為十六進制,怎麼查詢藍芽位址請看這篇,每個藍芽裝置都有個獨一無二的藍芽位址。但是如果我們要找”某個名稱”的藍芽裝置,而不是用藍芽位址去找,那會分成兩步驟:

以上述 findmyphone.py 為例,首先程式會先掃描附近的藍芽裝置,呼叫 discover_devices() 尋找附近的裝置(大概10秒),然後回傳一個列表,

再來,使用 lookup_name() 去連接上每個已偵測到的裝置,請求它們的裝置名稱,並且順便判斷名稱是不是我們要尋找的 My Phone target name,是的話會顯示找到並印出藍芽位址。

在區域內掃描藍芽裝置和查找裝置名稱這過程有時可能會失敗(空氣中其他的干擾等等不定因素,裝置很多,裝置在移動?!),discover_devices() 有會回傳 None,意味著無法用裝置名稱來進行後續的匹配,這時最好的解決方式就是多試幾次看看XD。

以上就是 ShengYu 為你介紹的第一支 Python 藍芽小程式,下一篇將會介紹 如何用Python的藍芽 RFCOMM 協定來通訊

參考
https://people.csail.mit.edu/albert/bluez-intro/c212.html

相關主題
Python 寫藍芽 L2CAP 通訊程式
Python 寫藍芽 Service Discovery Protocol 通訊程式