前回の記事の続きとなります。Githubは以下です


キャラクタリスティックのNotify属性のコールバック処理

上のサイトで解説されている通り、キャラクタリスティックには属性があります。属性というと「?」って感じなんですが、通知と表現するとNotifyと被るので属性と表現されます。感覚としては通知みたいなもんです。

  • Read
  • Write
  • Notify
  • Indicate

があります(他にもあるかも)。Read,Writeは読み書きする属性、Notify,Indicateはなんらかの通知の属性です。NotifyとIndicateの違いは接続[ESP32]からの応答を要求するのがIndicate、しないのがNotifyとのことです。HIDサービスでキーコードやマウスの移動などの情報はNotifyで通知されてきます。つまりはNotifyを受けった際にコールバック処理をしてデータをマウス・キーボードパーサーに送ればよいのです。

NimBLEのサンプルスケッチでは

上のライブラリのサンプルでは”DEAD”サービスの”BEEF”キャラクタリスティックからのNotifyを受け取ったときにコールバック処理をしています。このコードでは汎用性が悪く、Moke Nakamuraさんのサイトで、その点を修正した解説とコードが掲載されています。とてもありがたいです。

複数のキャラクタリスティックにNotifyのコールバックを登録できるようになっています。これを用いていきます。

ちょっと変更したのが、registerForNotifyがdeprecatedになってsubscribeになった点です。

Notifyの場合はnotifications = trueにして、Indicateの場合はfalseにします。第三引数のresponseはNotifyの場合はfalseかなと思ったんですが、デフォルトのfalseではコールバックが呼ばれないのでtrueとしています。このへんは調べましたがわからずじまいでした。IndicateでもNotifyでもtureを指定しています。

コールバックの本体(NotifyCB)です

Notifyを受信したら、マウス/キーボードのパーサーにデータを渡すだけです。注意点はマウスの通知は更新が激しいので通知が半端なく来ます。ログ出力、文字列比較などの重い文字列処理をしてしまうと処理が追い付かなくなり、マウスがドリフトしてしまいます。当初デバイスのMacアドレス比較を文字列比較で行って激重になって原因追及に時間を取られてしまいました。デバック以外は軽い処理のみにすべきです。パーサーもその点考えて実装すべきです。僕は気づいた時には実装後でしたw。

データ解析とPC-98とのやりとりは各種パーサーが担当します。記事を改めます。

投稿者 まる

Twitter : @dinagon Instagram : @d_dinagon フォロバします!!最近、ESP/Arduinoいじりすぎでアプリ開発が進んでない。歯医者なのに歯のことはあまり触れませんw