如何通过蓝牙低功耗(BLE)链路发送数据?

时间:2014-04-30 16:08:47

标签: android bluetooth-lowenergy android-bluetooth gatt

我能够发现,连接到蓝牙。

源代码---

通过蓝牙连接到远程设备:

//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

    }
};

现在我想向远程BLE设备发送命令,但不知道该怎么做。

一旦命令被发送到BLE设备,BLE设备将通过广播进行响应 我的申请可以收到的数据。

2 个答案:

答案 0 :(得分:14)

当您连接到BLE设备并发现服务时,您需要将此过程分解为几个步骤:

  1. gattServices

  2. onServicesDiscovered中显示可用callback
  3. 检查您是否可以写一个特征 检查BluetoothGattCharacteristic PROPERTIES - 我没有意识到需要在BLE硬件上启用PROPERTY_WRITE并且浪费了很多时间。

  4. 当您编写特征时,硬件是否执行任何操作以明确指示操作(在我的情况下,我点亮了led)

  5. 假设mWriteCharacteristicBluetoothGattCharacteristic 检查财产的部分应该是:

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

    这些是您需要精确实现的代码的有用部分。

    参考this github project了解一个基本演示的实现。

答案 1 :(得分:3)

一款让操作系统与LED灯互动的无聊指南。

第1步。 获取扫描BLE设备的工具。我使用"蓝牙LE实验室"对于Win10,但是这个也会这样做:https://play.google.com/store/apps/details?id=com.macdom.ble.blescanner

第2步。 通过输入数据分析BLE设备的行为,我建议输入十六进制值。

第3步。 获取Android文档的示例。 https://github.com/googlesamples/android-BluetoothLeGatt

第4步。 修改您在SampleGattAttributes

中找到的UUID

我的配置:

    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

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

使用此函数转换byte-String:

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的人。