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:
Mostrar los servicios de
gattServices
disponibles en los serviciosonServicesDiscovered
para sucallback
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.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.