bleをプログラミングで-py

bleak

bleakというライブラリが誰でも簡単に触れるらしいので試してみる

docs: https://bleak.readthedocs.io/en/latest/

ble uuid assigned-numbers: https://www.bluetooth.com/specifications/assigned-numbers/

BLE

UUID

  • Service UUID: BLEデバイスが提供するサービスの識別子です。デバイスがサポートする機能やサービスを識別するために使われます。
  • Characteristics UUID: サービス内の個々の属性やデータポイントを識別します。例えば、バッテリー残量や心拍数などの値を読み取るための識別子です。
  • macOSで表示されるUUID: macOSはBLEデバイスのMACアドレスを直接表示しないため、代わりにデバイス自体を識別するためのUUIDを表示します。これはセキュリティやプライバシー保護の観点から、MACアドレスの代替として使用されるものです。
  • BLEデバイスをスキャンして、対象デバイスのMACアドレスを取得。

    実行するコード

    from bleak import BleakScanner
    
    async def run():
        devices = await BleakScanner.discover()
        for d in devices:
            print(d)
    
    import asyncio
    asyncio.run(run())

    出力

    // macOS
    (venv) ┌───(hitto@hot)-[~/hoge][main*] 
    └─$ python scan.py
    *******4-***4-***2-***9-***********9: None
    ...
    *******A-***E-***4-***1-***********3: None
    *******9-***B-***1-***3-***********3: None
    *******9-***F-***4-***E-***********2: None
    *******7-***2-***9-***8-***********E: None
    *******C-***4-***7-***6-***********1: iPhone-hitto
    
    // macOS以外のOS
    $ python scan.py
    D0:8B:7F:12:34:56: iPhone-hitto
    B0:52:22:33:44:5A: Unknown
    Mac address,UUIDは適当です

    なぜmacOSだけ出力が違うのか

    https://bleak.readthedocs.io/en/latest/backends/macos.html
    macOSはBLEデバイスのMACアドレスをセキュリティやプライバシー保護の観点から、MACアドレスの代替となるmacOSが独自に生成して付与しているUUIDを使用している

    ↑ ???????日本語難しすぎる

    OSごとのBLEデバイスの表現方法の違いによるもの

    macOSとLinuxでは、BLEデバイスの識別子(MACアドレスやUUID)の扱いが異なる。

    macOS:

    macOSでは、BLEデバイスの識別子としてUUIDを使用します。これは、macOSがBLEデバイスに対してセキュリティやプライバシーを強化するため、MACアドレスの代わりにランダムなUUIDを割り当てているためです。そのため、243E23AE-4A99-406C-B317-18F1BD7B4CBEのようなUUIDが表示されます。

    Linux:

    一方、Linuxでは従来通り、BLEデバイスの識別子としてMACアドレスが使用されます。そのため、D0:8B:7F:12:34:56のようなMACアドレスが表示されます。

    解決策:

    この動作は、OSの設計による違いなので、特定のBLEデバイスを一意に識別する場合、UUIDとMACアドレスの両方に対応する必要があります。必要に応じて適切な処理を行うことが必要です。

    どちらの識別子でも問題なくデバイスを認識したい場合は、環境ごとに処理を分けて扱うもあり。

    ← Go home