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

#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;
}



  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: WPF 是 Windows Presentation Foundation 的简称,是微软开发的一种用于创建 Windows 应用程序的技术。低功耗蓝牙开发是指利用低功耗蓝牙技术进行应用程序的开发。 在 WPF 中,可以通过调用适当的 API 来实现低功耗蓝牙开发。首先,需要使用 BluetoothLEAdvertisementWatcher 类来监测周围的低功耗蓝牙设备广告。这个类可以用于扫描和检测周围的低功耗蓝牙设备。然后,可以使用 BluetoothLEDevice 类与低功耗蓝牙设备进行通信。 在开发过程中,可以通过注册和处理 BluetoothLEAdvertisementWatcher 的事件来实现扫描低功耗蓝牙设备的功能。当扫描到设备时,可以获取设备的广告数据,包括设备的名称、UUID 等信息。根据设备的广告数据可以确定设备的属性和功能。 一旦确定了要通信的设备,可以使用 BluetoothLEDevice 类与设备进行连接和通信。通过订阅设备的服务和特征值,可以实现与设备进行数据交换的功能。借助这些服务和特征值,可以实现设备之间的数据传输、通知和控制等功能。 在 WPF 中进行低功耗蓝牙开发时,还可以利用一些第三方的库来简化开发过程,例如 InTheHand.Net、32feet.NET 等。这些库提供了一些现成的类和方法,可以帮助开发人员更方便地实现低功耗蓝牙开发的功能。 总而言之,WPF 是一种用于创建 Windows 应用程序的技术,可以通过调用适当的 API 实现低功耗蓝牙开发。通过扫描设备广告、连接设备、订阅服务和特征值等方法,可以实现与低功耗蓝牙设备的通信和控制。同时,还可以使用第三方库来简化开发过程。 ### 回答2: WPF是Windows Presentation Foundation的缩写,是一种用于创建Windows应用程序的开发框架。低功耗蓝牙(Low Energy Bluetooth,LE Bluetooth)是一种蓝牙通信技术,用于在低功耗设备之间进行短距离通信。 在WPF中进行低功耗蓝牙开发时,可以使用适当的蓝牙通信库来实现与低功耗蓝牙设备的连接和通信。这些库通常为开发人员提供了一组易于使用的API,用于处理蓝牙设备的搜索、连接、数据传输等功能。开发人员可以使用这些API来创建WPF应用程序,与低功耗蓝牙设备进行交互。 例如,开发人员可以使用WPF的UI元素来创建一个页面,显示低功耗蓝牙设备的列表,并实现搜索功能。用户可以选择一个设备进行连接,并在WPF应用程序中显示设备的状态和数据。开发人员还可以使用WPF的数据绑定功能来实现与低功耗蓝牙设备的数据交互,并根据数据的变化来更新UI界面。 此外,WPF还提供了一些强大的图形和动画功能,可以用于创建吸引人的界面和用户体验。开发人员可以利用这些功能来设计一个美观、易于使用的界面,提升用户对低功耗蓝牙设备的使用满意度。 总而言之,WPF适用于低功耗蓝牙开发,它提供了强大的UI设计和交互功能,与蓝牙通信库结合使用可以很方便地实现与低功耗蓝牙设备的连接和通信功能。通过WPF开发低功耗蓝牙应用程序,可以提供良好的用户体验,满足用户对通信设备的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值