1. 前言
在linux平台下,bluez是一個很不錯的軟件,提供了很多基於命令行的測試工具,如hciconfig、hcitool、hcidump、bluetoothctl等。利用這些工具,我們可以方便的測試、demo各種藍牙功能。例如,在“玩轉BLE(1)_Eddystone beacon”中,我們利用hcitool命令,演示了將手機變成一個Beacon設備的神奇效果。
Beacon的演示,從本質上看,是BLE Advertising(廣播)功能的測試和驗證。自然而然的,我們會好奇:怎么接收這些廣播數據呢(其實就是BLE Scanning功能)?這就是本文要介紹的內容。
雖然hcitool(以及后來的bluetoothctl)可以進行簡單的LE scan操作,但返回的結果僅包括簡單的地址和名稱,顯然無法滿足我們的需求(要知道,BLE的廣播數據可能包含其它內容哦,如我們的Beacon演示)。怎么辦呢?不着急,強大的python出馬了。
2. bluepy[1]介紹
bluepy是linux平台中,用python腳本封裝的BLE接口。為什么用python呢?說實話,在寫這篇文章之前,我對python的印象是極其平淡的,但此時卻好感大增。以藍牙的測試為例:
在linux下,bluez提供的原生接口是一個C庫(bluetooth lib),我們想利用這個接口,在命令行里面玩轉一些功能,幾乎不可能; 提供C庫的同時,為了圖形界面操作方便,bluez又封裝出來了一層dbus API。雖然從理論上講,使用dbus-send等命令,可以滿足我們在命令行的測試需求。但是,我覺得沒有人喜歡dbus-send后面帶的那長長的一串參數…… 在開源的世界里,有需求就有動力,因此就出現了很多有python封裝的藍牙API。以BLE為例,bluepy是一個比較好的一個。有了該接口之后,藍牙功能的測試,真的是很爽! |
3. bluepy安裝
bluepy的安裝非常簡單,開始之前先交代一下我的測試環境:
硬件環境是樹莓派2(大家隨便用一個運行linux的PC、開發板應該都okay); OS是raspbian(Ubuntu),版本應該不是很重要; bluez的版本是5.23(比較新的一個版本了,不過舊版本應該也沒有問題)。 |
安裝bluepy只需要兩個命令,如下:
|
4. 使用bluepy
本章我們將使用bluepy的Scanner class,掃描正在廣播的BLE設備。bluepy的文檔中有sample code:
http://ianharvey.github.io/bluepy-doc/scanner.html |
在本地新建一個python腳本(ble_scan.py),將sample code中的代碼拷貝進去即可,如下:
from bluepy.btle import Scanner, DefaultDelegate class ScanDelegate(DefaultDelegate): def handleDiscovery(self, dev, isNewDev, isNewData): scanner = Scanner().withDelegate(ScanDelegate()) for dev in devices: |
按照“玩轉BLE(1)_Eddystone beacon”中的說明,將自己的手機變成一個Eddystone Beacon設備。然后執行python腳本,掃描:
sudo python ble_scan.py |
結果如下:
pi@raspberrypi:~$ sudo python ble_scan.py Discovered device cb:07:c8:52:ce:d6 Discovered device 18:dc:56:a6:25:6f Device 18:dc:56:a6:25:6f (public), RSSI=-59 dB Flags = 06 Complete 16b Services = aafe 16b Service Data = aafe00f0000102030405060708090a0b0e0f000000 Device cb:07:c8:52:ce:d6 (random), RSSI=-85 dB Complete Local Name = My Mambo Complete 16b Services = e7fe Manufacturer = 0000cb07c852ced6 128b Service Solicitation = d0002d121e4b0fa4994eceb531f40579 Flags = 06 |
對比一下我們在“玩轉BLE(1)_Eddystone beacon”中廣播的數據(對應三個顏色):
1e 02 01 06 03 03 aa fe 17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00 |
成功了!
5. 總結
本文簡單的介紹了利用bluepy功能,掃描BLE的廣播包的過程。並沒有對bluepy的軟件邏輯,以及BLE Advertising的細節,做過多的說明,感興趣的同學可以自行閱讀,不理解的地方可以留言討論。
另外,后續BLE Advertising & Scanning有關的分析文章中,會借助該工具,以幫助理解。
6. 參考文檔
[1] bluepy github主頁,
https://github.com/IanHarvey/bluepy
原創文章,轉發處蝸窩科技,www.wowotech.net。