質問編集履歴

1

実装イメージのコード例を追加しました

2021/02/10 09:40

投稿

eleele28
eleele28

スコア18

test CHANGED
File without changes
test CHANGED
@@ -49,3 +49,101 @@
49
49
  ただ、handleNotification()はあくまで「ペリフェラルから通知を受信したとき」にコールバックされるものであり、
50
50
 
51
51
  接続・切断の発生といった、通信モジュールの状態変化の際にコールバックがあるものではないと認識しています。
52
+
53
+
54
+
55
+ ### コードイメージ
56
+
57
+ まだ設計段階なので本物のコードはないのですが、実装イメージとしては以下の通りです。
58
+
59
+ (bluepyのコード例を借りて即興で作りました)
60
+
61
+ ペリフェラルにコネクトした後メインループに入って他タスクからのキューメッセージを待受け、
62
+
63
+ 他タスクからメッセージが来たらペリフェラルにWrite要求を発行します。
64
+
65
+ 「p.connect()の失敗or成功」及び「メインループに入った後のペアリング切断」をなんらかの方法でハンドリングしたいです。
66
+
67
+
68
+
69
+ ```Python
70
+
71
+ import btle
72
+
73
+
74
+
75
+ # 通知をハンドルするデリゲート用クラス
76
+
77
+ class MyDelegate(btle.DefaultDelegate):
78
+
79
+ def __init__(self, params):
80
+
81
+ btle.DefaultDelegate.__init__(self)
82
+
83
+ # ... initialise here
84
+
85
+
86
+
87
+ def handleNotification(self, cHandle, data):
88
+
89
+ # ペリフェラルからの通知受信時に行う処理をここに書く
90
+
91
+ # (通信モジュールの状態変化はここでハンドルすることはできない?)
92
+
93
+
94
+
95
+ # 他タスクスレッド生成などの初期処理がこのあたりに記述される。今回は省略
96
+
97
+
98
+
99
+ # インスタンス生成
100
+
101
+ p = btle.Peripheral()
102
+
103
+
104
+
105
+ # 通知ハンドル用クラスをセット
106
+
107
+ p.withDelegate( MyDelegate(params) )
108
+
109
+
110
+
111
+ # ペリフェラルにコネクト
112
+
113
+ p.connect('XX:XX:XX:XX:XX:XX')
114
+
115
+
116
+
117
+ # サービスを取得(サービスは1つだけの想定です)
118
+
119
+ svc = p.getServiceByUUID( service_uuid )
120
+
121
+
122
+
123
+ # キャラクタリスティックを取得(キャラクタリスティックも1つだけの想定です)
124
+
125
+ ch = svc.getCharacteristics( char_uuid )[0]
126
+
127
+
128
+
129
+ # Main loop --------
130
+
131
+ while True:
132
+
133
+ # ここで他タスクからのキューメッセージをブロッキングで待つ
134
+
135
+ event_id = waitMsg()
136
+
137
+
138
+
139
+ if event_id == DATA_SEND_REQ_EVENT:
140
+
141
+ # データWrite要求発行(今回の通信はセントラル⇒ペリフェラル方向のみです)
142
+
143
+ ch.write( data )
144
+
145
+
146
+
147
+
148
+
149
+ ```