如何连接蓝牙低功耗设备
Posted
技术标签:
【中文标题】如何连接蓝牙低功耗设备【英文标题】:How to connect to the bluetooth low energy device 【发布时间】:2013-11-17 11:39:50 【问题描述】:我正在为 Win 8 平板电脑编写程序。我需要连接外部 BLE 设备。 该设备已与 Windows 配对,我可以在设备管理器中看到它。但我不知道如何连接它。
使用 SetupDiEnumDeviceInfo 和 SetupDiGetDeviceProperty 我可以获得有关 BLE 设备的一些信息,但要执行,例如蓝牙GATTGetServices 处理设备需要。我不知道该去哪里。或许我可以使用CreateFile,但不清楚将lpFileName作为第一个参数的替代。
这是我正在寻找我的设备的一段代码。
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(
&BluetoothClassGUID, /* GUID_DEVCLASS_BLUETOOTH */
0, 0, DIGCF_PRESENT);
if (hDevInfo == INVALID_HANDLE_VALUE)
// Insert error handling here.
return ;//1;
// Enumerate through all devices in Set.
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
&DeviceInfoData);i++)
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_FRIENDLYNAME,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
// Change the buffer size.
if (buffer) delete(buffer);
// Double the size to avoid problems on
// W2k MBCS systems per KB 888609.
buffer = new wchar_t[buffersize * 2];
else
// Insert error handling here.
break;
/* Here i just compare by name is this my device or not */
...
/* Here i just compare by name is this my device or not */
if (buffer) delete(buffer);
if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
// Insert error handling here.
return; //1;
// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
return;// 0;
我移动了一点,但我仍然无法从设备获取数据。
要获得“设备接口路径”必须使用其他函数: SetupDiGetClassDevs、SetupDiEnumDeviceInterfaces 和 SetupDiGetDeviceInterfaceDetail。
接下来,使用 CreateFile 我得到 HANDLE BLE-device。
hComm = CreateFile(pInterfaceDetailData->DevicePath, GENERIC_WRITE | GENERIC_READ,NULL,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
接下来使用 WinAPI BluetoothGATTGetServices 和 BluetoothGATTGetCharacteristics 我得到了适当的结构。
但是当尝试使用 BluetoothGATTGetCharacteristicsValue 获取属性值时,我得到 ERROR_ACCESS_DENIED。
然后我不知道该怎么办。有什么问题?
【问题讨论】:
这方面有什么进展吗? 您使用哪个界面 UUID 来查找您的设备? GUID_BTHPORT_DEVICE_INTERFACE 仅返回内部 BLE 扫描器。 【参考方案1】:注意:想知道如何检索 BTLE 设备的设备路径以调用 BluetoothGATTGetServices?
gattServiceGUID 是您的设备支持的任何长格式 BLE UUID。
"00001803-0000-1000-8000-00805F9B34FB" can be used to open a handle to the Link Loss service if supported by the device you are trying to open
HDEVINFO hDevInfo = SetupDiGetClassDevs(&gattServiceGUID, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo != INVALID_HANDLE_VALUE)
SP_DEVICE_INTERFACE_DATA interfaceData;
ZeroMemory(&interfaceData,sizeof(SP_DEVICE_INTERFACE_DATA));
interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
for (DWORD dwDeviceIndex = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &gattServiceGUID, dwDeviceIndex, &interfaceData); dwDeviceIndex++)
dwDeviceCount++;
SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, NULL, 0, &dwBytesNeeded, NULL);
if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
pInterfaceDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) new byte[dwBytesNeeded];
SP_DEVINFO_DATA spDeviceInfoData = sizeof(SP_DEVINFO_DATA) ;
ZeroMemory(pInterfaceDetail, sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA));
pInterfaceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
// grab the interface detail
if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, pInterfaceDetail, dwBytesNeeded, NULL, &spDeviceInfoData) == TRUE)
// request a handle to the GATT service path
m_hGattServiceHandle = CreateFile(pInterfaceDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (m_hGattServiceHandle != INVALID_HANDLE_VALUE)
now you can drill down the characteristics and descriptors with the m_hGattServiceHandle
【讨论】:
您可能需要对此添加解释。目前只是一段代码。 我如何向下钻取?对于“BluetoothGATTSetCharacteristicValue”等功能,我仍然需要设备句柄【参考方案2】:Andrey,我认为问题在于您的设备未连接且 BluetoothGATTGetCharacteristicsValue 未触发连接。
尝试使用 Windows 工具手动连接您的设备。我有以下对我有帮助的流程:取消配对设备,配对设备->它应该显示为已连接(它在我的情况下有效;))
无论如何,如果这没有帮助,请尝试运行“以管理员身份”运行,这在某些情况下会有所帮助。
祝你好运!!!
【讨论】:
以上是关于如何连接蓝牙低功耗设备的主要内容,如果未能解决你的问题,请参考以下文章