M5StickCのBLE BeaconのサンプルコードでBLE送信してラズパイで検知してみました。
ラズパイでpythonを使ってBLEを通信する際の基本的なメモです。
ラズパイでBLEデバイスをスキャンする
ラズパイ3以降はBluetoothが標準で使用可能です。
ラズパイでBLEを使用する準備
hciconfig でラズパイでBLEが使用可能になっていることを確認します。
UP RUNNIG になっていればBluetoothが使用可能です。
pi@raspi3:~ $ sudo hciconfig
hci0: Type: Primary Bus: UART
BD Address: B8:27:EB:67:BA:** ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING
RX bytes:4306 acl:0 sco:0 events:169 errors:0
TX bytes:2550 acl:0 sco:0 commands:55 errors:0
DOWNの場合は以下コマンドでUPにします。
$ sudo hciconfig hci0 up
hcitool lescan でBLEデバイスをスキャンします。 Bluettothデバイスの場合は hcitool scan で
pi@raspi3:~ $ sudo hcitool lescan
LE Scan ...
75:1E:04:65:C1:** (unknown)
5D:99:90:66:03:** (unknown)
50:02:91:87:2B:C* M5Stick
...
RF-killされているBLEを使用可能にする場合
電波を出さない状態のラズパイでBLEを使用可能にするには rfkill ublock bluetooth コマンドでブロックを解除します。
pi@raspi3-85:~ $ rfkill list
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
1: hci0: Bluetooth
Soft blocked: yes
Hard blocked: no
pi@raspi3-85:~ $ sudo rfkill unblock bluetooth
pi@raspi3-85:~ $ rfkill list
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
1: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
pi@raspi3-85:~ $ sudo hciconfig hci0 reset
pi@raspi3-85:~ $ sudo hciconfig
hci0: Type: Primary Bus: UART
BD Address: B8:27:EB:67:BA:** ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING
RX bytes:2067 acl:0 sco:0 events:114 errors:0
TX bytes:1955 acl:0 sco:0 commands:114 errors:0
pi@raspi3-85:~ $ sudo hcitool lescan
LE Scan ...
2C:6C:C1:7B:AE:** (unknown)
3D:64:70:3C:B5:** (unknown)
...
PyBluez を使ってpythonでBLE通信
pythonにはBLEのライブラリがいくつかありますが、PyBluezを使ってみました。
PyBluez: https://pybluez.readthedocs.io/en/latest/
PyBluez GitHub: https://github.com/pybluez/pybluez
PyBluezのインストール
pybluez をインストール
$ sudo apt-get install python3-dev libbluetooth3-dev
$ sudo pip3 install pybluez
gattlib をインストール
$ sudo apt install libglib2.0 libboost-python-dev libboost-thread-dev
$ sudo pip3 install gattlib
PyBluezのBeaconサンプルをラズパイのコマンドでスキャン
pybluez BLEサンプル: https://github.com/pybluez/pybluez/tree/master/examples/ble
ラズパイからbeacn.pyを実行してBLE Beacon送信します。
pi@raspi4-84:~/beacon $ sudo python3 beacon.py
Done.
もう1台のラズパイでスキャンしてみます。
pi@raspi3-85:~/beacon $ sudo hcitool lescan
LE Scan ...
DC:A6:32:97:4F:** (unknown)
DC:A6:32:97:4F:** raspi4-84
03:C8:54:C6:C8:** (unknown)
ラズパイraspi4-84のBLE信号を検出しました。
M5StickCのBeaconサンプルをラズパイで受信
M5StickCのBLEサンプルを試してみます。
スケッチ例 – M5StickC用のスケッチ例 – ESP32 BLE Arduino にBLE通信用のサンプルがあります。
BLE_iBeacon がビーコンとしてBLEでブロードキャストするコードです。
https://github.com/nkolban/ESP32_BLE_Arduino/blob/master/examples/BLE_iBeacon/BLE_iBeacon.ino
こちらをM5StickCで動作させます。
ラズパイ側はpybluezのサンプル beacon_scan.py でスキャンします。
pi@raspi4-84:~/beacon $ sudo python3 beacon_scan.py
Beacon: address:D8:A0:1D:49:60:** uuid:4d6fc88b-be75-6698-da48-6866a36ec78e major:0 minor:17152 txpower:0 rssi:-90
Done.
無事に受信できました。