PythonからBLEを制御するライブラリの調査
はじめに
この記事ではPythonのBLE制御ライブラリに調査を行った結果をまとめています。2017年のMaker Fair Tokyoのウェザーニュースブースにて、WxBeacon2というBLEの環境センサを購入しました。このデバイスはOMRONの2JCIE-BL01まんまの代物です。本家は加速度センサが入っているようですが、ブースの方曰くこちらは入っていないかもとのこと。
しばらくはiPhoneから接続して専用アプリで遊んでみました。せっかくのなので、自分でアプリを作って遊んでみることにしました。今回はRaspberry Pi Zero WとMac OSX上で動作するアプリケーションを作成してみようと考えてみます。実装に利用する言語はPythonを選択しました。PythonのBLEライブラリを検索するといくつか種類が出てきたので、目に付いたものを調査してみました。
Python用BLEライブラリの現状
Python用のBLEライブラリを各プロジェクトのページから調べた結果は以下の表の通りです。4ライブラリを調査しました。
ライブラリ名 | ライセンス | 対応OS | Python | 機能 | 備考 |
---|---|---|---|---|---|
pybluez | GPL-v2 | Linux, Mac, Windows |
2.7系,3系 | セントラルの機能 | El Capitan or Sierraで動作し無さそう |
bluepy | GPL-v2 | Linux | 2.7系 3.3 3.4系 | セントラルの機能 | |
pyGATT | Apache2.0 MITライセンス |
Linux, Windows | 2.7系 | BGAPIのラッパー(Windows, Linuxのみ) bluezのgatttoolラッパ(Linuxのみ) |
WindowsではBLEが使えない? |
lightblue | GPL v3 | Linux, Mac |
2.7系,3系 | セントラルの動作のみ | メンテされていない。 OSXに関しては10.4時代で更新停止している。 |
BluefruitLE | MITライセンス | Linux(Bluez), Mac(CoreBluetooth) |
2.7系 | BLEのセントラルの動作のみ |
以下に各ライブラリに対する所感を記載します。
pybluez
一番使われていそうなpybluezですが、その名の通り、Linuxの標準BluetoothスタックのBluezのラッパのようです。Macにインストールした場合はlightblueと言う別のライブラリ経由でOSXのCoreBluetoothライブラリを利用しています。ですがEl CapitanやSierraではインストールに失敗します。リポジトリ上は修正されているようですが、そもそも依存しているlightblueがOSX10.4時代から更新されていないようなので使えないでしょう。またBluezとリンクして動くため、GPLライセンスとなってしまいます。ホビーの場合問題ないですが、個人的に好きではありません。
bluepy
BluezをベースにしたGPL-v2ライセンス。Linuxのみ対応しているがPython3系にも対応している。2017年9月現在もリポジトリに変化あり。開発自体は継続中の模様。
pyGATT
次にpyGATTはOSX非対応のため、要件から外れます。Bluezのgatttoolコマンドのラッパのようです。WindowではBGAPIというBluetoothシリアルのAPIを提供するようです。特定メーカのドングルでないとダメそう。
lightblue
lightblueはpyblueのMac対応に使われているライブラリです。が、メンテされておらず、前述の通り最新のOSXには対応していません。
BluefruitLE
最後に残ったBluefruitLEですが、更新もされており、上記の中では一番筋がいいように思えます。Windowsも動けば尚良しですが、今回の要件からは外れるので問題ありません。
まとめ
PythonでBLEを制御するライブラリをまとめてみました。どのライブラリもBLEの制御はOS依存のライブラリをラップしているため、すべてのプラットフォームで共通するライブラリは難しそうです。またLinuxのBluez自体がGPLライセンスのため、コピーレフトに敏感な場合は注意が必要そうです。Windows環境を無視すればBluefruitLEが一番筋が良さそう?Macについてはpyobjc経由でCoreBluetoothを叩いているようでした。自分でもpyobjcからBLE制御してみましたが、あっさりと動いたので、個別のOSごとに対応するのは簡単そうです。同じコードで動かすのは骨が折れそうです。