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

时间:2012-06-25 14:32:37

标签: windows bluetooth

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

感谢回复

5 个答案:

答案 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)

我遇到同样的问题,我已经解决了问题,也许你可以尝试一下:

  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
    
  3. 这里是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实用程序。