- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个带有自定义服务的设备,它使用 BLE 通知功能以非常高的速率发送传感器数据。
我在 Windows 10 机器上使用以下 API:https://msdn.microsoft.com/en-us/library/windows/hardware/jj159880(v=vs.85).aspx
我正在使用 SetupDi API 通过自定义服务 ID 搜索设备,然后使用 CreateFile“连接”到它。
当我第一次将设备与 Windows 配对时,它会立即在“蓝牙设置”窗口中显示“已连接”,然后当我运行我的应用程序时它运行良好(我以高速率接收数据)。如果我关闭我的应用程序,它会将“设置”窗口中的状态更改为“已配对”而不是已连接(我认为这很好)。当我再次打开我的应用程序时,它会连接并再次将设置中的状态更改为“已连接”,但现在由于某种原因我以低得多的速率接收数据。 (数据本身是正确的)。如果我通过蓝牙设置窗口通过单击“删除设备”断开连接,然后像之前一样再次配对,它第一次以高速率再次工作。
我知道这不是设备本身的问题,因为它适用于 Android 和其他支持 BLE 的平台。
知道是什么导致了这个问题吗?
这是我使用的代码:
GUID serviceGuid = StringToGUID(GEM_SERVICE_GUID);
HDEVINFO info = SetupDiGetClassDevs(&guid, 0, 0, DIGCF_DEVICEINTERFACE);
SP_DEVICE_INTERFACE_DATA data;
data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
int i = 0;
while (SetupDiEnumDeviceInterfaces(info, NULL, &guid, i, &data))
{
i++;
}
if (GetLastError() != ERROR_NO_MORE_ITEMS)
{
// TODO throw
}
DWORD requiredSize;
if (!SetupDiGetDeviceInterfaceDetail(info, &data, NULL, 0, &requiredSize, NULL))
{
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
// TODO throw
}
}
PSP_DEVICE_INTERFACE_DETAIL_DATA details = (PSP_DEVICE_INTERFACE_DETAIL_DATA)std::malloc(requiredSize);
details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(info, &data, details, requiredSize, NULL, NULL))
{
// TODO throw
}
m_service = CreateFile(details->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (m_service == INVALID_HANDLE_VALUE)
{
// TODO throw
return;
}
BTH_LE_GATT_CHARACTERISTIC combinedDataChar = FindCharacteristicByUUID(m_service, COMBINED_DATA_CHAR_HANDLE);
BTH_LE_GATT_DESCRIPTOR desc = FindDescriptorByType(m_service, &combinedDataChar, ClientCharacteristicConfiguration);
BTH_LE_GATT_DESCRIPTOR_VALUE val;
RtlZeroMemory(&val, sizeof(val));
val.DescriptorType = ClientCharacteristicConfiguration;
val.ClientCharacteristicConfiguration.IsSubscribeToNotification = TRUE;
HRESULT res = BluetoothGATTSetDescriptorValue(m_service, &desc, &val, BLUETOOTH_GATT_FLAG_NONE);
if (res != S_OK)
{
// TODO throw
}
BLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION chars;
chars.NumCharacteristics = 1;
chars.Characteristics[0] = combinedDataChar;
res = BluetoothGATTRegisterEvent(m_service, CharacteristicValueChangedEvent, &chars, OnValueChanged, NULL, &m_registrationHandle, BLUETOOTH_GATT_FLAG_NONE);
if (res != S_OK)
{
// TODO throw
}
编辑:
OnValueChanged
回调的代码:
void OnValueChanged(BTH_LE_GATT_EVENT_TYPE eventType, PVOID eventOutParameter, PVOID context)
{
BLUETOOTH_GATT_VALUE_CHANGED_EVENT* e = (BLUETOOTH_GATT_VALUE_CHANGED_EVENT*)eventOutParameter;
std::cout << e->CharacteristicValue->DataSize << std::endl;
}
最佳答案
我相信您通过 OnValueChanged
回调接收数据?它没有在您的代码中提供,问题可能出在其中的某个地方。如果您犹豫是否提供其代码,我建议您在“坏” session 期间执行以下实验:
现在 OnValueChanged
的代码可用了:
以高速率输出到控制台可能是瓶颈。我建议你每隔几秒只计算一次事件和输出计数,像这样:
static DWORD lastTicks = GetTickCount();
static DWORD count = 0;
count++;
DWORD ticksElapsed = GetTickCount() - lastTicks;
if (ticksElapsed > 5000)
{
std::cout << "Rate: " << (double(count) / ticksElapsed) << " / sec" << std::endl;
lastTicks = GetTickCount();
count = 0;
}
进行更多测试(例如,5 次配对,每次配对后 5 次连接)并提供事件发生率。有可能发生速率下降实际上与其他事情有关,而不是重新配对。
关于c++ - Windows 上的蓝牙低功耗低速率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32368370/
具体的软硬件实现点击 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
我是一名优秀的程序员,十分优秀!