Saya ingin membuat aplikasi android untuk menghubungkan dan mengambil data dari papan ESP32 serta kemampuan untuk mengirim nilai ke papan menggunakan komunikasi Bluetooth Low Energy.

Saya memiliki papan ESP32 dengan server BLE di dalamnya. Saya telah menerapkan Layanan khusus dengan karakteristik berikut.

/* define the characteristic and it's propeties */
BLECharacteristic dataCharacteristic(
    BLEUUID((uint16_t)0x1A00),
    BLECharacteristic::PROPERTY_READ |
    BLECharacteristic::PROPERTY_WRITE |    
    BLECharacteristic::PROPERTY_NOTIFY);

Saya berhasil menerapkan semua fungsi pemindaian, membaca, dan memberi tahu di dalam aplikasi android tetapi ketika menulis BluetoothGatt.writeCharacteristic selalu mengembalikan false pada Kondisi pertama:

  if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE) == 0
                && (characteristic.getProperties()
                & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) == 0) {
            return false;
        }

Saat men-debug aplikasi android, karakteristik.getProperties() selalu 18.

 public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic) {
        if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE) == 0
                && (characteristic.getProperties()
                & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) == 0) {
            return false;
        }

        if (VDBG) Log.d(TAG, "writeCharacteristic() - uuid: " + characteristic.getUuid());
        if (mService == null || mClientIf == 0 || characteristic.getValue() == null) 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.writeCharacteristic(mClientIf, device.getAddress(),
                    characteristic.getInstanceId(), characteristic.getWriteType(),
                    AUTHENTICATION_NONE, characteristic.getValue());
        } catch (RemoteException e) {
            Log.e(TAG, "", e);
            mDeviceBusy = false;
            return false;
        }

        return true;
    }

Berikut adalah kode karakteristik penulisan yang menggunakan fungsi di atas:

            //Get BLE Service
            BluetoothGattService service = gatt.getService(SERVICE_UUID);

            //Get the characteristic
            BluetoothGattCharacteristic dataCharacteristic = 
            service.getCharacteristic(DATA_CHARACTERISTIC_UUID);

            //Pass value
            dataCharacteristic.setValue(value);

            //Write characteristic
            boolean success = gatt.writeCharacteristic(dataCharacteristic);

            if(success){
                Log.d(TAG, "Write characteristic successful");
            }
            else{
                Log.e(TAG, "Write characteristic failed");
            }

Saya sudah mencoba menjalankan operasi tulis tanpa membaca atau memberi tahu, untuk mencegah banyak permintaan, tetapi hasilnya sama.

Saya juga mencoba menggunakan aplikasi BLE eksternal dengan fungsi read write notify dan semuanya bekerja dengan sempurna dengan pengaturan ESP32 saya.

1
Argiris Mouratidis 13 Agustus 2019, 12:21

1 menjawab

Jawaban Terbaik

Setelah banyak mencari dan bereksperimen dengan berbagai cara mengimplementasikan komunikasi di atas dari aplikasi android dan papan ESP32 dengan server BLE di dalamnya, saya dapat menemukan solusinya.

Dalam semua pengujian saya, saya menggunakan UUID dengan cara berikut:

Mendeklarasikan karakteristik uuid di dalam ESP32

Characteristic_UUID = BLEUUID((uint16_t) 0x1A00))

Dan Mencari uuid ini dari android menggunakan

Characteristic _UUID = convertFromInteger (0x1A00)

Fungsi convertFromInteger:

    public UUID convertFromInteger (int i) 
    {
        final long MSB = 0x0000000000001000L;
        final long LSB = 0x800000805f9b34fbL;
        long value = i & 0xFFFFFFFF;
        return new UUID (MSB | (value << 32), LSB);
    }

Solusinya ditemukan ketika saya mengikuti tutorial di mana saya melihat uuid dan perbedaannya dengan yang saya gunakan. Ketika saya mengganti uuid lama saya dengan uuid yang dibuat secara acak seperti "cff6dbb0-996f-427b-9618-9e131a1d6d3f", semuanya Proses writeCharacteristic untuk server BLE dilakukan tanpa masalah.

0
Argiris Mouratidis 1 Oktober 2019, 07:42