Приложение для Android: подключение к серверу GATT с использованием UUID

Я пытаюсь подключиться к серверу Bleno Periphecal GATT из своего приложения для Android.

Сервер GATT имеет индивидуальную услугу и характеристику с уникальными UUID.

Как я могу точно определить подключение к этому серверу и отправить текст?

Минимальный SDK — 21, а целевой SDK — 24, поэтому старый метод сканирования BluetoothLE устарел, и теперь мне нужно использовать BluetoothLEScanner.


person Toshihiro M Sakurai    schedule 17.11.2016    source источник


Ответы (1)


Для подключения Ble просто используйте этот метод, передайте mac-адрес вашего BT-устройства.

 private boolean connectGatt(final String address) {
    if (mBluetoothAdapter == null || address == null) {
        Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
        return false;
    }

    if (mBluetoothGatt != null) {
        Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");
        if (mBluetoothGatt.connect()) {
            return true;
        } else {
            return false;
        }
    }

    final BluetoothDevice device = mBluetoothAdapter
            .getRemoteDevice(address);
    if (device == null) {
        Log.w(TAG, "Device not found.  Unable to connect.");
        return false;
    }

    mBluetoothGatt = device.connectGatt(mContext, false, mGattCallback);
    Log.d(TAG, "Trying to create a new connection.");
    return mBluetoothGatt.connect();
}

и вы должны зарегистрировать обратный вызов, чтобы узнать, успешно ли установлено соединение.

 private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {

        if (newState == BluetoothProfile.STATE_CONNECTED) {
            //bluetooth is connected so discover services
            mBluetoothGatt.discoverServices();

        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            //Bluetooth is disconnected
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
          // services are discoverd 
        }

        
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt,
                                     BluetoothGattCharacteristic characteristic,
                                     int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            
        }
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt,
                                        BluetoothGattCharacteristic characteristic) {

    }

    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
        super.onCharacteristicWrite(gatt, characteristic, status);
       
    }
};

как только службы обнаружены, вы можете писать или читать из служб.

для записи в службу используйте этот метод

 private boolean writeRXCharacteristic(byte[] value) {
    BluetoothGattService RxService = mBluetoothGatt.getService(/*Place service UUID*/);
    if (RxService == null) {
        //Service not supported
        return false;
    }
    BluetoothGattCharacteristic RxChar = RxService.getCharacteristic(/*RX_CHAR_UUID*/);
    if (RxChar == null) {
        // service not supported
        return false;
    }
     RxChar.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
        RxChar.setValue(arr);
        return mBluetoothGatt.writeCharacteristic(RxChar);
}
person Jayanth    schedule 17.11.2016
comment
Спасибо за совет. Откуда взялись iGatt, iChar и arr? Я не знаком с этими вещами. Нужно ли мне инициализировать эти значения в функции writeRXCharacteristic? Также когда я должен вызывать функцию writeRXCharacteristic? - person Toshihiro M Sakurai; 17.11.2016
comment
@ToshihiroMSakurai, вы узнали, что означают значения arr, iGatt и iChar? - person Keselme; 06.07.2020
comment
@Keselme arr — это массив байтов, который вы хотите отправить, iGatt — это ваша служба Gatt, которую вы получите при подключении, ichar — это BluetoothGattCharacteristic. - person Jayanth; 06.07.2020
comment
@ Джаянт, спасибо. Когда я делаю writeCharacteristics, должен ли запускаться onCharacteristicWrite или любой другой обратный вызов? - person Keselme; 06.07.2020
comment
onCharacteristicWrite будет вызываться - person Jayanth; 06.07.2020