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

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

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

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

Android

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

Q&A

3回答

6799閲覧

Bluetooth LEのコネクションでWriteが行えない

syokeinin

総合スコア74

Bluetooth

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

Android

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

0グッド

1クリップ

投稿2017/04/18 07:51

ペリフェラルおよびセントラル、どちらもAndroid端末でConnectioを張ってWriteを行おうとしたのですがうまくいきませんでした。

端末は2つともZenPad7.0のOSは5.1.1です。

以下のようにセントラル側でwriteCharacteristicを呼び出すと返却値はtrueを返してきたので一見うまくいったように感じたのですが、ペリフェラル側ではコールバックであるonCharacteristicWriteRequestが実行されませんでした。

boolean result = this.bluetoothGatt.writeCharacteristic(write); Log.d("bluetooth", "writeCharacteristic: " + result);

セントラル側のonCharacteristicWriteは実行されてstatusが3でした。3はGATT_WRITE_NOT_PERMITTEDのようなのでパーミッションが問題かと思ったのですが、もしパーミッションが許可されていなかったとしたらwrtieCharacteristicでfalseが帰ってくるようです。

@Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { Log.d("bluetooth", "onCharacteristicWrite: " + status); }

サービスのcharacteristicは以下のように設定しています。

private void setServices() { BluetoothGattService service = new BluetoothGattService( this.SERVICE_UUID, BluetoothGattService.SERVICE_TYPE_PRIMARY); BluetoothGattCharacteristic charWrite = new BluetoothGattCharacteristic( this.CHAR_WRITE_UUID, BluetoothGattCharacteristic.PROPERTY_WRITE, BluetoothGattCharacteristic.PERMISSION_WRITE); service.addCharacteristic(charWrite); this.mGattServer.addService(service); }

原因は何でしょうか。端末依存の問題なんでしょうか。
ちなみにReadはうまくいきました。

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

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

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

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

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

guest

回答3

0

GattDescriptorの設定が足りてないのが原因かもしれません。

service.addCharacteristic(charWrite);

の一行前か、

service.addCharacteristic(charWrite);


this.mGattServer.addService(service);
の間に、以下のコードを追加してみてください。

JAVA

1 BluetoothGattDescriptor dataDescriptor = new BluetoothGattDescriptor( 2 UUID.fromString("00002902-0000-1000-8000-00805f9b34fb") 3 ,BluetoothGattDescriptor.PERMISSION_WRITE); 4 5 charWrite.addDescriptor(dataDescriptor);

投稿2017/04/20 09:21

編集2017/04/20 09:23
hillacken

総合スコア359

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

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

syokeinin

2017/04/20 10:13

追加してみましたが、残念ながら結果は同じでした。
hillacken

2017/04/20 10:20

まじですか。結構自信あったんですが・・・
syokeinin

2017/04/21 00:05

ありがとうございます。別の端末が入手できたらそちらでも調査しみます。
guest

0

writeの付くプロパティとパーミッションを全部入れてみた場合もダメですか?

JAVA

1 BluetoothGattCharacteristic charWrite = new BluetoothGattCharacteristic( 2 this.CHAR_WRITE_UUID, 3 BluetoothGattCharacteristic.PROPERTY_WRITE | 4 BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE, 5 BluetoothGattCharacteristic.PERMISSION_WRITE | 6 BluetoothGattCharacteristic.PERMISSION_WRITE_ENCRYPTED | 7 BluetoothGattCharacteristic.PERMISSION_WRITE_ENCRYPTED_MITM | 8 BluetoothGattCharacteristic.PERMISSION_WRITE_SIGNED | 9 BluetoothGattCharacteristic.PERMISSION_WRITE_SIGNED_MITM);

投稿2017/04/18 11:43

hillacken

総合スコア359

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

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

syokeinin

2017/04/19 00:15

プロパティおよびパーミッションを全てつけてみましたが、サービス検出時にサービスおよびキャラクタリスティクのUUIDが変化してしまい見つけることができなくなってしまいました。
hillacken

2017/04/19 01:45

public BluetoothGattCharacteristic getCharacteristic(String sid, String cid) { BluetoothGattService s = mBluetoothGatt.getService(UUID.fromString(sid)); if (s == null) { Log.w(TAG, "Service NoT found :" + sid); return null; } BluetoothGattCharacteristic c = s.getCharacteristic(UUID.fromString(cid)); if (c == null) { Log.w(TAG, "Characteristic NOT found :" + cid); return null; } return c; } ここでNotFoundになってしまう感じですか?
syokeinin

2017/04/19 03:22

はい、まさにその場所です
hillacken

2017/04/19 04:23

UUIDが変化というよりはサービスが作れてないみたいですね・・・ ちょっと状況が難しいので私には力になれないですね。すいません。 ペリフェラルの設定は元に戻して、 セントラル側はGooglePlayにあるBLEScannerとかでwriteしてみるとなにかわかるかもしれません。
syokeinin

2017/04/19 06:22

変化ではなく、確かにサービスがそのものがないみたいです。 BLEScannerでwriteを使用してみたところやはりonCharacteristicWriteRequesが実行されなかったです。端末によってwriteが許可されていないなんてことあるんでしょうかね。
hillacken

2017/04/19 07:39 編集

> BLEScannerでwriteを使用してみたところやはりonCharacteristicWriteRequesが実行されなかったです。 となると、ペリフェラル側が原因の可能性が高いですね。 ペリフェラルとして動作できてreadはできるにもかかわらず、writeだけが許可されていないというのは可能性はかなり少ないと思います。 どこかの設定が足りてないか間違えているかだと思います。
guest

0

BluetoothGattCallback#onCharacteristicWriteに書いてありますが、「書き込んだ内容」と「第二引数の内容」を比較することで何かわかるかもしれません。

投稿2017/04/18 08:26

yona

総合スコア18155

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

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

syokeinin

2017/04/18 09:26

比較したところオブジェクトは違いましたが、フィールドに入っている値は同じでした。
yona

2017/04/18 09:41

そうですか、この辺は実装したことがないので、もう少し調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問