Android没有让BLE findme设备发出哔哔声

时间:2014-04-21 18:53:26

标签: android bluetooth-lowenergy

我正在尝试实现与BLE findme设备通信的应用程序。我有这些设备之一,但有一些问题。使用iPhone我已经使用bleTools应用程序测试了这个设备,这个应用程序正常工作,即我已经设法读取所有设备的特征并发送特征使设备发出蜂鸣声。但是使用Android(Nexus 5)我只能读取设备的特性,但不能让设备发出蜂鸣声。 我的代码是:

 private static final UUID IMMEDIATE_ALERT_SERVICE =
        UUID.fromString("00001802-0000-1000-8000-00805f9b34fb");
private static final UUID IMMEDIATE_ALERT_LEVEL =
        UUID.fromString("00002a06-0000-1000-8000-00805f9b34fb");

...

public void beep(DeviceData device) {
        BluetoothGatt gatt = mConnectedDevices.get(device.getDeviceAddress());
        BluetoothGattService bluetoothGattService = gatt.getService(IMMEDIATE_ALERT_SERVICE);
        if (bluetoothGattService == null) {
            return;
        }
        BluetoothGattCharacteristic characteristic =
                bluetoothGattService.getCharacteristic(IMMEDIATE_ALERT_LEVEL);
        if (characteristic == null) {
            return;
        }        

        byte[] arrayOfByte = new byte[1];
        arrayOfByte[0] = (byte) 0x01;
        characteristic.setValue(arrayOfByte);
        gatt.writeCharacteristic(characteristic);
}

回调方法返回Ok:

@Override
        public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            if (characteristic.getUuid().toString().equals(IMMEDIATE_ALERT_LEVEL.toString())) {
                //TODO: use device address to identify the device-receiver
                Message msg = new Message();
                msg.what = MSG_PARAM_WRITTEN;
                msg.obj = (status == BluetoothGatt.GATT_SUCCESS);

                mHandler.sendMessage(msg);
            }
        }

但设备方没有任何反应。

任何人都可以向我解释我做错了什么或者可能会给我一些建议我应该做什么?

同样,我可以读取设备特性,但不能将它们写入设备。

1 个答案:

答案 0 :(得分:0)

与iOS不同,Android在蓝牙方面有很多未记载的技巧。我假设您使用的是Android 4.3及更高版本中包含的标准蓝牙库。如果您使用三星或Broadcom等其他库,结果可能会有所不同。

因为我没有findeme设备,所以无法确认。但是我已经在Android上使用了经典和低能量蓝牙能量一段时间了。我的建议是完成扫描,发现服务和读/写特征的完整过程。

  1. startLeScan
  2. onLeScanCallBack连接到设备
  3. onConnect discoverServices
  4. onServicesDiscovered获取所有特征
  5. 检查每个特征的属性
  6. 如果你能阅读它,那就去做吧
  7. 完成后,您可以编写特征并侦听onCharacteristicWrite事件。那你可能会发出哔哔声。如果没有,您将需要返回iOS项目并跟踪发送到findme设备和从findme设备接收的每一位。这听起来很难,但实际上只是在正确的代表内部读取字节。记录下来。然后返回并在Android端重新创建位序列。再次,捕获进出findme设备的所有流量。如果你能得到匹配的比特序列,你就会成功。
  8. 还有一个关于Android BLE的重要事项。写入必须是顺序的。我的意思是,如果你写了一个特征,你必须等待onCharacteristic事件才能开始,然后再编写另一个事件。 Android开发者网站上未记录此信息。实现此功能的最佳方法是使用LinkedList作为工作队列。

    祝你好运,如果你有疑问,请告诉我。