首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法在Windows中以编程方式配对蓝牙设备

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

Stack Overflow用户
提问于 2012-06-25 22:32:37
回答 5查看 13.5K关注 0票数 3

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

感谢您的回复

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-06-25 22:35:39

是的,the reference documentation is available on MSDN

32feet.NET是一个C#包装器,available here。有关配对的信息是here

票数 4
EN

Stack Overflow用户

发布于 2015-08-07 00:11:09

https://msdn.microsoft.com/en-us/library/windows/desktop/cc766819(v=vs.85).aspx是一个诱人的整体简单的解决方案,但是Python在这里没有公开windows蓝牙身份验证API:Python

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

下面是一个项目的代码,用于制作一个带有一个参数的命令行工具,即MAC地址,它使用"Just Works“配对来配对指定的设备。有关使用密钥配对的信息,请参阅注释代码。

代码语言:javascript
运行
复制
#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运行下载的或自定义的命令行工具。为了可靠地做到这一点,我建议使用堆栈溢出问题:How to run python script with elevated privilege on windows

票数 4
EN

Stack Overflow用户

发布于 2013-08-27 21:09:59

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

  1. 制作了一个名为pairtool.exe的windows工具,它可以帮助你与命令行配对。关键接口为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):#找到设备地址addr =查询(DevName) if addr == None: return None #与pairtool.exe配对=r‘%s %s’% ('pairtool.exe',addr) ret = os.system(cmd) if ret <> 0: return None

以下是pairtool.exe的所有代码:

代码语言:javascript
运行
复制
#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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11191332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档