1

に格納されている値を読み取ろうとしていますBluetoothGattCharacteristic。以下は、BluetoothGattCallbackほとんどのアクションが行われる私のコードです。

 private final BluetoothGattCallback mGattCallback =
            new BluetoothGattCallback() {
                @Override
                public void onConnectionStateChange(BluetoothGatt gatt, int status,
                                                    int newState) {
                    if (newState == BluetoothProfile.STATE_CONNECTED) {
                        Log.i(TAG, "Connected to GATT server.");
                        Log.i(TAG, "Getting services....");
                        gatt.discoverServices();
                    } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                        Log.i(TAG, "Disconnected from GATT server.");
                    }
                }

                @Override
                public void onServicesDiscovered(BluetoothGatt gatt, int status) {
                    if (status == BluetoothGatt.GATT_SUCCESS) {
                        BluetoothGattService serv = gatt.getService(Constants.MY_UUID);
                        if (serv != null) {
                            BluetoothGattCharacteristic characteristic = serv.getCharacteristic(Constants.ANOTHER_UUID);
                            boolean res = gatt.readCharacteristic(characteristic);
                            if (res) {
                                Log.d(TAG, "res was true");
                            } else {
                                Log.d(TAG, "res was false");
                            }
                        }
                    } else {
                        Log.w(TAG, "onServicesDiscovered received: " + status);
                    }
                }

                @Override
                public void onCharacteristicRead(BluetoothGatt gatt,
                                                 BluetoothGattCharacteristic characteristic,
                                                 int status) {
                    if (status == BluetoothGatt.GATT_SUCCESS) {
                        Log.d(TAG, "Succesfully read characteristic: " + characteristic.getValue().toString());
                    } else {
                        Log.d(TAG, "Characteristic read not successful");
                    }
                }
            };

したがって、特性から読み取るために、gatt.readCharacteristic()特性を取り、操作が成功したかどうかを示すブール値を返すメソッドを使用しようとしています。ここでは、このメソッドが返さfalseれ (「res was false」と出力)、失敗したことを示しています。

印刷されているエラー メッセージはありません。特性の正しい読み方は?このメソッドが返されるのはなぜfalseですか?

編集: Inferno が提案したように、先に進み、必要なソースをダウンロードしてから、BluetoothGatt readCharacteristic()メソッドにブレークポイントを設定しました:

readCharacteristic()android-23..\BluetoothGattのメソッドは次のとおりです。

public boolean readCharacteristic(BluetoothGattCharacteristic characteristic) {
        if ((characteristic.getProperties() &
                BluetoothGattCharacteristic.PROPERTY_READ) == 0) return false;

(characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_READ)は 0 を返しfalseているため、すぐに返されます。現在、デバッガーによると、characteristic.getProperties()の値が返されていますが8BluetoothGattCharacteristic.PROPERTY_READ静的な int 値は0x02です。

私が理解しているように、0x08 & 0x02== 0.PROPERTY_READはハードコードされた値であるため、 から返される値に何か問題があると思いますcharacteristic.getProperties()。ここで何がうまくいかないのでしょうか?

4

2 に答える 2

2

特性の正しい読み方は?

まずgatt.readCharacteristic(characteristic)、コールバック内から呼び出しonServicesDiscovered()ますが、これで問題ありません。あなたのコードに重大な欠陥は見当たりません。

追加できるのは、確認するonConnectionStateChange()の追加のチェックです。newState == BluetoothProfile.STATE_CONNECTED

if (status == BluetoothGatt.GATT_SUCCESS) { ...

このメソッドが false を返すのはなぜですか?

BluetoothGatt hereの Android ソースを確認したところfalse、以下のコードでわかるように、さまざまなケースでの戻り値が返されることがわかりました。

public boolean readCharacteristic(BluetoothGattCharacteristic characteristic) {
    if ((characteristic.getProperties() &
            BluetoothGattCharacteristic.PROPERTY_READ) == 0) return false;

    if (VDBG) Log.d(TAG, "readCharacteristic() - uuid: " + characteristic.getUuid());
    if (mService == null || mClientIf == 0) return false;

    BluetoothGattService service = characteristic.getService();
    if (service == null) return false;

    BluetoothDevice device = service.getDevice();
    if (device == null) return false;

    synchronized(mDeviceBusy) {
        if (mDeviceBusy) return false;
        mDeviceBusy = true;
    }

    try {
        mService.readCharacteristic(mClientIf, device.getAddress(),
            characteristic.getInstanceId(), AUTHENTICATION_NONE);
    } catch (RemoteException e) {
        Log.e(TAG,"",e);
        mDeviceBusy = false;
        return false;
    }

    return true;
}

そのため、Android Studio でデバッガーを起動し、readCharacteristic()メソッド内にブレークポイントを設定して ( 内BluetoothGatt.java) 、コードを慎重にfalseステップ実行して、が返される場所を確認することをお勧めします。そうすれば、問題をローカライズできると思います。それ以外は、何でも勝手な推測です。

もちろん、表示するにはソースをダウンロードする必要がありますBluetoothGatt.java。ただし、Android Studio では、エディターの上部に小さな黄色のバーが表示され、ダウンロードしてインストールするかどうかを尋ねられます。ダウンロードが完了したら、Android Studio を再起動してください。次に、でブレークポイントを設定できるはずですBluetoothGatt.java

アップデート:

私が理解しているように、0x08 & 0x02 == 0.PROPERTY_READ はハードコードされた値であるため、characteristic.getProperties() から返される値に何か問題があると思います。ここで何がうまくいかないのでしょうか?

BLUETOOTH SPECIFICATION Version 4.2 [Vol 3, Part G] page 533 によると、その値は手段0x8によって返されcharacteristic.getProperties()、あなたの特性は書き込み専用パーミッションを持っています。すべての読み取り試行が失敗するのは当然のことです。つまり、Bluetooth デバイスでは、その特定の特性を読み取ることができません。

仕様書より引用:

Characteristic Properties ビット フィールドは、Characteristic Value の使用方法、または特性記述子 (セクション 3.3.3 を参照) へのアクセス方法を決定します。

于 2016-09-28T16:24:29.300 に答える
0

BLEチップを搭載した牛のブラシスクラッチャーからデータを読み取ろうとしていました. BLEモジュールの読み取り特性下にありました。データは 16 進数で返されます。つまり、BRUSH_OFF の場合は 0x00、BRUSH_ON の場合は 0x01 です。

Androidアプリでこのデータを読み込もうとしていたのですが、空白のまま戻ってきました。

問題は 0x00 = ascii の NUll と 0x01 = SOH ascii で、画面に表示できません。

0x30 = アスキーで 0 0x31 = アスキーで 1

エスケープ文字が 16 進数で戻ってきて、読み取ることができない場合があります。

値を読み戻せない理由を突き止めるのに何ヶ月も費やしました。これがお役に立てば幸いです。

于 2017-02-15T14:47:07.370 に答える