玩轉BLE(2)_使用bluepy掃描BLE的廣播數據


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只需要兩個命令,如下:

#安裝python的包管理工具—pip

sudo apt-get install python-pip libglib2.0-dev

#使用pip安裝bluepy

sudo pip install 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 __init__(self): 
        DefaultDelegate.__init__(self)

    def handleDiscovery(self, dev, isNewDev, isNewData): 
        if isNewDev: 
            print "Discovered device", dev.addr 
        elif isNewData: 
            print "Received new data from", dev.addr

scanner = Scanner().withDelegate(ScanDelegate()) 
devices = scanner.scan(10.0)

for dev in devices: 
    print "Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi) 
    for (adtype, desc, value) in dev.getScanData(): 
        print "  %s = %s" % (desc, value)

 

按照“玩轉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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM