わからないこと
bluepyライブラリを使って、ペアリング成功、ペアリング失敗、ペアリング切断の検出を行いたいのですが、実現法が分からず困っています。
実現したいこと
RasberryPi Zero WをBLEセントラルにしたいと考えています。
今回はbluepyを使って、セントラルとしての機能を作成します。
接続相手のペリフェラルのMACアドレスは今回決め打ちであるため、
btle.Peripheral()を引数無しでインスタンス化した後、
Peripheral.connect(macAdrr)を呼び出してペリフェラルに接続を行います。
このあと、
・ペアリングが成功した時
・ペアリングが失敗した時
・ペアリング成功し、通信を行っている最中に相手が落ちてしまうなどしてペアリングが切断されてしまった時
それぞれのイベントをハンドリングし、適宜処理を行いたいと考えています。
認識していること
通知イベントのハンドルは、DefaultDelegateクラスを継承したクラスを定義し、
オーバーライドしたhandleNotification()でハンドリングすることで行うのはよく理解できました。
ただ、handleNotification()はあくまで「ペリフェラルから通知を受信したとき」にコールバックされるものであり、
接続・切断の発生といった、通信モジュールの状態変化の際にコールバックがあるものではないと認識しています。
コードイメージ
まだ設計段階なので本物のコードはないのですが、実装イメージとしては以下の通りです。
(bluepyのコード例を借りて即興で作りました)
ペリフェラルにコネクトした後メインループに入って他タスクからのキューメッセージを待受け、
他タスクからメッセージが来たらペリフェラルにWrite要求を発行します。
「p.connect()の失敗or成功」及び「メインループに入った後のペアリング切断」をなんらかの方法でハンドリングしたいです。
Python
1import btle 2 3# 通知をハンドルするデリゲート用クラス 4class MyDelegate(btle.DefaultDelegate): 5 def __init__(self, params): 6 btle.DefaultDelegate.__init__(self) 7 # ... initialise here 8 9 def handleNotification(self, cHandle, data): 10 # ペリフェラルからの通知受信時に行う処理をここに書く 11 # (通信モジュールの状態変化はここでハンドルすることはできない?) 12 13# 他タスクスレッド生成などの初期処理がこのあたりに記述される。今回は省略 14 15# インスタンス生成 16p = btle.Peripheral() 17 18# 通知ハンドル用クラスをセット 19p.withDelegate( MyDelegate(params) ) 20 21# ペリフェラルにコネクト 22p.connect('XX:XX:XX:XX:XX:XX') 23 24# サービスを取得(サービスは1つだけの想定です) 25svc = p.getServiceByUUID( service_uuid ) 26 27# キャラクタリスティックを取得(キャラクタリスティックも1つだけの想定です) 28ch = svc.getCharacteristics( char_uuid )[0] 29 30# Main loop -------- 31while True: 32 # ここで他タスクからのキューメッセージをブロッキングで待つ 33 event_id = waitMsg() 34 35 if event_id == DATA_SEND_REQ_EVENT: 36 # データWrite要求発行(今回の通信はセントラル⇒ペリフェラル方向のみです) 37 ch.write( data ) 38 39
回答1件
あなたの回答
tips
プレビュー