2016/06/11

[android][ble]BLE接続する (3) - 最終回

3回目。
今回はCharacteristicのアクセスを見ていく。

AndroidでのBLEアクセスについて調べる、というよりも、Bluetooth Developer Studioで生成されたAndroid Clientのソースをなるべく流用して楽にBLEアクセスするアプリを作るのを目的としているので、そこら辺はご容赦を。

なるべく、既存のアプリを機械的に変更するだけでBLE対応できるようにしたいと思っている。
まあ、まだちゃんとしたAndroid/BLEアプリを作ったことがないので、何でもかんでもはできないだろうが、勉強だからよいのだ。


はじめる前につらつらと考えていたのだが、BLE接続してしまえば、アプリによってはUIなどなくても勝手にRead/Writeできるはずだ。

接続も、ペアリングしていればUI無しでよいのかもしれない。
ペアリング無しの機器であれば、最初からUI無しでも接続できるだろうが、さすがにそれはちょっと怖い。
基本的には人見知りで、知り合いになった後であれば気楽に話せる、というのがよいだろう。

 

ここは、もうちょっと慣れてからだな。


話を戻そう。

BDSサンプルでは、PeripheralControlActivityで値の読み書きをしている。
こんな画面だ。

image

ベースはこちらだが、ReadとWriteだけだと足りないので、Write without Response、Notification、Indicationを追加している。
nRF51822のソース
Nordic pluginsをそのまま使うと、UINT8_ARRAYの書込みでHardFaultが発生するのを忘れていてはまってしまった。。。

 

PeripheralControlActivityでは、こんなしくみになっている。

  • Write
    1. 該当するTextViewに16進数を書込んで、ボタンを押す
    2. PeripheralControlActivityのonWrite()が呼ばれる
      1. TextViewが持つandroid:tagを取得
        • tagにはサービスUUIDとキャラクタリスティックUUIDが載っている
          例:gatt_op_B7B851C6D7B847B38F93773756B46F9A_B7B80010D7B847B38F93773756B46F9A
      2. tagを分解して、サービスUUIDとキャラクタリスティックUUIDを取得
      3. 取得したUUID達から元になったUI部品を検索(EditTextになるみたい)
      4. 検索できたEditTextから文字列を取得
      5. 取得したUUID達からCharacteristicPropertiesを取得
        • CharacteristicPropertiesは自作classで、キャラクタリスティックが書き込めるかどうかなどの情報を持たせている・・・のだが、これは自動的取得するのではなくonCreate()のときに1つずつ設定している。
        • nRF Master Controlアプリは相手の情報を知らなくてもやっているから、自動でできるんじゃないの?
      6. 書き込み可能かチェック
      7. EditTextに書込まれている文字列が16進数として妥当かチェック
      8. BleAdapterService#writeCharacteristic()で書込む
    3. 書込が終わったら、handleMessage()が呼ばれる
      1. GATT_CHARACTERISTIC_WRITTENイベント

こんなもんだろう。
Characteristicの属性チェックを省けば、以下があればよいことになる。

  • BleAdapterService
  • サービスUUID
  • キャラクタリスティックUUID
  • 書込みたい値

このUUIDだが、ハイフンを付けた文字列のようだ。
"0000XXXX-0000-1000-8000-00805f9b34fb"みたいなやつ。
BleAdapterServiceにUUIDの定義はあるのだが、そちらはハイフン無しの16進数だ。
変換は、Utility.normaliseUUID()でできる。

できるけど、ハイフン無しの形式で持つ理由がないと思う。
使ってないし。
それならいっそのこと、最初からハイフン付きで生成した方がよさそうだ。

 

Readについても、流れは同じ。
結果はコールバックで戻ってくるので、テスト先で処理したい場合は、そこに流すしくみが必要になる。

Notification/Indicationもだいたい同じだが、こちらは先にCCCDに書込みをして有効にしておかねばならない。
今のところ、nRF51822でNotification/Indicationするしくみを作っていないので、今回はここまで。


今回までのAndroidソース
BDSのAndroid Clientプラグインソース

そう、とうとうプラグインの動作を変更するところに手を染めてしまった。
といっても、128bit UUIDをハイフン区切りにするだけなのだが。
テンプレートは、ログを出す部分をどうするか迷いつつ、BleAdapterServiceのgetService()をpublicにした。
Activityから使いたいとなると、別パッケージになっても使えた方が便利だからだ。

 

やることはまだあるのだけど、読み書きについては流れがわかったつもりなので、シリーズは今回で終わりにしよう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。