先日の続きです。
Chrome経由での接続確認はできたのですが、Pythonでの実装をポチポチと
(かき集めた内容なので、間違っている箇所があったらご指摘下さい)
Bluetooth接続と書いておきながらも、実際はBluetooth Low Energy(BLE)というエコモードなBluetoothです。
Pythonのライブラリはpybluez
はインストールが上手くいかなかったので、Bleak
を使いました
from bleak import BleakScanner
from bleak import BleakClient
Scannerがデバイス検索
Cliantが送受信に使われています
Python側から通信先を見つける
M5Stack
は前回のプログラムを実行して、BLEを起動しておきます
Scannerを使って接続するデバイス名(UIFLOWで設定した"FIVE_STACK")でMacアドレスを取得する
import asyncio
from bleak import BleakScanner
from bleak import BleakError
device_name = "FIVE_STACK"
async def device_scan():
devices = await BleakScanner.discover()
idx = list(filter(lambda x: x.name == device_name, devices))
# 検出デバイスを表示するだけの場合は以下
# for d in devices:
# print(d)
ADDRESS = idx[0].address # Macアドレスが出力される
print(idx[0].name) # デバイス名が表示される
ここで表示されたMacアドレスは以降たくさん使います
変数に入れておきました
Cliantで使ったのは以下メソッド
cliant.read_gatt_char(UUIDを指定)
cliant.write_gatt_char(UUIDを指定)
BLEではUUID
という値を使って通信します
M5Stack Core2のUUIDはどれか
Bleakサイトのサンプルコードの「servies_explorer.py」を実行してみると
ServiceとCharavteristic、DescriptorのUUIDが表示された
上二つが(read)
とあるから受信用UUIDってことかな
そうなると一番下の(write)
が送信用かな
それをもとにやってみる
import asyncio
from bleak import BleakClient
address = "" # 通信先のMacアドレス
MODEL_NBR_UUID = "" # 受信したいUUID
async def main(address):
async with BleakClient(address) as client:
model_number = await client.read_gatt_char(MODEL_NBR_UUID)
print("Model Number: {0}".format("".join(map(chr, model_number))))
asyncio.run(main(address))
addressとUUIDを試しに一番上のHandle:11という項目のものでやってみた
00002a00-0000-1000-8000-00805f9b34fb (Handle: 11): (read), Value: b'ESP32'
するとどうでしょう
M5Stackで使われているマイコンESP32と表示されました
b'ESP32'
と同じなので、通信はできている!ということですかね
さらに双方向通信ができるようにしたいのですがまだ辿り着けていません。。
【追記 5/25】
BleakでCliantとする場合、PCはperipheralになる
M5StackCore2はBLEブロックを組み立てるとperipheralになっている?