- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Bluetoothleapis.h
与自定义蓝牙低功耗设备通信。
设备设置如下:
我能够从特征#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 应用程序时,读取和写入特性都可以正常工作。
@Shubham 指出这可能是字节顺序问题,所以我尝试用 memcpy 替换以下内容:
int j = 0;
int i = charValueDataSize - 1;
while (j < bufferSize)
{
pWriteValue->Data[i] = writeBuffer[j];
--i;
++j;
}
然而,什么都没有改变。
我已根据 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/
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 卷积神经网络(CNN)通过从原始数据中自动学习层次特征表示,在图像识别任务中取得了巨大成功。虽然
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 血压的测量和预测是心脏病患者和有心脏问题的人的一个重要条件,应该保持持续的控制。在这项研究中,基
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 心血管疾病是最严重的死亡原因之一,每年在全世界造成严重的生命损失。持续监测血压似乎是最可行的选择
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 恩智浦MCX系列MCU的新品MCXN947 。 自 2015 年恩智浦和飞思卡尔合并成新恩智浦之后,关于它们各
我正在开发一个应用程序,该应用程序接受语音输入,并将该输入与 list 中的已知项目进行匹配。 list 中的每个项目都有一个别名列表,以便长标题的项目可以与较短的名称相匹配。 例如: class P
两个双模蓝牙设备连接时,必须使用EDR,不能并联使用LE。然后必须通过 EDR 链路传输 BT 低功耗 GATT 配置文件。这是我从规范中读到的内容。 但是 iOS EDR 堆栈(在没有 MFi 许可
我正在尝试为 S3 开发蓝牙 4.0 应用程序。问题是,手机的行为就像它甚至没有蓝牙 4.0。它不会发现 4.0 设备,并且无法通过 4.0 设备发现。我在手机设置和应用程序中都尝试过,使用 Broa
我正在寻找一种与 Adafruit bluefruit LE(nRF8001 芯片组)板进行交互的方法,在 Windows 桌面应用程序中使用 c#(据我所知,我无法使用 Windows.Device
我是一名优秀的程序员,十分优秀!