ubluepy --- Bluetooth LE のペリフェラルとセントラル¶
ubluepy モジュールは、MicroPython の nRF port に付属するレガシーな Bluetooth LE API です。Linux の bluepy Python ライブラリを大まかにモデルとしており、Nordic SoftDevice の直上に位置します。移植可能なバックエンドが無いため、このモジュールは Nordic ターゲット (OpenMV のラインナップでは Arduino Nano 33 BLE Sense) でのみ利用できます。新しい bluetooth / aioble API はこのビルドでは有効化されていないため、ubluepy がオンダイ無線を制御する唯一の方法です。
利用可能な機能セットは、ファームウェアがフラッシュした SoftDevice に依存します:
s140 (Nano 33 BLE Sense) --- ペリフェラルとセントラル (スキャナー) の両ロール。OpenMV ファームウェアが搭載しているのはこれです。
s132 --- ペリフェラルとセントラルの両方。
s110 --- ペリフェラルのみ。スキャナー / 接続メソッドはコンパイル対象から除外されます。
ペリフェラルの例¶
単一の環境センシングサービスを持つ Bluetooth LE ペリフェラルとしてアドバタイズし、その Client Characteristic Configuration Descriptor (CCCD) への書き込みがあるたびに温度キャラクタリスティックを通知します:
from ubluepy import Service, Characteristic, UUID, Peripheral, constants
from machine import LED
notif_enabled = False
def event_handler(event_id, handle, data):
global notif_enabled
if event_id == constants.EVT_GAP_CONNECTED:
LED("LED_GREEN").on()
elif event_id == constants.EVT_GAP_DISCONNECTED:
LED("LED_GREEN").off()
periph.advertise(device_name="Nano 33", services=[svc])
elif event_id == constants.EVT_GATTS_WRITE:
notif_enabled = bool(data[0])
svc = Service(UUID("181A")) # Environmental Sensing
char = Characteristic(UUID("2A6E"),
props=Characteristic.PROP_NOTIFY | Characteristic.PROP_READ,
attrs=Characteristic.ATTR_CCCD)
svc.addCharacteristic(char)
periph = Peripheral()
periph.addService(svc)
periph.setConnectionHandler(event_handler)
periph.advertise(device_name="Nano 33", services=[svc])
セントラルの例¶
100 ms の間、近隣のアドバタイズ中のデバイスをスキャンし、各 ScanEntry のアドバタイズデータをデコードします:
from ubluepy import Scanner, constants
s = Scanner()
for entry in s.scan(100):
print(entry.addr(), entry.rssi(), "dBm")
for ad_type, name, value in entry.getScanData():
print(" ", ad_type, name, bytes(value))
モジュールの内容¶
クラス¶
- class ubluepy.UUID(value)¶
16 ビットまたは 128 ビットの Bluetooth UUID を構築します。
value次のいずれか:
int--- 16 ビットの数値 UUID (UUID(0x180A))。6 文字の
"0xXXXX"文字列 --- 16 ビット UUID。例:UUID("0x181A")。36 文字の
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"文字列 --- 完全な 128 ビット UUID。ベンダー固有部分は構築時に SoftDevice に登録されます。別の
UUIDインスタンス --- コピーを行います。
その他の長さは
ValueError("Invalid UUID string length")を送出します。
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Peripheralに追加されたときに SoftDevice に登録される GATT サービスを定義します。uuidUUIDインスタンス。UUID 以外のオブジェクトを渡すとValueErrorが送出されます。typeService.PRIMARY(デフォルト) またはService.SECONDARYのいずれか。それ以外の値はValueErrorを送出します。
- addCharacteristic(characteristic: Characteristic) None¶
Characteristicをサービスに登録します。キャラクタリスティックの GATT ハンドルはこの呼び出し中に割り当てられます。
- getCharacteristic(uuid: UUID) Characteristic | None¶
以前に追加された
Characteristicを UUID で検索します。一致するキャラクタリスティックインスタンスを返します。一致が見つからない場合はNoneを返します。
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
GATT キャラクタリスティックを定義します。親の
Peripheralがアドバタイズを開始する前に、Service.addCharacteristic()を使ってServiceに追加してください。uuidUUIDインスタンス。props(キーワード専用)キャラクタリスティックがサポートする操作を示す、1 つ以上の
Characteristic.PROP_*値のビットマスク。attrs(キーワード専用)追加の GATT 属性のビットマスク。Client Characteristic Configuration Descriptor を付加するには
Characteristic.ATTR_CCCDを使用します --- これはPROP_NOTIFY/PROP_INDICATEキャラクタリスティックを動作させるために必要です。
- read() bytearray¶
セントラルロールのみ。 接続中のピアからキャラクタリスティックの値を読み取ります。最新の値を含む
bytearrayを返します。ペリフェラル上では何もせず、Noneを返します。
- write(data, *, with_response: bool = False) None¶
キャラクタリスティックに書き込みます。
ペリフェラルでは、キャラクタリスティックのプロパティに
PROP_NOTIFYが設定されている場合、値は接続中のセントラルへの GATT 通知として送信されます。設定されていない場合は、ローカルの属性値が更新されます。セントラルでは、値はリモートのピアに書き込まれます。書き込みコマンドの代わりに書き込み要求を発行し、ピアの確認応答を待つには
with_response=Trueを設定します。
dataは任意のバッファプロトコルオブジェクト (bytes、bytearray、memoryview) です。
- class ubluepy.Descriptor(uuid: UUID)¶
GATT ディスクリプタを表すスタブクラスです。現在の実装は UUID のみを保持し、メソッドを公開しません --- 本モジュールの将来のリビジョンとの前方互換性のために提供されています。
- class ubluepy.Peripheral¶
ローカルの Bluetooth LE デバイスです。ペリフェラルとセントラルの両ロールで同じクラスが使用されます。ロールは呼び出すメソッドによって選択されます (
advertise()はペリフェラルを、connect()はセントラルを選択します)。- getServices() list¶
この
Peripheralに現在登録されているサービスのリストを返します。
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
ペリフェラルロールでアドバタイズを開始します。
device_nameGAP ペイロードでアドバタイズされる完全なローカル名。
servicesアドバタイズする
Serviceインスタンスのリスト。各サービスの UUID がアドバタイズメントに含まれます。data自動生成されたヘッダーに追加される省略可能な生のアドバタイズメントペイロード (
bytes/bytearray)。Eddystone などのベンダー固有またはビーコンのペイロードに使用します。connectableTrue(デフォルト) の場合、接続可能なデバイスとしてアドバタイズし、GAP / GATTS イベントハンドラを登録します。これにより、接続、切断、CCCD への書き込み時に、設定されたsetConnectionHandler()コールバックが発火します。Falseの場合はビーコンとしてアドバタイズします --- ハンドラは登録されず、デバイスに接続することはできません。
- setConnectionHandler(func) None¶
GAP および GATTS イベントで呼び出されるコールバックを登録します。コールバックは
func(event_id, conn_handle, data)の形式で呼び出されます。event_idはconstants.EVT_GAP_CONNECTED、constants.EVT_GAP_DISCONNECTED、constants.EVT_GATTS_WRITEのいずれかの値、conn_handleは SoftDevice の接続ハンドル (GATTS 書き込みの場合は属性ハンドル)、dataはbytearrayとしての生のイベントペイロード (接続 / 切断の場合はNone) です。
- withDelegate(delegate: DefaultDelegate) None¶
デコードされた GATT イベントを受け取る
DefaultDelegateインスタンスを取り付けます。
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
セントラルロールのみ。 指定されたアドレスのピアに接続し、そのプライマリサービスとキャラクタリスティックを同期的に検出します。接続が確立され検出が完了するまでブロックします。検出されたサービスはその後
getServices()経由で利用できます。addr17 文字の
"xx:xx:xx:xx:xx:xx"文字列としてのピアアドレス (例:ScanEntry.addr()から取得したもの)。addr_type(キーワード専用)constants.ADDR_TYPE_PUBLIC(デフォルト) またはconstants.ADDR_TYPE_RANDOM_STATICのいずれか。
- class ubluepy.Scanner¶
近隣のアドバタイズ中のデバイスを検出するための GAP オブザーバーです。ファームウェアがセントラルサポートのある SoftDevice (s132 / s140) に対してビルドされている場合にのみ利用できます。
- class ubluepy.ScanEntry¶
Scanner.scan()で取得された単一のアドバタイズメントレポートです。インスタンスはスキャナーから返されます --- パブリックなコンストラクタはありません。- addr_type() int¶
ピアアドレスの種別 (
constants.ADDR_TYPE_PUBLICまたはconstants.ADDR_TYPE_RANDOM_STATIC) を返します。
- getScanData() list¶
アドバタイズメントペイロードを
(ad_type, description, value)タプルのリストにデコードします。ad_typeは数値の AD 型バイト (constants.ad_typesを参照)、descriptionは一致する定数の名前を文字列にしたもの (型が不明な場合はNone)、valueはbytearrayとしての AD レコード本体です。
- class ubluepy.DefaultDelegate¶
Peripheral.withDelegate()に渡すオブジェクトの基底クラスです。これをサブクラス化し、handleConnection()/handleNotification()をオーバーライドして GATT イベントに反応させます。
定数¶
モジュールの constants 属性は、GAP/GATT イベント識別子、アドレス種別の値、およびネストされた ad_types 名前空間を含む名前空間です。
- constants.EVT_GATTS_WRITE: int¶
ローカル GATT 属性への書き込み (通知を有効/無効にする CCCD への書き込みを含む) を表す
Peripheral接続ハンドラのevent_id値 (80)。
- constants.UUID_CCCD: int¶
Client Characteristic Configuration Descriptor の標準 Bluetooth UUID (
0x2902)。
- constants.ad_types: type¶
Bluetooth Core Specification Supplement に基づくアドバタイジングデータの AD 型定数の名前空間です。各名前は対応する 1 バイトの AD 型にマッピングされます:
名前
値
AD_TYPE_FLAGS0x01AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE0x02AD_TYPE_16BIT_SERVICE_UUID_COMPLETE0x03AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE0x04AD_TYPE_32BIT_SERVICE_UUID_COMPLETE0x05AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE0x06AD_TYPE_128BIT_SERVICE_UUID_COMPLETE0x07AD_TYPE_SHORT_LOCAL_NAME0x08AD_TYPE_COMPLETE_LOCAL_NAME0x09AD_TYPE_TX_POWER_LEVEL0x0AAD_TYPE_CLASS_OF_DEVICE0x0DAD_TYPE_SIMPLE_PAIRING_HASH_C0x0EAD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R0x0FAD_TYPE_SECURITY_MANAGER_TK_VALUE0x10AD_TYPE_SECURITY_MANAGER_OOB_FLAGS0x11AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE0x12AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT0x14AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT0x15AD_TYPE_SERVICE_DATA0x16AD_TYPE_PUBLIC_TARGET_ADDRESS0x17AD_TYPE_RANDOM_TARGET_ADDRESS0x18AD_TYPE_APPEARANCE0x19AD_TYPE_ADVERTISING_INTERVAL0x1AAD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS0x1BAD_TYPE_LE_ROLE0x1CAD_TYPE_SIMPLE_PAIRING_HASH_C2560x1DAD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R2560x1EAD_TYPE_SERVICE_DATA_32BIT_UUID0x20AD_TYPE_SERVICE_DATA_128BIT_UUID0x21AD_TYPE_URI0x24AD_TYPE_3D_INFORMATION_DATA0x3DAD_TYPE_MANUFACTURER_SPECIFIC_DATA0xFF