BLE写特性问题

BLE writeCharacteristic issue

我正在尝试 writeCharacteristic() 到 BLE 设备。

我使用Google示例应用程序建立连接,连接正常。我可以看到 BLE 服务和服务特征。

writeCharacteristic() 方法 return true 和 onCharacteristicWrite() 回调 return 状态 BluetoothGatt.GATT_SUCCESS 但设备没有任何反应: 我尝试了堆栈溢出中的所有解决方案,但没有任何帮助。 这是我的代码:

BluetoothLeService class 我有 sendData() 方法,它得到一个 byte[] 由于最大负载为 33 字节,我将分别发送每个命令。

public void sendData(byte[] data) {

        String lService = "71387664-eb78-11e6-b006-92361f002671";
        String lCharacteristic = "71387663-eb78-11e6-b006-92361f002671";

        BluetoothGattService mBluetoothLeService = null;
        BluetoothGattCharacteristic mBluetoothGattCharacteristic = null;

        if (mBluetoothGattCharacteristic == null) {
            mBluetoothGattCharacteristic = mBluetoothGatt.getService(UUID.fromString(lService)).getCharacteristic(UUID.fromString(lCharacteristic));

        }

        mBluetoothGattCharacteristic.setValue(data);

        boolean write = mBluetoothGatt.writeCharacteristic(mBluetoothGattCharacteristic);
    }

在您的代码中,您检查了 属性 的特征? 如果在设备上写入某些内容,则特性必须具有写入 属性 或写入无响应 属性 或写入并通知 属性。 因此,检查您的代码,您正在编写哪些特征。

您的代码看起来不错,如果您有 GATT_SUCCESS,则表示该特性已成功写入。 您也可以尝试读取此特性并检查值是否已更新。也有可能特性已成功写入,但只有在与设备断开连接后才会触发相应设备的功能。也有可能是设备端的一些bug。

我发现了问题。希望我的回答对其他人有帮助。 问题是,我发送的 byte[] 数组比允许的更大(20 字节)。此外,我需要在这个 byte[] 数组中添加“\r”,这样,BLE Devise 就知道它是命令的结尾。 另一件事,我需要创建一个队列并在 onCharacteristicRead() 中收到响应后从中弹出。

class DataQueues {  

        private ArrayList<byte[]> queueArray;
        private int queuSize;   

        protected DataQueues() {
            queueArray = new ArrayList<>();
        }    
        protected void addToQueue(byte[] bytesArr) {
            queueArray.add(bytesArr);    
        }  

        protected byte[] popQueue() {    
            if (queueArray.size() >= 0)
                return queueArray.remove(0);
            else {
                return null;
            }    
        }    
        protected int getArrSize() {
            return queueArray.size();
        }
    }

希望这对某些人有所帮助。