por low hc08 enviar datos caracteristicas ble android bluetooth-lowenergy android-bluetooth gatt

android - low - hm 10 ble



¿Cómo enviar datos a través de un enlace Bluetooth de baja energía(BLE)? (2)

Soy capaz de descubrir, conectarme a bluetooth.

Código fuente---

Conectar vía bluetooth al dispositivo remoto:

//Get the device by its serial number bdDevice = mBluetoothAdapter.getRemoteDevice(blackBox); //for ble connection bdDevice.connectGatt(getApplicationContext(), true, mGattCallback);

Gatt CallBack para Estado:

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 } };

Ahora quiero enviar comandos al dispositivo BLE remoto, pero no sé cómo hacerlo.

Una vez que el comando se envía al dispositivo BLE, el dispositivo BLE responderá transmitiendo datos que mi aplicación puede recibir.


Debe dividir este proceso en unos pocos pasos, cuando se conecta a un dispositivo BLE y descubre Servicios:

  1. Mostrar los servicios de gattServices disponibles en los servicios onServicesDiscovered para su callback

  2. Para comprobar si puedes escribir una característica o no
    busque BluetoothGattCharacteristic PROPIEDADES: no me di cuenta de la necesidad de habilitar PROPERTY_WRITE en el hardware BLE y eso desperdició mucho tiempo.

  3. Cuando escribe una característica, ¿el hardware realiza alguna acción para indicar explícitamente la operación (en mi caso, estaba encendiendo un led)

Supongamos que mWriteCharacteristic es un BluetoothGattCharacteristic La parte donde se debe verificar la PROPIEDAD debe ser como:

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

Y, para escribir su característica:

// "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);

Esas son las partes útiles del código que necesita implementar con precisión.

Consulte este proyecto github para una implementación con solo una demostración básica.


Una guía noob amigable para hacer que Android interactúe con una lámpara LED.

Paso 1. Consigue una herramienta para escanear tu dispositivo BLE. Utilicé "Bluetooth LE Lab" para Win10, pero este también lo hará: https://play.google.com/store/apps/details?id=com.macdom.ble.blescanner

Paso 2. Analice el comportamiento del dispositivo BLE ingresando datos, recomiendo ingresar valores hexadecimales.

Paso 3. Obtener la muestra de los documentos de Android. https://github.com/googlesamples/android-BluetoothLeGatt

Paso 4. Modifique los UUID que encuentra en SampleGattAttributes

Mi configuración:

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"); }

Paso 5. En BluetoothService.java modifica 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); } }

Convierte el byte-String usando esta función:

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; }

PD: El código anterior está lejos de la producción, pero espero que ayude a aquellos que son nuevos en BLE.