Как отправить данные по каналу 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 CallBack для статуса:
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 будет отвечать посредством широковещания
данные, которые может получить мое приложение.
Ответы
Ответ 1
Вам необходимо разбить этот процесс на несколько шагов, когда вы подключаетесь к устройству BLE и обнаруживаете Службы:
-
Дисплей доступен gattServices
в onServicesDiscovered
для вашего callback
-
Чтобы проверить, можете ли вы написать характеристику или нет
проверьте BluetoothGattCharacteristic PROPERTIES - Я не понял, что нужно включить PROPERTY_WRITE на аппаратном уровне BLE и потратить много времени.
-
Когда вы пишете характеристику, аппаратное обеспечение выполняет какое-либо действие, чтобы явно указать операцию (в моем случае я загорелся светодиодом)
Предположим, что mWriteCharacteristic
является 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 для реализации только с базовой демонстрацией.
Ответ 2
Удобное руководство для 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.