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

翻译 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;
}



                    

Ble蓝牙的使用手册

如上图所示,使用低功耗蓝牙可以包括多个Profile,一个Profile中有多个Service,一个Service中有多个Characteristic,一个Characteristic中包括一个val...
  • dodan
  • dodan
  • 2016年07月29日 02:07
  • 2781

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

iOS中蓝牙的实现方案

niOS中提供了4个框架用于实现蓝牙连接 pGameKit.framework(用法简单) ü只能用于iOS设备之间的连接,多用于游戏(比如五子棋对战),从iOS7开始过期 pMulti...

C# 自带的MediaPlayer去掉控制条

mpy.uiMode = "none";

微信小程序低功耗蓝牙

1.简述 蓝牙适配器接口是基础库版本 1.1.0 开始支持。  iOS 微信客户端 6.5.6 版本开始支持,Android 客户端暂不支持  蓝牙总共增加了18个api接口。 2...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

解决小钢炮低功耗蓝牙开发板使用官方库串口输出乱码问题

偶然一次机会,笔者幸运的得到一块STM32F401的蓝牙低功耗开发板,之前一直在用F1系列的进行开发,听说F4的浮点运算很强大,让我迫不及待的打开学习F4的大门,拿到板子的那天兴致勃勃的从ST的官网(...

低功耗蓝牙技术连接的那点事

低功耗蓝牙技术(Bluetooth® low energytechnology)是蓝牙经典标准的演进,专注于为设备间提供可靠、高效且低功耗的链路连接。它具有超低的功耗,满足超长的续航能力。2014...

蓝牙学习之旅——低功耗蓝牙之链路层Link Layer

见协议P2568,BLUETOOTH SPECIFICATION Version 4.2 [Vol 6, Part B]

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:找了很久的低功耗蓝牙程序开发,终于在国外找到了部分资料
举报原因:
原因补充:

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