有一个问题: 有没有办法以编程方式在Windows中配对蓝牙设备? (c ++,c#)
感谢回复
答案 0 :(得分:3)
是的,the reference documentation is available on MSDN。
32feet.NET是一个C#包装器,available here。有关配对的信息是here。
答案 1 :(得分:3)
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”配对将指定的设备配对。请参阅注释代码以使用密钥配对。
foo
您可以尝试使用此预先制作的解决方案,而不是自己创建它: http://bluetoothinstaller.com/bluetooth-command-line-tools/ 它对我的特定解决方案不起作用。
然后,您需要以管理员身份从python运行下载的或自定义的命令行工具。为了可靠地执行此操作,我建议使用stackoverflow问题: How to run python script with elevated privilege on windows
答案 2 :(得分: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);
}
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;
}
答案 3 :(得分:0)
您可以使用MSDN Bluetooth Functions下记录的功能。
这些可以编程方式搜索和配对蓝牙设备。
答案 4 :(得分:0)
Microsoft引入了Windows.Devices.Enumeration API,该API可用于UWP和传统应用程序,这使蓝牙设备的配对非常容易(有关详细信息,请查看the official C# and C++ example)。据我了解,内置“蓝牙和其他设备” UI对话框使用的API。作为使用此API可以编写哪种控制台实用程序的示例,您可以看一下我的控制台BluetoothDevicePairing实用程序。