masato-ka's diary

日々思ったこととか、やったことの備忘録。

PythonからBLEを制御するライブラリの調査

はじめに

この記事ではPythonのBLE制御ライブラリに調査を行った結果をまとめています。2017年のMaker Fair Tokyoウェザーニュースブースにて、WxBeacon2というBLEの環境センサを購入しました。このデバイスはOMRONの2JCIE-BL01まんまの代物です。本家は加速度センサが入っているようですが、ブースの方曰くこちらは入っていないかもとのこと。

OMRON環境センサ

WxBeacon2

しばらくは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ごとに対応するのは簡単そうです。同じコードで動かすのは骨が折れそうです。