0

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

我使用谷歌示例应用程序建立连接,连接很好。我可以看到 BLE 服务和服务特征。

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

BluetoothLeService类中,我有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);
    }
4

3 回答 3

0

我发现了这个问题。希望我的回答对其他人有所帮助。问题是,我发送的 byte[] 数组比它允许的(20 字节)大。另外,我需要在这个 byte[] 数组中添加“\r”,这样,BLE 设计就知道这是命令的结尾。另一件事是,我需要在 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();
        }
    }

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

于 2017-08-24T09:14:07.327 回答
0

在您的代码中,您检查特性的属性? 如果在设备上写入内容,则特征必须具有写入属性或写入无响应属性或写入和通知属性。所以检查你的代码,你写的是哪些特征。

于 2017-08-22T10:56:26.420 回答
0

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

于 2017-08-23T13:09:55.860 回答