アルプスのセンサネットワークモジュールは、Bluetooth Low Energy(BLE)を用いて、気圧、温度・湿度などの環境データの他に、モーションデータを取得できます。今回は、Raspberry Pi 3で、アルプスのセンサネットワークモジュールをPython言語を使ってアクセスする環境を構築してみました。なお、C言語からのアクセスについては「アルプスのセンサネットワークモジュールをラズパイ3と3GPIで使ってみる(其の2 C言語によるBLEソフト)」を参考にしてください。

BlueZ のインストール

Rasbian 上で BlueZ をインストールする際に apt-get を使うと バージョン5.23 がインストールされてしまうのでソースからコンパイルしてインストールします。インストールの方法は、「C言語によりRaspberry Pi 3とSensorTag間をBLEで接続 」を参照してください。

pybluezインストール

Python からBLEを用いて操作するためのライブラリをpip を使ってインストールします。

$ sudo apt-get -y install python-pip
$ sudo apt-get install python-dev libbluetooth-dev libboost-all-dev
$ sudo pip install pybluez
$ sudo pip install pybluez[ble]

構築した開発環境の確認

次のPythonサンプルスクリプトを用いて、 BLE デバイスが検知できるか確認します。

from __future__ import print_function
from gattlib import DiscoveryService

class DiscoverDevice():
    def GetDeviceList(self):
        service = DiscoveryService("hci0")
        device = service.discover(2)
        return device

if __name__ == '__main__':
    devList = DiscoverDevice().GetDeviceList()
    for address, name in devList.items():
        print("name: {}, address: {}".format(name, address))

実行すると、次のエラー「RuntimeError: Set scan parameters failed (are you root?)」が表示される場合があります。

Traceback (most recent call last):
  File "scan_ble.py", line 17, in 
    devList = DiscoverDevice().GetDeviceList()
  File "scan_ble.py", line 13, in GetDeviceList
    device = service.discover(2)
RuntimeError: Set scan parameters failed (are you root?)

この場合、「hcitool lescan」コマンドでも「Set scan parameters failed: Input/output error」のエラーが出ており、次のように一度BLEをダウンさせて再度アップすれば、正常に接続できるようになります。

$ sudo hcitool lescan
Set scan parameters failed: Input/output error
$ sudo hciconfig hci0 down
$ sudo hciconfig hci0 up
$ sudo hcitool lescan
LE Scan …
28:A1:83:E1:58:96 SNM00
28:A1:83:E1:58:96 (unknown)

正常に実行されると次の表示があります。

$ sudo python scan_ble.py
name: , address: 28:A1:83:E1:58:96

これで、Pythonからアルプスのセンサネットワークモジュールをアクセスする準備が整いました。

python3での動作(2020/12/27追加)

python3で動作させるために、次の手順でpybluezをインストールします。

$ sudo apt-get install python-dev libbluetooth-dev libboost-all-dev
$ sudo apt-get install libglib2.0 libboost-python-dev libboost-thread-dev
$ sudo pip3 install gattlib

$ sudo python3 -m pip install pyblueZ

次の手順でPythonサンプルスクリプトを実行します。

$ sudo python3 scan_ble.py
name: , address: 45:D0:E0:29:5B:BA
name: , address: 44:BB:5D:41:A0:CA
name: , address: D9:B7:FE:D9:08:BA
name: , address: 70:56:81:F3:98:3D