相关文章推荐
眉毛粗的回锅肉  ·  Pack Vertex | Wiki ...·  4 月前    · 
完美的领带  ·  api_python3/README_CN. ...·  7 月前    · 
  • デバイス
    Androidでのデバイス制御について。地磁気センサ、加速度センサなど
  • Android 4.0(IceCreamSandwich)からBluetoothのHealthデバイスのサポートが追加されました。
    ヘルスデバイスとは 医療、フィットネス、健康器具 などヘルス分野の製品のことで、 Bluetooth Health Device Profile(HDP) としてBluetoothでは通信を規格化しています。
    4.0での対応により、AndroidからもHDP対応ヘルスデバイスを使えることになりました。Health Device Profile対応により、血圧計、歩数計や体重計など健康器具とのデータ交換が容易に行えます。

    今回は、Bluetooth Health Deviceとの通信方法を紹介します。
    android.bluetoothパッケージ にBluetooth Health関連クラスが追加されています。
    application configurationとは、ヘルスデバイスとの接続に利用されるアプリケーション設定で、サードパーティ、開発者がヘルスデバイスとBluetoothで通信するための状態通知コールバック設定、設定名などが格納されています。

    接続するためのサンプルコードは以下のとおりです。
    ※Android 4.0およびヘルスデバイスを入手できていないため、本記事でのサンプルコードは、概要を理解するためのコードスニペットとお考えください。 実際に試すには修正が必要 です。

    ヘルスデバイスの検出処理

    以下はヘルスデバイスの検出と切断に合わせて、ヘルスデバイスを管理するためのBluetoothHealthインスタンスを取得するサンプルコードです。
    ここでは、BluetoothAdapter(Bluetooth接続のためのアダプタ)から ヘルスデバイス接続通知 を受け取り、BluetoothHealthインスタンスを取得します。

    サンプルコード

    BluetoothHealth mBluetoothHealth; BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // デフォルトアダプタからヘルスデバイスへの接続権を取得する mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEALTH); private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() { public void onServiceConnected(int profile, BluetoothProfile proxy) { if (profile == BluetoothProfile.HEALTH) { //ヘルスデバイスが検出された mBluetoothHealth = (BluetoothHealth) proxy; public void onServiceDisconnected(int profile) { if (profile == BluetoothProfile.HEALTH) { //ヘルスデバイスが切断された mBluetoothHealth = null;

    5行目:デフォルトアダプタの getProfileProxyメソッド をつかって、ヘルスデバイスの接続状態が変化した際に、通知するリスナーを登録します。
    7行目:BluetoothProfile.ServiceListener(mProfileListenerインスタンス)を作成します。
    9行目:接続されたprofileの種類がヘルスデバイスであれば、ヘルスデバイスが接続されたと判断します。
    11行目:受け取ったproxyはBluetoothProfileクラスなので、 BluetoothHealthクラスにキャスト して利用します。
    17行目:もし、ヘルスデバイスが切断された場合は、インスタンスは失われるため、null代入して処理を終了します。

    ヘルスデバイスとの接続

    接続するためのアプリケーション設定

    Bluetooth Health Device Profile(HDP)では、ヘルスデバイスと通信するための DataType が定められています。
    これらデータタイプは表の通り、動作に制約があります。 SINKタイプ であれば複数の SOURCE(ヘルスデバイス側) から情報を受け取ることができますが、その反対は出来ません。SOURCE側はあくまでデータを送出するためのデータタイプです。
    実際に接続対象(例えば血圧計、歩数計など複数のデバイスが接続済みの際に血圧計を探す、など特定の)ヘルスデバイスと接続する際は、 BluetoothHealthクラスのregisterSinkAppConfigurationメソッド を使って通信するための準備を行います。このメソッドでは接続状態など通信処理に必要なコールバックを受けるための設定を行います。
    以下のサンプルコードをみて実際の処理を確認しましょう。

    サンプルコード

    private void registerHealthDevices(){ MyBluetoothHealthCallback mCallback = new MyBluetoothHealthCallback(); mBluetoothHealth.registerSinkAppConfiguration("HEALTH_DEVICES",BluetoothHealth.SINK_ROLE, mCallback); class MyBluetoothHealthCallback extends BluetoothHealthCallback { @Override public void onHealthAppConfigurationStatusChange( BluetoothHealthAppConfiguration config, int status) { super.onHealthAppConfigurationStatusChange(config, status); // TODO : 接続したいヘルスデバイス(3rdパーティ製品など)のconfigを覚える mHealthConfig = config; @Override public void onHealthChannelStateChange( BluetoothHealthAppConfiguration config, BluetoothDevice device, int prevState, int newState, ParcelFileDescriptor fd, int channelId) { super.onHealthChannelStateChange(config, device, prevState, newState, fd, channelId); // TODO: ヘルスデバイスの状態変更通知 mChannelId = channelId; private void unregisterHealthDevices(){ mBluetoothHealth.unregisterAppConfiguration(mHealthConfig);

    4行目:BluetoothHealthクラスの registerSinkAppConfigurationメソッド を使って、ヘルスデバイスに接続するための設定を行います。
    11行目: BluetoothHealthCallbackクラスのonHealthAppConfigurationStatusChangeメソッド は、ヘルスデバイスとのアプリケーション設定情報の状態通知です。変更がある度、呼び出されることになります。statusは BluetoothHealth.APP_CONFIG_REGISTRATION_SUCCESS もしくは BluetoothHealth.APP_CONFIG_REGISTRATION_FAILURE が返却されます。
    20行目:BluetoothHealthCallbackクラスの onHealthChannelStateChangeメソッド は、ヘルスデバイスとの接続状態通知です。ヘルスデバイスとの接続状況が変化すると呼び出されます。
    prevState、newStateの値は以下の表に従います。
    32行目:BluetoothHealthクラスのunregisterAppConfigurationメソッドを使ってアプリケーション設定mHealthConfigを破棄します。

    ヘルスデバイスとの接続

    ここまでくると、あとは今までに取得したBluetoothDevice情報、アプリケーション設定(mHealthConfig)を利用してヘルスデバイスとの接続・切断を行うだけです。

    サンプルコード

    private void connect(){ //Bluetoothデバイスに、コンフィグを使って接続する mBluetoothHealth.connectChannelToSource(mBluetoothDevice, mHealthConfig); private void disconnect(){ //ヘルスデバイスと切断 mBluetoothHealth.disconnectChannel(mBluetoothDevice, mHealthConfig, mChannelId);

    3行目:BluetoothHealthクラスの connectChannelToSourceメソッド を使って、ヘルスデバイスに接続します。
    ヘルスデバイスと接続できると、前述のBluetoothHealthCallbackクラスのonHealthChannelStateChangeメソッドが呼ばれます。onHealthChannelStateChangeメソッドの引数に チャンネルID が渡されますので、覚えておき、データ取得時、切断時に利用します。
    8行目: disconnectChannelメソッド で接続を終了します。終了後に再接続したい場合は改めて、connectChannelToSourceメソッドを呼びだしてください。

    すこし長くなりましたが、ヘルスデバイスに接続するまでをサンプルコード(コードスニペット)を利用して紹介しました。実際に利用する際はヘルスデバイスに応じてサンプルコードの修正が必要となりますので、十分注意してください。
    以上、おつかれさまでした!