質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

2回答

15436閲覧

AndroidアプリでBLEを使った送受信について

shani

総合スコア12

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2016/03/03 08:41

Android端末2台で1台にBLEのcentral、もう1台にBLEのperipheral機能を持つアプリを作りました。
やりたいことは、centralアプリからperipheralアプリに送信したデータによって、peripheralアプリからcentralアプリに返す値を変えたいです。

(例) centralからperipheralに'a'というデータを送信したら、'b'を返す
centralからperipheralに'c'というデータを送信したら、'd'を返す

ですが、centralアプリのBluetoothGattCharacteristicにsetvalueしてから、BluetoothGatt.readCharacteristicを実行しても、peripheralアプリのBluetoothGattServerCallbackのonCharacteristicWriteRequestにsetvalueのデータは渡りませんでした。

また、centralアプリのBluetoothGattCharacteristicにsetvalueしてから、BluetoothGatt.writeCharacteristicを実行すると、peripheralアプリのBluetoothGattServerCallbackのonCharacteristicWriteRequestに値は渡りますが、BluetoothGattServer.sendResponseのvalueに値を設定しても、centralに値は返りませんでした。

何か方法はないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決しました。
Notificationを使うと、特定のデバイスに通知が送れるので、centralアプリでBluetoothGatt.writeCharacteristicで値を送信し、peripheralアプリのonCharacteristicWriteRequest内で処理結果を通知で返すことで解決しました。

========== centralアプリソース ==========
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);

String serviceUuid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; String characteristicUuid = "YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY"; String characterisitcConfigUuid = "00002902-0000-1000-8000-00805f9b34fb"; BluetoothGattService service = gatt.getService(serviceUuid); if (service != null) { BluetoothGattCharacteristic characteristic = service.getCharacteristic(characteristicUuid); boolean registered = gatt.setCharacteristicNotification(characteristic, true); if (registered) { BluetoothGattDescriptor descriptor = characteristic.getDescriptor(characterisitcConfigUuid); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); gatt.writeDescriptor(descriptor); } }

}

@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
super.onDescriptorWrite(gatt, descriptor, status);

mCharacteristic.setValue("peripheralに渡す値"); gatt.writeCharacteristic(mBleGattCharacteristic)

}

@Override
public void onCharacteristicChanged(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic) {
super.onCharacteristicChanged(gatt, characteristic);

log.d(TAG, characteristic.getStringValue(0));

}

========= peripheralアプリソース =========
@Override
public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value);
mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, null);
}

@Override
public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId, BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
super.onCharacteristicWriteRequest(device, requestId, characteristic, preparedWrite, responseNeeded, offset, value);

Log.d(TAG, value.toString()); // valueを使った処理 characteristic.setValue(処理結果); mGattServer.notifyCharacteristicChanged(device, characteristic, false); mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, null);

}

投稿2016/03/07 08:47

shani

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Android BLEに関しては情報が少なく、皆さんお困りのようです。
検索結果のTOP位置に表示されたQiitaの記事でも同様の状況だとコメントがありました。

Qiita:【Android】BLE通信ざっくりまとめ

でPeripheralアプリは Android 5.0以降でないと動作しないようですが、
端末のOS Versionはご確認なられましたか?

Wikiなどで一覧を確認したところ、5.0を搭載した端末はまだまだ少ないですね…
また、一部の端末では5.0以降でもアプリがクラッシュする旨がリンク先にも記載されていました。

以上、
参考になりますでしょうか?

投稿2016/03/04 14:29

Aeona

総合スコア396

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shani

2016/03/07 02:12

ご回答ありがとうございます。 返事が遅くなり申し訳ありません。 >Android BLEに関しては情報が少なく、皆さんお困りのようです。 検索結果のTOP位置に表示されたQiitaの記事でも同様の状況だとコメントがありました。 はい。複数の記事を読んでみたのですが、読み込み、書き込み、characteristicの変更通知のみで、書き込んだ後のレスポンスについての記事が見当たらず・・・。 変更通知だと、複数台同時にBLE接続していた場合、接続している全端末に通知がいってしまうのでは?と思うのですが、一度試してみようと思っています。 >でPeripheralアプリは Android 5.0以降でないと動作しないようですが、 端末のOS Versionはご確認なられましたか? peripheralアプリを動かしている端末は5.0.2で、アプリ間の接続、読み込み、書き込みはできています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問