找了很久的低功耗蓝牙程序开发,终于在国外找到了部分资料

翻译 2017年06月29日 02:11:44
#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#include <bthdef.h>
#include <Bluetoothleapis.h>
#pragma comment(lib, "SetupAPI")
#pragma comment(lib, "BluetoothApis.lib")

#define TO_SEARCH_DEVICE_UUID "{0000180d-0000-1000-8000-00805f9b34fb}" 

HANDLE GetBLEHandle(__in GUID svcGuid)
{
	HDEVINFO hDevInfo;
	SP_DEVICE_INTERFACE_DATA devIntfData;
	SP_DEVINFO_DATA devInfoData;
	GUID deviceGUID = svcGuid;
	HANDLE hFind = NULL;

	hDevInfo = SetupDiGetClassDevs(&deviceGUID, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);

	if (hDevInfo == INVALID_HANDLE_VALUE) return NULL;

	devIntfData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
	devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

	for (DWORD i = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &deviceGUID, i, &devIntfData); i++)
	{
		SP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;

		DeviceInterfaceDetailData.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

		DWORD size = 0;

		if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &devIntfData, NULL, 0, &size, 0))
		{
			int err = GetLastError();

			if (err == ERROR_NO_MORE_ITEMS) break;

			PSP_DEVICE_INTERFACE_DETAIL_DATA pInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)GlobalAlloc(GPTR, size);

			pInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

			if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &devIntfData, pInterfaceDetailData, size, &size, &devInfoData))
				break;

			hFind = CreateFile(
				pInterfaceDetailData->DevicePath,
				GENERIC_WRITE | GENERIC_READ,
				FILE_SHARE_READ | FILE_SHARE_WRITE,
				NULL,
				OPEN_EXISTING,
				0,
				NULL);

			GlobalFree(pInterfaceDetailData);
		}
	}

	SetupDiDestroyDeviceInfoList(hDevInfo);
	return hFind;
}


int main()
{
	GUID svcGuid;
	CLSIDFromString(TEXT(TO_SEARCH_DEVICE_UUID), &svcGuid);

	HANDLE hLEDevice = GetBLEHandle(svcGuid);

	printf("Find Handle: 0x%x \r\n", hLEDevice);

	//-------------------------------------------
	USHORT serviceBufferCount;

	HRESULT hr = BluetoothGATTGetServices(
		hLEDevice,
		0,
		NULL,
		&serviceBufferCount,
		BLUETOOTH_GATT_FLAG_NONE);

	if (hr != HRESULT_FROM_WIN32(ERROR_MORE_DATA)) {
		printf("BluetoothGATTGetServices - Need Alloc Buffer Size: %d \r\n", serviceBufferCount);
	}

	PBTH_LE_GATT_SERVICE pServiceBuffer = (PBTH_LE_GATT_SERVICE)
		malloc(sizeof(BTH_LE_GATT_SERVICE) * serviceBufferCount);

	if (pServiceBuffer == NULL) {
		printf("pServiceBuffer out of memory\r\n");
	}
	else {
		RtlZeroMemory(pServiceBuffer,
			sizeof(BTH_LE_GATT_SERVICE) * serviceBufferCount);
	}
	
	USHORT numServices;
	hr = BluetoothGATTGetServices(
		hLEDevice,
		serviceBufferCount,
		pServiceBuffer,
		&numServices,
		BLUETOOTH_GATT_FLAG_NONE);

	if (hr == S_OK) {
		printf("BluetoothGATTGetServices - Service Count %d \r\n", numServices);
	}
	//-------------------------------------------
	USHORT charBufferSize;
	hr = BluetoothGATTGetCharacteristics(
		hLEDevice,
		pServiceBuffer,
		0,
		NULL,
		&charBufferSize,
		BLUETOOTH_GATT_FLAG_NONE);
	if (HRESULT_FROM_WIN32(ERROR_MORE_DATA) == hr) {
		printf("BluetoothGATTGetCharacteristics - Buffer Size %d \r\n", charBufferSize);
	}

	PBTH_LE_GATT_CHARACTERISTIC pCharBuffer;
	if (charBufferSize > 0) 
	{
		pCharBuffer = (PBTH_LE_GATT_CHARACTERISTIC)
			malloc(charBufferSize * sizeof(BTH_LE_GATT_CHARACTERISTIC));

		if (pCharBuffer == NULL) {
			printf("pCharBuffer out of memory\r\n");
		}
		else {
			RtlZeroMemory(pCharBuffer,
				charBufferSize * sizeof(BTH_LE_GATT_CHARACTERISTIC));
		}

		USHORT numChars;
		hr = BluetoothGATTGetCharacteristics(
			hLEDevice,
			pServiceBuffer,
			charBufferSize,
			pCharBuffer,
			&numChars,
			BLUETOOTH_GATT_FLAG_NONE);

		if (hr == S_OK) {
			printf("BluetoothGATTGetCharacteristics - Actual Data %d \r\n", numChars);
		}

		if (numChars != charBufferSize) {
			printf("buffer size and buffer size actual size mismatch\r\n");
		}
	}
	//-------------------------------------------


	//-------------------------------------------

	system("pause");
	return 0;
}




            

相关文章推荐

从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开

一、程序错误 编译错误,即语法错误。程序就无法被生成运行代码。运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 ...

【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。   文章链接: http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:...

c++ 使用throw抛出异常

抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为: throw 表达式;     如果在try语句块的程序段中(包括...

C++中自定义异常的抛出与捕获

有几年没用C++了,好些细节的地方都记不清了。现在需要用C++操作wxWidgets做一个系统软件。 想起C++的异常捕获和处理,与Java和C#有些不同的地方,C++中一般全部 用自己定义的异常类...

低功耗蓝牙开发权威指南第一部分-综述

第一章:什么是低功耗蓝牙技术1.1设备类型1.2设计目标1.3术语第二章:基本概念2.1纽扣电池2.2时间即能量2.3昂贵的内存2.4非对称涉及2.5为成功而涉及2.6凡是皆有状态2.7客户端-服务器...

低功耗蓝牙开发权威指南第二部分-控制器

第五章:物理层5.1背景5.2模拟调制5.3数字调制5.4频段5.5调制5.6射频通道5.7发射功率5.8容限5.9接收机灵敏度5.10通信距离第六章:直接测试模式6.1背景6.2接收机测试6.2.1...

Bluetooth LE(低功耗蓝牙) - 第三部分

在本系列文章的前两篇文章中,我们已经了解了一些关于Bluetooth LE的背景,并建立了一个简单的Activity/Service框架。在这篇文章中,我们将探讨Bluetooth LE的细节以及蓝牙...

Android下低功耗蓝牙使用的部分说明

低功耗蓝牙包括的术语及概念: 如上图所示,使用低功耗蓝牙可以包括多个Profile,一个Profile中有多个Service,一个Service中有多个Characteristic,一个Ch...

Bluetooth LE(低功耗蓝牙) - 第一部分

在写作的时候,谷歌刚刚发布了Android ,而摩托罗拉宣布摩托罗拉360智能手表。磨损的API仍然相当基本的,很好的记录,还有更多的来的,所以我不打算对他们写一个教程(没有,至少!)一个有趣的一件事...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)