我已经在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返回错误代码。
如果我做错了什么或者我可以尝试其他可能的选择,我会很感激。
答案 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
我认为它与未定义的行为有关,但在修复之前提到的其他问题后我会检查。