2

今、私はこの質問が約 10 億回聞かれていることを知っています。

私はそれらのほとんどを読みました(このWebサイトは私の問題にはあまり役に立ちませんでした)、ドキュメントを読み、例とチュートリアルを読みました。

私がやろうとしていることは次のとおりです。

hello world を BLE デバイスに送信します (arduino に接続)

私がこれまでに行ったこと:

組み込みの設定を使用してデバイスとペアリング (アプリにプログラムされたロジックはありません)

GATT サーバーを使用してデバイスに接続します。

ただし、特性を書き込もうとすると、対応するステータスの戻り値のブール値は常に false です。これは最も関連性の高いコードです:

private void setupServer(BluetoothAdapter bAdapter) {
    Log.d(TAG, "Started setting up server");

    BluetoothLeAdvertiser bAdvertiser = bAdapter.getBluetoothLeAdvertiser();
    if (bAdapter != null) {
        bGattServer = bManager.openGattServer(getApplicationContext(), new BluetoothGattServerCallback() {
            @Override
            public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
                super.onConnectionStateChange(device, status, newState);
            }
        });
        //Create a service using a random UUID
        //Create characteristics with WRITE property and write a value
        BluetoothGattService service = new BluetoothGattService(UUID.randomUUID(), BluetoothGattService.SERVICE_TYPE_PRIMARY);
        BluetoothGattCharacteristic bluetoothGattCharacteristic = new BluetoothGattCharacteristic(bUUID, BluetoothGattCharacteristic.PROPERTY_WRITE, BluetoothGattCharacteristic.PERMISSION_WRITE);
        Log.d(TAG, "Adding characteristic to service " + service.addCharacteristic(bluetoothGattCharacteristic));
        bluetoothGattCharacteristic.setValue("hello");
        Log.d(TAG, "Trying to write characteristic..., first value: " + bluetoothGattCharacteristic.getValue()[0]);
        if (bGatt != null) {
            boolean success = bGatt.writeCharacteristic(bluetoothGattCharacteristic);
            if (success) {
                Log.d(TAG, "Successfuly wrote characteristic to" + bUUID);
            } else {
                 //THIS ALWAYS EXECUTES??
                Log.e(TAG, "Failed to write to characteristic");
            }
        } else {
            Log.e(TAG, "BGATT IS NULL");
        }
        service.addCharacteristic(bluetoothGattCharacteristic);
        bGatt.setCharacteristicNotification(bluetoothGattCharacteristic, true);
        bGattServer.addService(service);
    }

これらは私の許可です:

    <uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-feature android:name="android.hardware.bluetooth_le" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

そして、これは関連するコードの残りの部分です

    private boolean scanBluetooth(final BluetoothAdapter bAdapter, final BluetoothDevice[] bDevice) {

    final BluetoothLeScanner bScanner = bAdapter.getBluetoothLeScanner();
    final boolean[] stopCallback = {false};
    Log.d(TAG,"Started scanning");
    bScanner.startScan(new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            super.onScanResult(callbackType, result);
            bDevice[0] = result.getDevice();
            if (bDevice[0] == null || stopCallback[0]) {
                Toast.makeText(getApplicationContext(), "Didn't find a device", Toast.LENGTH_LONG);

            } else {
                stopCallback[0] = true;
                System.out.println("DEVICE" + bDevice[0]);
                bGatt = bDevice[0].connectGatt(getApplicationContext(), true, new BluetoothGattCallback() {
                    @Override
                    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
                        super.onConnectionStateChange(gatt, status, newState);
                        if(status == BluetoothGatt.GATT_SUCCESS){
                            Log.d(TAG, "Successful GATT " + newState);
                            setupServer(bAdapter);
                            return;
                        }
                        if(status == BluetoothGatt.GATT_FAILURE){
                            Log.e(TAG,"Bigg error boi");
                            System.exit(1);
                        }
                        else{
                            Log.w(TAG,"Oh no, gatt failed " + status + " retrying");
                            return;
                        }

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

                }, BluetoothDevice.TRANSPORT_LE);
                Log.d(TAG, "Bgatt value:" + bGatt);


            }
        }
    });
    if(bGatt==null){
        Log.w(TAG, "BGATT IS NULL WHILE SCANNING");
    }
    Log.d(TAG, "Finished scanning...");
    return true;
}

アプリBLEScannerを使用してbUUIDを取得しました。これは、読み取りと書き込みのUUIDを示しました。私のアプリケーションの目標は、そのアプリの機能をミラーリングすることですが、頭がおかしくなり始めています。単純な hello world を送信することさえまだできません。

Android Studio の出力:

018-12-01 23:58:56.214 25024-25136/com.iopt.davidv7.iopt W/DBG: Oh no, gatt failed 22 retrying
2018-12-01 23:58:56.675 25024-25136/com.iopt.davidv7.iopt D/DBG: Successful GATT 2
2018-12-01 23:58:56.675 25024-25136/com.iopt.davidv7.iopt D/DBG: Started setting up server
2018-12-01 23:58:56.692 25024-25136/com.iopt.davidv7.iopt D/DBG: Adding characteristic to service true
2018-12-01 23:58:56.693 25024-25136/com.iopt.davidv7.iopt D/DBG: Trying to write characteristic..., first value: 104
2018-12-01 23:58:56.693 25024-25136/com.iopt.davidv7.iopt E/DBG: Failed to write to characteristic

クライアントは単純な HM-10 Bluetooth モジュールであり、今のところ ARDUINO IDE を使用して、アプリで送信したものをシリアル モニターにミラーリングしたいと考えています。

私は希望を失っているので、あなたにすべての文脈を与えたことを願っています. システムダイアログを使用して設定したため、手動でアクセス許可を確認していませんが、有効にするのは「場所」だけでしたか? これが私の問題の原因でしょうか? BluetoothのcheckSelfPermissionで確認すると、Bluetooth管理者はtrueを返しますが、そうではないと思います:

        if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.BLUETOOTH_ADMIN)
            != PackageManager.PERMISSION_GRANTED) {
        Log.e(TAG,"No permission for bluetooth");
        // Permission is not granted
    }
    else{
        Log.d(TAG,"Bluetooth permission granted");
    }
4

1 に答える 1