This project is forked from: https://github.com/Plutoberth/SonyHeadphonesClient for the purpose of creating a Bluetooth Plugin for Unity Windows & Editor (in Windows). I appreciate the work of the base repo since they saved a lot of time for me (and hopefully for many others).
I edited the BLE device detection part slightly, and converted the project into a lightweight DLL project so that other developers can add the BLE feauture their projects easily. One can use CMake to create the dll directly.
mkdir build
cd build
cmake ../
cmake --build .
that's all, you can use WindowsBluetoothAPI.h header before importing the DLL. Here is a simple test code;
#include <Windows.h>
#include <iostream>
#include <vector>
#include "WindowsBluetoothAPI.h"
// Function pointer declarations using decltype
decltype(&InitBluetooth) ptrInitBluetooth;
decltype(&DisposeBluetooth) ptrDisposeBluetooth;
decltype(&GetDevices) ptrGetDevices;
decltype(&ConnectTo) ptrConnectTo;
decltype(&Disconnect) ptrDisconnect;
decltype(&Send) ptrSend;
decltype(&Receive) ptrReceive;
bool loadBluetoothFunctions() {
HMODULE hModule = LoadLibrary(TEXT("___PATH_TO_YOUR_DLL___"));
if (!hModule) {
std::cerr << "Failed to load the DLL." << std::endl;
return false;
}
// Use decltype to ensure the correct function types
ptrInitBluetooth = reinterpret_cast<decltype(ptrInitBluetooth)>(GetProcAddress(hModule, "InitBluetooth"));
ptrDisposeBluetooth = reinterpret_cast<decltype(ptrDisposeBluetooth)>(GetProcAddress(hModule, "DisposeBluetooth"));
ptrGetDevices = reinterpret_cast<decltype(ptrGetDevices)>(GetProcAddress(hModule, "GetDevices"));
ptrConnectTo = reinterpret_cast<decltype(ptrConnectTo)>(GetProcAddress(hModule, "ConnectTo"));
ptrDisconnect = reinterpret_cast<decltype(ptrDisconnect)>(GetProcAddress(hModule, "Disconnect"));
ptrSend = reinterpret_cast<decltype(ptrSend)>(GetProcAddress(hModule, "Send"));
ptrReceive = reinterpret_cast<decltype(ptrReceive)>(GetProcAddress(hModule, "Receive"));
// Check if all functions were loaded successfully
if (!ptrInitBluetooth || !ptrDisposeBluetooth || !ptrGetDevices || !ptrConnectTo ||
!ptrDisconnect || !ptrSend || !ptrReceive) {
std::cerr << "Failed to load one or more functions." << std::endl;
FreeLibrary(hModule);
return false;
}
return true;
}
int main() {
if (!loadBluetoothFunctions()) {
std::cerr << "Bluetooth functions could not be loaded." << std::endl;
return 1;
}
// Example usage of the functions
if (ptrInitBluetooth() == BT_SUCCESS) {
std::cout << "Bluetooth initialized successfully." << std::endl;
}
else {
std::cerr << "Failed to initialize Bluetooth." << std::endl;
return 1;
}
BluetoothDevice* devices = NULL;
int size = 0;
ptrGetDevices(&devices, &size);
for (int i = 0; i < size; i++) {
std::cout << "Device ID: " << devices[i].id << std::endl;
std::cout << "Device Name: " << devices[i].name << std::endl;
}
int deviceId;
std::cout<<"Enter the device ID to connect: ";
std::cin>>deviceId;
if (ptrConnectTo(deviceId) == BT_SUCCESS) {
std::cout << "Connected to device with ID: " << deviceId << std::endl;
}
else {
std::cerr << "Failed to connect to device with ID: " << deviceId << std::endl;
return 1;
}
char* buffer = new char[1024];
int buffer_size = 1024;
std::cout<<"enter message to send: ";
std::cin>>buffer;
if (ptrSend(&buffer, buffer_size) == BT_SUCCESS) {
std::cout << "message sent successfully." << std::endl;
}
else {
std::cerr << "failed to send message." << std::endl;
return 1;
}
while (true) {
int receivedBytes = 0;
char* receivedBuffer = new char[1024];
if (ptrReceive(&receivedBuffer, 1024, &receivedBytes) == BT_SUCCESS) {
std::cout << "Received message: " << receivedBuffer << std::endl;
}
else {
std::cerr << "Failed to receive message." << std::endl;
return 1;
}
}
// Clean up and close
if (ptrDisposeBluetooth() == BT_SUCCESS) {
std::cout << "Bluetooth disposed successfully." << std::endl;
}
else {
std::cerr << "Failed to dispose Bluetooth." << std::endl;
return 1;
}
return 0;
}