【发布时间】:2017-09-27 14:57:07
【问题描述】:
我在 BluetoothAPIs api 之上构建了一组包含类的 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 返回错误代码。
我将不胜感激任何关于我做错了什么或我可以尝试的其他可能选项的指示。
【问题讨论】:
-
驱动程序对您的代码不满意。没有人可以运行此代码,因此您必须自己弄清楚。关键的第一步是修复错误报告代码中的错误。调用 GetLastError() 不正确,错误代码已嵌入 hr 值中。使用 if (FAILED(hr)) 来决定是否显示它。
-
Util.getLastError() 从 HR int 值生成可读错误。所以我没有看到你看到的错误。
-
@DerekGn 除了
HRESULThas a way of getting readable errors -
@Mgetz 我不想将 com api 调用与 winapi 混合使用,因为我认为这是不好的做法。这可能是一种误导的观点。我的 Util.getLastError() 基本上完成了整个 FormatMessage 例程。如果使用 HRESULT 没问题,那么更少的 LOC 会更好。谢谢指点。
-
旁注:
deletemallocd 内存的行为未定义,您需要使用free或使用new。但老实说,你不需要这样做,因为你有一个指向数据的指针......而且不需要制作副本。
标签: c++ winapi bluetooth-lowenergy