gpt4 book ai didi

c++ - 低功耗蓝牙 : setting characteristic to byte array sends wrong values

转载 作者:行者123 更新时间:2023-11-28 04:14:44 28 4
gpt4 key购买 nike

我正在使用 Bluetoothleapis.h 与自定义蓝牙低功耗设备通信。

设备设置如下:

  • 定制 GATT 服务
  • Characteristic#1 读/写(预计 3 个字节)
  • Characteristic#2 读取/通知(返回 1 个字节)

我能够从特征#2 中获得正确的值。但是,当我尝试向特征#1 发送数据时,设备收到奇怪的数据。

该特性负责现实生活中物体的 3 个参数(想象一下具有强度、颜色等的光)。 (0,0,0) 应该响应“灯”熄灭,但如果我发送 (0,0,0),我可以看到设备接收到其他东西(我不能确切地说出是什么,但它不是离开)。无论我发送什么值,状态似乎都没有改变。

我试过交替写入和写入无响应,两者产生相同的结果。

GetCharacteristicValue 有趣地返回了一个 8 的 charValueDataSize,尽管已知该特征只接受 3 个字节。巧合的是,出于某种原因,1 字节只读特征的大小为 9。

我曾尝试将 WriteValue 的大小限制为仅 3 个字节,但在这种情况下,我收到了无效参数错误。 StackOverflow 上其他地方的答案表明我需要使用从 GetCharacteristicValue 获得的答案,并将我的数据传输到那里。

鉴于无论发送哪个值,真实对象的状态都不会改变,我怀疑问题出在我设置字节数组以传输数据的方式上。

此外,即使在设置之后调用 GetCharacteristicValue 也会返回一个空数组。

我不确定实际发送的值是什么,而且我缺少通过 Wireshark 跟踪它们的硬件。

DWORD WriteValueToCharacteristic(__in const HANDLE deviceHandle, 
__in const CharacteristicData* pCharData,
__in const UCHAR* writeBuffer,
__in const USHORT bufferSize,
__in const BOOL noResponse )
{
HRESULT hr;
PBTH_LE_GATT_CHARACTERISTIC pCharacteristic = pCharData->pCharacteristic;
USHORT charValueDataSize;

hr = BluetoothGATTGetCharacteristicValue
(
deviceHandle,
pCharacteristic,
0,
NULL,
&charValueDataSize,
BLUETOOTH_GATT_FLAG_NONE
);

if (hr != HRESULT_FROM_WIN32(ERROR_MORE_DATA))
{
Log(L"BluetoothGATTSetCharacteristicValue returned error %d", hr);
FormatBluetoothError(hr);
return -1;
}
PBTH_LE_GATT_CHARACTERISTIC_VALUE pWriteValue = (PBTH_LE_GATT_CHARACTERISTIC_VALUE)HeapAlloc
(
GetProcessHeap(), HEAP_ZERO_MEMORY, charValueDataSize + sizeof(BTH_LE_GATT_CHARACTERISTIC_VALUE)
);

if (pWriteValue == NULL)
{
Log(L"Out of memory.");
return -1;
}

hr = BluetoothGATTGetCharacteristicValue
(
deviceHandle,
pCharacteristic,
charValueDataSize,
pWriteValue,
NULL,
BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE
);

memcpy(pWriteValue->Data, writeBuffer, bufferSize);
ULONG flags = noResponse == TRUE ? BLUETOOTH_GATT_FLAG_WRITE_WITHOUT_RESPONSE : 0;

hr = BluetoothGATTSetCharacteristicValue
(
deviceHandle,
pCharacteristic,
pWriteValue,
NULL,
flags
);

if (hr != S_OK)
{
Log(L"BluetoothGATTSetCharacteristicValue returned error %d", hr);
FormatBluetoothError(hr);
return -1;
}
HeapFree(GetProcessHeap(), 0, pWriteValue);
return ERROR_SUCCESS;
}

SetCharacteristicValue 返回 S_OK,没有产生任何错误。

在 Android 上使用 BLE 应用程序时,读取和写入特性都可以正常工作。

更新 1

@Shubham 指出这可能是字节顺序问题,所以我尝试用 memcpy 替换以下内容:

int j = 0;
int i = charValueDataSize - 1;
while (j < bufferSize)
{
pWriteValue->Data[i] = writeBuffer[j];
--i;
++j;
}

然而,什么都没有改变。

更新2

我已根据 emil's suggestion 合并了更改,它奏效了!发布完整代码以防其他人遇到同样的问题。

顺便说一句,即使该特性被标记为 Writable: true,Writable-no-response: false,我需要将标志设置为无响应才能发送值。

DWORD WriteValueToCharacteristic(__in const HANDLE deviceHandle, __in const CharacteristicData* pCharData, __in const UCHAR* writeBuffer, __in const USHORT bufferSize, __in const BOOL noResponse)
{
HRESULT hr;
PBTH_LE_GATT_CHARACTERISTIC pCharacteristic = pCharData->pCharacteristic;
USHORT charValueDataSize = 512;

PBTH_LE_GATT_CHARACTERISTIC_VALUE pWriteValue = (PBTH_LE_GATT_CHARACTERISTIC_VALUE)HeapAlloc
(
GetProcessHeap(), HEAP_ZERO_MEMORY, charValueDataSize + sizeof(BTH_LE_GATT_CHARACTERISTIC_VALUE)
);

if (pWriteValue == NULL)
{
Log(L"Out of memory.");
return -1;
}

hr = BluetoothGATTGetCharacteristicValue
(
deviceHandle,
pCharacteristic,
(ULONG)charValueDataSize,
pWriteValue,
NULL,
BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE
);
if (bufferSize > pWriteValue->DataSize)
{
if(pWriteValue->DataSize == 0)
{
pWriteValue->DataSize = bufferSize;
}
}
// after the first write, DataSize stays as 3
//pWriteValue->DataSize here is 3, as expected
//buffer size is also 3
memcpy(pWriteValue->Data, writeBuffer, bufferSize);
ULONG flags = noResponse == TRUE ? BLUETOOTH_GATT_FLAG_WRITE_WITHOUT_RESPONSE : 0;

hr = BluetoothGATTSetCharacteristicValue
(
deviceHandle,
pCharacteristic,
pWriteValue,
NULL,
flags
);

if (hr != S_OK)
{
Log(L"BluetoothGATTSetCharacteristicValue returned error %d", hr);
FormatBluetoothError(hr);
HeapFree(GetProcessHeap(), 0, pWriteValue);
return -1;
}
HeapFree(GetProcessHeap(), 0, pWriteValue);
return ERROR_SUCCESS;
}

最佳答案

我的建议是您首先将 charValueDataSize 设置为 512 + sizeof(BTH_LE_GATT_CHARACTERISTIC_VALUE)(可能的最大值),然后跳过将获得该大小的初始读取。然后查看pWriteValue->DataSize,获取读取成功后的实际大小。还要确保即使出现错误也能释放内存。

关于c++ - 低功耗蓝牙 : setting characteristic to byte array sends wrong values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56923982/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com