有没有办法在Windows中以编程方式配对蓝牙设备

有一个问题:有没有办法在Windows中以编程方式配对蓝牙设备? (c ++,c#)

感谢回复

是的, 参考文档在MSDN上可用 。

32feet.NET是一个C#包装, 可在这里 。 关于配对的信息在这里 。

Python是一个诱人的,总体上简单的解决方案,但是PyBlueZ并没有在这里公开Windows蓝牙认证API: https ://msdn.microsoft.com/en-us/library/windows/desktop/cc766819(v=vs.85 )。 ASPX

解决这个问题的一种方法是创建一个命令行工具,并通过Python使用它。 要为Windows创建命令行工具,请使用Visual Studio并将必要的库添加到项目链接器属性中:Bthprops.lib和ws2_32.lib

下面是一个项目的代码,用于创建一个具有1个参数(MAC地址)的命令行工具,它使用“Just Works”配对将指定的设备配对。 请参阅使用密码配对的注释代码。

#include "stdafx.h" #include <initguid.h> #include <winsock2.h> #include <BluetoothAPIs.h> #include <ws2bth.h> BOOL WINAPI BluetoothAuthCallback(LPVOID pvParam, PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS pAuthCallbackParams); int _tmain(int argc, _TCHAR* argv[]) { SOCKADDR_BTH sa = { 0 }; int sa_len = sizeof(sa); DWORD dwRet; BLUETOOTH_DEVICE_INFO btdi = { 0 }; HBLUETOOTH_AUTHENTICATION_REGISTRATION hRegHandle = 0; // initialize windows sockets WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 0); if (WSAStartup(wVersionRequested, &wsaData) != 0) { ExitProcess(2); } // parse the specified Bluetooth address if (argc < 2) { fprintf(stderr, "usage: csbtpair <addr>\n" "\n addr must be in the form (XX:XX:XX:XX:XX:XX)"); ExitProcess(2); } if (SOCKET_ERROR == WSAStringToAddress(argv[1], AF_BTH, NULL, (LPSOCKADDR)&sa, &sa_len)) { ExitProcess(2); } // setup device info btdi.dwSize = sizeof(BLUETOOTH_DEVICE_INFO); btdi.Address.ullLong = sa.btAddr; btdi.ulClassofDevice = 0; btdi.fConnected = false; btdi.fRemembered = false; btdi.fAuthenticated = false; // register authentication callback. this prevents UI from showing up. dwRet = BluetoothRegisterForAuthenticationEx(&btdi, &hRegHandle, &BluetoothAuthCallback, NULL); if (dwRet != ERROR_SUCCESS) { fprintf(stderr, "BluetoothRegisterForAuthenticationEx ret %d\n", dwRet); ExitProcess(2); } // authenticate device (will call authentication callback) AUTHENTICATION_REQUIREMENTS authreqs = MITMProtectionNotRequired; fprintf(stderr, "BluetoothAuthReqs = %d\n", authreqs); dwRet = BluetoothAuthenticateDeviceEx(NULL, NULL, &btdi, NULL, authreqs); if (dwRet != ERROR_SUCCESS) { fprintf(stderr, "BluetoothAuthenticateDevice ret %d\n", dwRet); if (dwRet == ERROR_CANCELLED) { fprintf(stderr, "Cancelled"); } else if (dwRet == ERROR_INVALID_PARAMETER) { fprintf(stderr, "Invalid Parameter"); } else if (dwRet == ERROR_NO_MORE_ITEMS) { fprintf(stderr, "Already paired!"); } } fprintf(stderr, "pairing finish\n"); ExitProcess(0); return 0; } // Authentication callback BOOL WINAPI BluetoothAuthCallback(LPVOID pvParam, PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS pAuthCallbackParams) { DWORD dwRet; fprintf(stderr, "BluetoothAuthCallback 0x%x\n", pAuthCallbackParams->deviceInfo.Address.ullLong); BLUETOOTH_AUTHENTICATE_RESPONSE AuthRes; AuthRes.authMethod = pAuthCallbackParams->authenticationMethod; fprintf(stderr, "Authmethod %d\n", AuthRes.authMethod); // Check to make sure we are using numeric comparison (Just Works) if (AuthRes.authMethod == BLUETOOTH_AUTHENTICATION_METHOD_NUMERIC_COMPARISON) { fprintf(stderr, "Numeric Comparison supported\n"); } AuthRes.bthAddressRemote = pAuthCallbackParams->deviceInfo.Address; AuthRes.negativeResponse = FALSE; // Commented out code is used for pairing using the BLUETOOTH_AUTHENTICATION_METHOD_PASSKEY method //memcpy_s(AuthRes.pinInfo.pin, sizeof(AuthRes.pinInfo.pin), L"1234", 0); //AuthRes.pinInfo.pinLength = 0; // Respond with numerical value for Just Works pairing AuthRes.numericCompInfo.NumericValue = 1; // Send authentication response to authenticate device dwRet = BluetoothSendAuthenticationResponseEx(NULL, &AuthRes); if (dwRet != ERROR_SUCCESS) { fprintf(stderr, "BluetoothSendAuthenticationResponseEx ret %d\n", dwRet); if (dwRet == ERROR_CANCELLED) { fprintf(stderr, "Bluetooth device denied passkey response or communicatino problem.\n"); } else if (dwRet == E_FAIL) { fprintf(stderr, "Device returned a failure code during authentication.\n"); } else if (dwRet == 1244) { fprintf(stderr, "Not authenticated\n"); } } else { fprintf(stderr, "BluetoothAuthCallback finish\n"); } return 1; // This value is ignored } 

代替自己创建这个,你可能想要尝试这个预先制作的解决方案: http : //bluetoothinstaller.com/bluetooth-command-line-tools/它不适用于我的特定解决方案。

然后,您将需要以管理员身份从python运行您的下载或自定义命令行工具。 要做到这一点可靠,我建议stackoverflow的问题: 如何在Windows上运行与提升特权的Python脚本

您可以使用MSDN蓝牙功能下记录的功能 。

这些可以编程方式搜索和配对蓝牙设备。

我遇到同样的问题,我已经解决了这个问题,也许你可以试试看:

  1. 做一个名为pairtool.exe的Windows工具,它可以帮助你与命令行配对。 关键的api是BluetoothAuthenticateDevice,请参考功能文件

     dwRet = BluetoothAuthenticateDevice(NULL, NULL, &btdi, L"1234", 4); if(dwRet != ERROR_SUCCESS) { fprintf(stderr, "BluetoothAuthenticateDevice ret %d\n", dwRet); ExitProcess(2); } 
  2. python代码:

     def connect2Btdev(devName): #found the device addr addr = inquiry(devName) if addr == None: return None #pairing with pairtool.exe cmd=r'%s %s' % ('pairtool.exe',addr) ret = os.system(cmd) if ret <> 0: return None 

这里是所有pairtool.exe的代码:

 #include "stdafx.h" #include <initguid.h> #include <winsock2.h> #include <BluetoothAPIs.h> #include <ws2bth.h> bool BluetoothAuthCallback(LPVOID pvParam, PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS pAuthCallbackParams) { DWORD dwRet; fprintf(stderr, "BluetoothAuthCallback 0x%x\n", pAuthCallbackParams->deviceInfo.Address.ullLong); dwRet = BluetoothSendAuthenticationResponse(NULL, &(pAuthCallbackParams->deviceInfo), L"1234"); if(dwRet != ERROR_SUCCESS) { fprintf(stderr, "BluetoothSendAuthenticationResponse ret %d\n", dwRet); ExitProcess(2); return 1; } fprintf(stderr, "BluetoothAuthCallback finish\n"); ExitProcess(0); return 1; } int _tmain(int argc, _TCHAR* argv[]) { SOCKADDR_BTH sa = { 0 }; int sa_len = sizeof(sa); DWORD dwRet; BLUETOOTH_DEVICE_INFO btdi = {0}; HBLUETOOTH_AUTHENTICATION_REGISTRATION hRegHandle = 0; // initialize windows sockets WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD( 2, 0 ); if( WSAStartup( wVersionRequested, &wsaData ) != 0 ) { ExitProcess(2); } // parse the specified Bluetooth address if( argc < 2 ) { fprintf(stderr, "usage: rfcomm-client <addr>\n" "\n addr must be in the form (XX:XX:XX:XX:XX:XX)"); ExitProcess(2); } if( SOCKET_ERROR == WSAStringToAddress( argv[1], AF_BTH, NULL, (LPSOCKADDR) &sa, &sa_len ) ) { ExitProcess(2); } //注册回调函数btdi.dwSize = sizeof(BLUETOOTH_DEVICE_INFO); btdi.Address.ullLong = sa.btAddr; btdi.ulClassofDevice = 0; btdi.fConnected = false; btdi.fRemembered = false; btdi.fAuthenticated = false; dwRet = BluetoothRegisterForAuthenticationEx(&btdi, &hRegHandle, &BluetoothAuthCallback, NULL); if(dwRet != ERROR_SUCCESS) { fprintf(stderr, "BluetoothRegisterForAuthenticationEx ret %d\n", dwRet); ExitProcess(2); } dwRet = BluetoothAuthenticateDevice(NULL, NULL, &btdi, L"1234", 4); if(dwRet != ERROR_SUCCESS) { fprintf(stderr, "BluetoothAuthenticateDevice ret %d\n", dwRet); ExitProcess(2); } Sleep(1000); fprintf(stderr, "pairing finish\n"); ExitProcess(0); return 0; }