BluetoothGATTSetCharacteristicValue返回E_INVALIDARG或ERROR_INVALID_FUNCTION

时间:2017-09-27 14:57:08

标签: c++ winapi bluetooth-lowenergy

我已经在BluetoothAPIs apis之上构建了一个包含类的集合C ++。

我可以枚举服务,特征和描述符的开放句柄。我可以阅读特征值。我遇到的问题是我无法写入特征值。

以下是用于写入特征值的代码

void BleGattCharacteristic::setValue(UCHAR * data, ULONG size){
if (pGattCharacteristic->IsSignedWritable || pGattCharacteristic->IsWritable || pGattCharacteristic->IsWritableWithoutResponse)
{
    size_t required_size = sizeof(BTH_LE_GATT_CHARACTERISTIC_VALUE) + size;

    PBTH_LE_GATT_CHARACTERISTIC_VALUE gatt_value = (PBTH_LE_GATT_CHARACTERISTIC_VALUE)malloc(required_size);

    ZeroMemory(gatt_value, required_size);

    gatt_value->DataSize = (ULONG)size;
    memcpy(gatt_value->Data, data, size);

    HRESULT hr = BluetoothGATTSetCharacteristicValue(bleDeviceContext.getBleServiceHandle(), pGattCharacteristic, gatt_value, NULL, BLUETOOTH_GATT_FLAG_NONE);

    free(gatt_value);

    if (HRESULT_FROM_WIN32(S_OK) != hr)
    {
        stringstream msg;
        msg << "Unable to write the characeristic value. Reason: ["
            << Util.getLastError(hr) << "]";

        throw BleException(msg.str());
    }
}
else
{
    throw BleException("characteristic is not writable");
}}

对bleDeviceContext.getBleServiceHandle()的调用返回设备信息服务的打开句柄。

pGattCharacteristics是指向写入特征的指针。它是通过调用BluetoothGATTGetCharacteristics打开的。

我尝试过不同的标志组合,但返回代码没有区别。

我也尝试使用设备的句柄而不是服务。在这种情况下,我得到一个ERROR_INVALID_FUNCTION返回错误代码。

如果我做错了什么或者我可以尝试其他可能的选择,我会很感激。

2 个答案:

答案 0 :(得分:0)

1-您必须使用服务处理,对 2-我不知道你是如何设计你的课程的,然后你是如何为特征的价值本身分配一些记忆的 我做了什么(确保对Value的数据有足够和适当的记忆):
a)在Value对象的init处,调用:: BluetoothGATTGetCharacteristicValue两次,以获得所需的大小,然后为它实际分配一些内部存储器。
b)使用它时,将内存设置为可能的内容,然后调用:: BluetoothGATTSetCharacteristicValue

= HR :: BluetoothGATTSetCharacteristicValue(
  处理,
  (PBTH_LE_GATT_CHARACTERISTIC)的特点,
  value,//实际上是(PBTH_LE_GATT_CHARACTERISTIC_VALUE)到分配的内存
  0,// BTH_LE_GATT_RELIABLE_WRITE_CONTEXT ReliableWriteContext,
  BLUETOOTH_GATT_FLAG_NONE)

答案 1 :(得分:0)

所以有一些事情:

typedef struct _BTH_LE_GATT_CHARACTERISTIC_VALUE {
   ULONG DataSize;
   UCHAR Data[];
} BTH_LE_GATT_CHARACTERISTIC_VALUE, *PBTH_LE_GATT_CHARACTERISTIC_VALUE;

是如何定义data structure used in the parameter CharacteristicValue的。请注意,Data NOT 是已分配的数组,而是指针。因此,访问Data[0]是未定义的行为,可以访问内存中的任何位置。而是需要gatt_value.Data = &data;设置指向输入参数地址的指针。

其次the documentation is quite clear关于你可能获得ERROR_INVALID_FUNCTION的原因;如果另一个可靠的写入已经挂起,则此写入将失败。在这种情况下,您应该考虑重试逻辑。

至于E_INVALIDARG我认为它与未定义的行为有关,但在修复之前提到的其他问题后我会检查。