Как отправить данные по ссылке Bluetooth Low Energy (BLE)?

Я могу обнаружить, подключиться к bluetooth.

Исходный код---

Подключение к удаленному устройству через Bluetooth:

//Get the device by its serial number
 bdDevice = mBluetoothAdapter.getRemoteDevice(blackBox);

 //for ble connection
 bdDevice.connectGatt(getApplicationContext(), true, mGattCallback);

Обратный звонок Gatt для определения статуса:

 private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    //Connection established
    if (status == BluetoothGatt.GATT_SUCCESS
        && newState == BluetoothProfile.STATE_CONNECTED) {

        //Discover services
        gatt.discoverServices();

    } else if (status == BluetoothGatt.GATT_SUCCESS
        && newState == BluetoothProfile.STATE_DISCONNECTED) {

        //Handle a disconnect event

    }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {

    //Now we can start reading/writing characteristics

    }
};

Теперь я хочу отправлять команды на удаленное устройство BLE, но не знаю, как это сделать.

Как только команда будет отправлена ​​на устройство BLE, устройство BLE ответит широковещательной передачей данных, которые мое приложение может получить.


person My God    schedule 30.04.2014    source источник
comment
Я не знаком с Android, больше с iOS, и я работал с BLE. Но нельзя писать только по характеристике (если это разрешено). Итак, вам нужно найти характеристику. Логика такая: Периферийные - ›Услуги -› Характеристика (и).   -  person Larme    schedule 30.04.2014
comment
@Larme: означает ли это, что яблоко позволяет писать, как указано в спецификациях bluetooth для gatt, особенно пользовательские профили gatt? Удалось ли вам установить двустороннюю связь с corebluetooth без членства в MFI?   -  person andreas-supersmart    schedule 30.09.2014
comment
@ andreas-manusm: Да, можно.   -  person Larme    schedule 30.09.2014
comment
У меня похожие сомнения, может ли кто-нибудь увидеть ссылку и ответить на этот заголовок stackoverflow.com/questions/38935479/   -  person RAJAT SINGH    schedule 13.08.2016


Ответы (2)


Вам нужно разбить этот процесс на несколько шагов, когда вы подключаетесь к устройству BLE и обнаруживаете службы:

  1. Показать доступные gattServices в onServicesDiscovered для вашего callback

  2. Чтобы проверить, можете ли вы написать характеристику или нет,
    проверьте BluetoothGattCharacteristic PROPERTIES - Я не понимал, что нужно включать PROPERTY_WRITE на оборудовании BLE, и это тратило много времени.

  3. Когда вы пишете характеристику, выполняет ли оборудование какое-либо действие, чтобы явно указать на операцию (в моем случае я зажигал светодиод)

Предположим, mWriteCharacteristic - это BluetoothGattCharacteristic.html"> BluetoothGattCharacteristic. Часть, в которой проверяется СВОЙСТВО, должна быть такой:

if (((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE) |
     (charaProp & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE)) > 0) {
 // writing characteristic functions
 mWriteCharacteristic = characteristic;
  }

И, чтобы написать свою характеристику:

// "str" is the string or character you want to write
byte[] strBytes = str.getBytes();
byte[] bytes = activity.mWriteCharacteristic.getValue();  
YourActivity.this.mWriteCharacteristic.setValue(bytes);
YourActivity.this.writeCharacteristic(YourActivity.this.mWriteCharacteristic);  

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

Обратитесь к этому проекту github для реализации с простой демонстрацией.

person Pararth    schedule 01.05.2014
comment
спасибо. Я уже нашел BluetoothLeGatt исходный код github и реализовал большую часть его функций, включая сканирование и подключение. Теперь будем искать Light_BLE, чтобы соответствовать изменениям и для лучшего развития. - person My God; 02.05.2014
comment
Также хочу знать, что мой удаленный BLE будет принимать такие команды, как Start, чтобы начать трансляцию, и Stop, чтобы остановить трансляцию от BLE к клиенту. Итак, эти команды - это то, что вы назвали характеристиками в своем коде? - person My God; 02.05.2014
comment
да, вам также необходимо запрограммировать BLE, начало и конец могут быть значениями 1 и 2 или любым другим значением, которое вы пишете с клиента, это будет включать цикл if-else на стороне программирования BLE hw - person Pararth; 02.05.2014
comment
Что такое charaProp? - person Billyjoker; 22.01.2018
comment
YourActivity.this.mWriteCharacteristic.setValue (strBytes); - person cristianego; 26.11.2018
comment
в примере записи данных это строка superflu: byte [] bytes = activity.mWriteCharacteristic.getValue (); код не работает - person user2199593; 21.01.2020

Удобное для новичков руководство по взаимодействию Android со светодиодной лампой.

Шаг 1. Получите инструмент для сканирования вашего устройства BLE. Я использовал "Bluetooth LE Lab" для Win10, но этот тоже подойдет: https://play.google.com/store/apps/details?id=com.macdom.ble.blescanner

Шаг 2. Проанализировать поведение устройства BLE путем ввода данных, рекомендую вводить шестнадцатеричные значения.

Шаг 3. Получите образец документации Android. https://github.com/googlesamples/android-BluetoothLeGatt

Шаг 4. Измените UUID, которые вы найдете в SampleGattAttributes

Моя конфигурация:

    public static String CUSTOM_SERVICE = "0000ffe5-0000-1000-8000-00805f9b34fb";
    public static String CLIENT_CHARACTERISTIC_CONFIG = "0000ffe9-0000-1000-8000-00805f9b34fb";

    private static HashMap<String, String> attributes = new HashMap();

    static {
        attributes.put(CUSTOM_SERVICE, CLIENT_CHARACTERISTIC_CONFIG);
        attributes.put(CLIENT_CHARACTERISTIC_CONFIG, "LED");
    }

введите описание изображения здесь

Шаг 5. В BluetoothService.java измените onServicesDiscovered:

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

        for (BluetoothGattService gattService : gatt.getServices()) {
            Log.i(TAG, "onServicesDiscovered: ---------------------");
            Log.i(TAG, "onServicesDiscovered: service=" + gattService.getUuid());
            for (BluetoothGattCharacteristic characteristic : gattService.getCharacteristics()) {
                Log.i(TAG, "onServicesDiscovered: characteristic=" + characteristic.getUuid());

                if (characteristic.getUuid().toString().equals("0000ffe9-0000-1000-8000-00805f9b34fb")) {

                    Log.w(TAG, "onServicesDiscovered: found LED");

                    String originalString = "560D0F0600F0AA";

                    byte[] b = hexStringToByteArray(originalString);

                    characteristic.setValue(b); // call this BEFORE(!) you 'write' any stuff to the server
                    mBluetoothGatt.writeCharacteristic(characteristic);

                    Log.i(TAG, "onServicesDiscovered: , write bytes?! " + Utils.byteToHexStr(b));
                }
            }
        }

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

Преобразуйте байтовую строку с помощью этой функции:

public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
    data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
            + Character.digit(s.charAt(i + 1), 16));
}
return data;
}

PS: Приведенный выше код далек от производства, но я надеюсь, что он поможет тем, кто плохо знаком с BLE.

person Martin Pfeffer    schedule 03.11.2017
comment
Характеристика.getUuid (). toString (). equals (0000ffe9-0000-1000-8000-00805f9b34fb) жестко запрограммирована, но я подозреваю, что если вы измените свой модуль BT на другой, эта строка будет другой. Может быть, лучше было бы какое-то сравнение, чтобы проверить, есть ли у этой характеристики свойство записи. - person Billyjoker; 22.01.2018