5

Nexus 7とバイオセンサーをBLEリンクで接続するAndroidプロジェクトに取り組んでいます。問題は、センサーのサービスと特性のリストを正常に検出して取得できることです。特定の特性にデータを書き込むと、onCharacteristicWrite自動的に呼び出され、書き込み操作が成功したことが示されました。ただし、センサーはタブレットから何も受信しません。iPhoneで同様のアプリを使用すると、すべて正常に動作します。ですので、端末には問題ありません。誰かが問題について何か考えを持っていますか?

書き込み用の私のコードは次のとおりです。

 private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            mConnected = true;
            Log.i(TAG, "Connected to GATT server.");
            // Attempts to discover services after successful connection.
            Log.i(TAG, "Attempting to start service discovery:" +
                    mBluetoothGatt.discoverServices());

        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            mConnected = false;
            Log.i(TAG, "Disconnected from GATT server.");
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {

         //Once detected services, write to characteristic for 6 times.
          int count =6;
            while(count>0){

              writeCharacteristic();

                count--;

            }

        } else {
            Log.w(TAG, "onServicesDiscovered received: " + status);
        }
    }

    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt,
                                      BluetoothGattCharacteristic characteristic,
                                      int status){

        if (status == BluetoothGatt.GATT_SUCCESS){

            Log.d(TAG,"Write to Characteristic Success! !");
        }

    }
};

public boolean writeCharacteristic(){

    //check mBluetoothGatt is available
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        Log.w(TAG, "BluetoothAdapter not initialized");
        return false;
    }

    BluetoothGattService Service = mBluetoothGatt.getService(UUID_MY_SERVICE);
    if (Service == null) {
        Log.e(TAG, "service not found!");
        return false;
    }
    BluetoothGattCharacteristic characteristic = Service
            .getCharacteristic(UUID_MY_CHARACTERISTIC);
    if (characteristic == null) {
        Log.e(TAG, "char not found!");
        return false;
    }

    byte[] value = {(byte)300,(byte)100,(byte)100};
    characteristic.setValue(value);

    boolean status = mBluetoothGatt.writeCharacteristic(characteristic);

    return status;
}

出力には「Write to Characteristic Success!!」と表示されます。6回、書き込み操作が成功しました。ただし、デバイスはタブレットから何も受信していないことを示しています。また、一度に 1 バイトずつ書き込むか、タイマーを追加して、タブレットが 2 秒ごとにセンサーに書き込むようにしました。しかし、どれも機能しませんでした。何か案は?

4

1 に答える 1

1

(質問の編集で回答。コミュニティ wiki の回答に変換。質問への回答が質問自体に追加された場合の適切なアクションは何ですか? を参照してください。 )

OP は次のように書いています。

ファローアップ:

この問題は、コードによるペアリングではなく、設定で最初にタブレットとデバイスを手動でペアリングすることで解決しました。

したがって、Android が提供する Gatt を接続するコード スニペットを使用するだけでは、デバイスをペアリングするのに十分ではありません。毎回手動でペアリングしたくない場合は、デバイスをペアリングするためにオンラインで見つけた別のコードを追加する必要があります。

private void pairDevice(BluetoothDevice device) {
    try {
        Log.d("pairDevice()", "Start Pairing...");
        Method m = device.getClass()
                .getMethod("createBond", (Class[]) null);
        m.invoke(device, (Object[]) null);
        Log.d("pairDevice()", "Pairing finished.");
    } catch (Exception e) {
        Log.e("pairDevice()", e.getMessage());
    }
}
于 2015-02-06T21:57:28.050 に答える