SHARP製のスマホSHL23でBLE(Bluetooth Low Energy)通信のプログラミングを試してみました。わざわざSHARP製のスマホSHL23と書かないで普通にAndroidのスマホと書きたかったのですが、私のスマホのSHL23はBLEのAPIが独自の実装になっている点があるためにSHARP製のスマホSHL23と書きました。分かりにくくなるかもしれないですが一般的なAndroidでのBLE通信のプログラミングについてとSHL23の独自の部分は独自の部分として書きます。
まずは現時点でのAndroidでのBLE通信APIの状況は以下です。
Android4.3 からBLEを扱うAPIが提供された。ただしセントラルのみ対応。
Android5.0 からAndroidデバイスをペリフェラルとしても動作可能。
この条件では以下の記事で書いたようにセントラル、ペリフェラルとして両方実装(以下の記事はiOSです。)するにはAndroid5.0以上でハードウェアも対応していることが必要になってきます。
Core BluetoothでBLE通信(その2)ペリフェラル
Core BluetoothでBLE通信(その3)セントラル
そこで私が現在使っているSHL23ですが、これはAndroid4.2.2です。つまり4.3以下なのでBLE通信は使えないということになります。但し、SHARPがバックポートという形で対応(以下参照)しているとのことなのでその方法でセントラルだけでも試そうということでやってみました。(そのうち新しいAndroidタブレットが買えればとは思いますが。)
SH Developers Square Android 4.2搭載端末での Bluetooth Low Energy API 利用方法
以上を踏まえて今回の開発環境です。
開発用PC Windows8.1 Pro
開発ソフト Android Studio(Java SE Development Kit 8)
ターゲットAPI Android SDK 4.3(API18)
実行環境はもちろん、SHARP製 SHL23で、Android4.2.2です。
これで以下の記事でも使ったTI(テキサスインスツルメンツ社)のSensorTagを使ってみます。このデバイスには様々なセンサーが搭載されていてその値が取得出来るのですが、分かりやすいと思うデバイスに付いているボタンのON/OFFを検知します。
Core BluetoothでBLE通信(その1)BLEの仕様概要
以下の画像がSHL23とSensorTagを並べた状態です。画像では分かりにくいと思いますが、SensorTagの正面の上部からボタンが左右2つ押すことが出来ます。今回はこれを使って動作確認します。
実際のプログラムですが、ここでは以下のフェンリル株式会社さんのページのプログラムを利用させて頂きました。ありがとうございます。
【連載】Bluetooth LE (5) Android 4.3 で Bluetooth LE 機器を使う
あと、メーカ提供のサンプルプログラムもあるようです。以下を参照して下さい。現時点では以下のページの概要の英文にリンクがあってそのリンク先にソースがあります。
CC2541 SensorTag ソフトウェア
ここではフェンリルさんのプログラムを元に、SHARP製スマホSHL23で動かすために以下の点を考慮しました。
マニュフェストの記述
SHARPのサイトからの引用で以下のように書かれています。
(ここから引用)
・Android SDKのバージョンがAndroid4.3(API 18)以上であること。
・Manifestに指定する”Min SDK version”が17以下、
もしくは未指定であること。
・Manifestの”Uses Feature”で、
“jp.gr.java_conf.ble_profile.api.gatt”を指定すること。
“android.hardware.bluetooth_le”を指定しないこと。
(引用ここまで)
ここでは以下のように書きました。
※applicationの記述は省略します。 <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="18" /> <uses-feature android:name="jp.gr.java_conf.ble_profile.api.gatt"/> <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
次に、起動時のBLEサポートのチェックです。以下のように書きました。
Context context = this.getApplicationContext(); if (!context.getPackageManager().hasSystemFeature("jp.gr.java_conf.ble_profile.api.gatt")) { Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show(); finish(); }
普通にAndroid4.3以上では以下のように書くと思います。
Context context = this.getApplicationContext(); if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show(); finish(); }
その他は上記のフェンリル株式会社さんのページのプログラムをそのままです。実際のAPIの使い方等で必要な場合はそちらを参照して下さい。
あと、SHARP共通 ADB USBドライバは以下のページからダウンロードしました。
SH Developers Square ドライバ
これで以下のスクリーンショットのように動作しました。
Connectボタンでスキャンが実行されSensorTagを検知して、StatusがNOTIFICATION_REGISTEREDになりました。
以上のように動作確認出来ました。
今回はここまでです。まずは私のスマホでもBLE通信が出来たということなので実際にSensorTagでセンサーの値を取得するとか、その他BLE通信で何か出来たらまた書きたいと思います。