web-dev-qa-db-fra.com

Comment envoyer des données via une liaison Bluetooth Low Energy (BLE)?

Je peux découvrir, me connecter au bluetooth.

Code source---

Connectez-vous via Bluetooth au périphérique distant:

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

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

Gatt CallBack for Status:

 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

    }
};

Maintenant, je veux envoyer des commandes au périphérique BLE distant mais je ne sais pas comment faire.

Une fois la commande envoyée au périphérique BLE, le périphérique BLE répondra en diffusant les données que mon application peut recevoir.

20
My God

Un guide convivial pour faire Android interagir avec une lampe LED.

Étape 1. Obtenez un outil pour analyser votre appareil BLE. J'ai utilisé "Bluetooth LE Lab" pour Win10, mais celui-ci le fera également: https://play.google.com/store/apps/details?id=com.macdom.ble.blescanner =

Étape 2. Analyser le comportement de l'appareil BLE en saisissant des données, je recommande d'entrer des valeurs hexadécimales.

Étape 3. Obtenez l'échantillon des documents Android. https://github.com/googlesamples/Android-BluetoothLeGatt

Étape 4. Modifiez les UUID que vous trouvez dans SampleGattAttributes

Ma config:

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

enter image description here

Étape 5. Dans BluetoothService.Java, modifiez 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);
    }
}

Convertissez la chaîne d'octets à l'aide de cette fonction:

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: Le code ci-dessus est loin de la production, mais j'espère qu'il aidera ceux qui sont nouveaux dans BLE.

5
Martin Pfeffer