我对这个问题迷失了方向。

事实是,一个发布字符串值的android设备:“ 78d89537-4309-4728-87f6-3ab2bbe231d8”(36个字节)。我正在使用定义为

 anonIdCharacteristic = new BluetoothGattCharacteristic(TippeeBluetoothManager.UUID_READ_CHARACTERISTIC,
            BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_BROADCAST,
            BluetoothGattCharacteristic.PERMISSION_READ  );
    anonIdCharacteristic.setValue(idToAdvertise);


如您所见,我在“阅读”模式下投放广告,没有通知。

当另一个Android设备连接并尝试读取特征时,将调用onCharacteristicRead方法,但传递的值错误。更具体地说是:

“ 78d89537-4309-4728-87f678d89537-4309-4728-87f678d89537-4309-4728-87f6 ...”(600字节)

这是预期值的一部分,但会重复。

如果我将自己放在调试“服务器端”,则可以看到发送的字节数正确。在调试“客户端”字节为600

我究竟做错了什么 ?

提前致谢

----编辑-

我发现了更多信息。

现在,我以新月形偏移量反复调用onCharacteristicReadRequest,这导致了“脏”缓冲区,现在我以这种方式进行响应:

if (BluetoothManager.UUID_READ_CHARACTERISTIC.equals(characteristic.getUuid())) { mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, getStoredValue()); return; }

使用偏移值。尚无法正常工作,但确实如此。

我不知道该告诉应用程序响应多长时间。

最佳答案

好的,我明白了,所以我会留下我的答复来帮助别人解决我的问题。

正确的解决方案是

@Override
        public void onCharacteristicReadRequest(BluetoothDevice device,
                                                int requestId,
                                                int offset,
                                                BluetoothGattCharacteristic characteristic) {
            super.onCharacteristicReadRequest(device, requestId, offset, characteristic);
            Log.i(TAG, "onCharacteristicReadRequest " + characteristic.getUuid().toString());

            byte[] fullValue = getStoredValue();

            //check
            if (offset > fullValue.length) {
                mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, new byte[]{0} );
                return;

            }


            int size = fullValue.length - offset;
            byte[] response = new byte[size];

            for (int i = offset; i < fullValue.length; i++) {
                response[i - offset] = fullValue[i];
            }



            if (MYBluetoothManager.UUID_READ_CHARACTERISTIC.equals(characteristic.getUuid())) {
                mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, response);
                return;
            }



            mGattServer.sendResponse(device,
                    requestId,
                    BluetoothGatt.GATT_FAILURE,
                    0,
                    null);
        }

    };


回调函数被多次调用,并带有偏移量,这很明显。不清楚的是,我应该用一个包含从该偏移量开始的所有数据的数组作为响应。

所以我首先准备一个包含所有数据的数组。如果请求的偏移量超出了数据的长度,我只返回一个0字节的数组。

如果不是这样,那么我将从回调请求的偏移量开始准备原始数组的一部分,直到获得一些信息为止。因此,如果数组包含大量信息,则不重要,在第二,第三次回调中,我知道从哪里开始返回数据。

抱歉,如果不清楚,但是启用日志记录,您将了解我的意思。

祝大家好运

10-08 15:06