当前位置: 首页 > 知识库问答 >
问题:

Windows 10上的蓝牙配对(SSP),32英尺。NET

令狐昂雄
2023-03-14

我刚刚开始了一个项目,需要将Windows 10平板电脑与另一个蓝牙设备配对。

我决定从一个简单的windows窗体应用程序开始,以熟悉这个过程。我加了32英尺。NET NuGet包,并很快在搜索设备和填充列表框方面取得了成功。

client = new BluetoothClient();
devices = client.DiscoverDevices();
if (devices.Length > 0)
{
    foreach (var device in devices)
    {
        lstBTDevices.Items.Add(device.DeviceName);
    }
}
else
{
    MessageBox.Show("Unable to detect any bluetooth devices");
}

然后,我添加了一个事件处理程序,以便可以选择检测到的设备并尝试与之配对。

    private void LstBTDevices_SelectedIndexChanged(object sender, EventArgs e)
    {
        BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex];
        if (MessageBox.Show(String.Format("Would you like to attempt to pair with {0}?", selectedDevice.DeviceName), "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            if (BluetoothSecurity.PairRequest(selectedDevice.DeviceAddress, "123456"))
            {
                MessageBox.Show("We paired!");
            }
            else
            {
                MessageBox.Show("Failed to pair!");
            }
        }
    }

在装有廉价蓝牙2.0适配器的Windows7台式电脑上,我的手机上会出现一个弹出窗口,要求我输入pincode。当我输入“123456”时,配对成功。

然而,这就是问题的开始。然后,我拿起我的应用程序并在我的Windows10平板电脑上运行它,现在当我选择我的手机时,它会导致手机上出现一个带有随机6位拼码的弹出窗口,并显示一条消息,表明它应该与我的平板电脑屏幕上显示的内容相匹配,并选择配对/取消按钮。按下任一按钮都会导致失败。

这是我做错了什么吗?一个没有32英尺支持的驱动程序。NET?

任何建议都将不胜感激。

更新:bare_metal的评论帮助我更进一步

我添加了BluetoothWin32Authentication事件处理程序,并添加了一个按钮来启动SSP配对:

EventHandler<BluetoothWin32AuthenticationEventArgs> authHandler = new EventHandler<BluetoothWin32AuthenticationEventArgs>(handleAuthRequests);
BluetoothWin32Authentication authenticator = new BluetoothWin32Authentication(authHandler);

    private void btnPairSSP_Click(object sender, EventArgs e)
    {
        BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex];
        if (MessageBox.Show(String.Format("Would you like to attempt to pair with {0}?", selectedDevice.DeviceName), "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            Task t = new Task(PairBluetoothTask);
            t.Start();
        }
    }

    private void PairBluetoothTask()
    {
        BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex];
        if (BluetoothSecurity.PairRequest(selectedDevice.DeviceAddress, null))
        {
            MessageBox.Show("We paired!");
        }
        else
        {
            MessageBox.Show("Failed to pair!");
        }

    }

    private void handleAuthRequests(object sender, BluetoothWin32AuthenticationEventArgs e)
    {
        switch (e.AuthenticationMethod)
        {
            case BluetoothAuthenticationMethod.Legacy:
                MessageBox.Show("Legacy Authentication");
                break;

            case BluetoothAuthenticationMethod.OutOfBand:
                MessageBox.Show("Out of Band Authentication");
                break;

            case BluetoothAuthenticationMethod.NumericComparison:
                if(e.JustWorksNumericComparison == true)
                {
                    MessageBox.Show("Just Works Numeric Comparison");
                }
                else
                {
                    MessageBox.Show("Show User Numeric Comparison");
                    if (MessageBox.Show(e.NumberOrPasskeyAsString, "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        e.Confirm = true;
                    }
                    else
                    {
                        e.Confirm = false;
                    }                        
                }
                break;

            case BluetoothAuthenticationMethod.PasskeyNotification:
                MessageBox.Show("Passkey Notification");
                break;

            case BluetoothAuthenticationMethod.Passkey:
                MessageBox.Show("Passkey");
                break;

            default:
                MessageBox.Show("Event handled in some unknown way");
                break;

        }
    }

当我从手机启动配对时,这一切正常,事件被触发,消息框弹出,配对成功。

但是,当我从平板电脑启动配对时,永远不会触发事件处理程序,因此配对失败。

共有1个答案

从烈
2023-03-14

我认为这里的问题是,32英尺库是围绕传统配对构建的,因此您要么需要知道所连接设备的pin,要么为其提供null以获得一个弹出窗口来输入pin。这个对话框可能没有进入新版本的windows——对此不确定,但32英尺库包装的本机函数的文档表示,如果为比Vista更新的版本开发,可以调用另一种方法

https://msdn.microsoft.com/en-us/library/windows/desktop/aa362770(v=vs.85). aspx

从我浏览32feet的反编译源的研究来看,可能32feet不支持SSP,只支持其他功能-但这可能只是因为提供的蓝牙堆栈实现需要更新-或者你需要创建自己的-我也不确定。

您可能需要查看Microsoft提供的库。NET而不是这个第三方,我能够使用他们在Github中的示例成功连接并与我的所有设备配对。

https://msdn.microsoft.com/en-us/library/windows/apps/mt168401.aspx

https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/DeviceEnumerationAndPairing/cs

 类似资料:
  • 如果您想知道如何使用32英尺。NET库与蓝牙设备通信,请阅读解决方案 我目前正在尝试通过蓝牙在电脑和自建电脑之间进行通信。NET小工具原型。 Gadgeteer原型由主板、电源和蓝牙模块组成。模块处于可发现模式。 电脑上有一个基于32英尺的自定义蓝牙程序。NET Bluetooth正在运行。该程序检测范围内的所有蓝牙设备,并尝试与它们配对。然而,目前这并不是自动完成的,我必须输入设备的配对代码。

  • 嗨,我要开发一个应用程序,所以我有一个设备(服务器)与3个客户端。我做了所有的验证,打开蓝牙,找到设备,所有的工作都很好。但当我要连接一个设备时,我不知道会发生什么。 我正在使用下一个代码,当我单击一个我想连接它的设备时。我只有我的应用程序在母设备中。 这里我有一个问题,如果它没有配对会发生什么?如果我尝试连接,它会自动配对吗? 我的UUID是:“00001101-0000-1000-8000-0

  • 我正在Visual Studio 2015中用C语言为运行Windows IoT Core的Raspberry PI 2设备开发。 对于我的应用程序,我需要配对和取消配对蓝牙设备 我可以获得配对/未配对/所有蓝牙设备的列表吗<类似于内置管理网站的蓝牙页面(http://[设备IP]:8080/Bluetooth.htm) 我找到了一个例子(https://github.com/Microsoft/

  • 来自蓝牙客户端示例http://people.csail.mit.edu/albert/bluez-intro/x502.html,似乎只要我有设备的蓝牙MAC地址,我就可以简单地连接到远程蓝牙插座。 如果我可以简单地连接到远程蓝牙设备,我想知道蓝牙配对到底做什么。什么时候真正需要配对? 更新: 蓝牙配对是如何工作的?,配对的最终结果似乎是加密密钥存储在两侧。我假设,当您打开远程套接字连接时,调用

  • 蓝牙配对到底是如何工作的?在配对过程中,每个设备之间的通信是什么? 有人告诉我,如果您想与设备B配对: > 这似乎是不准确的,所以有人能够进一步扩展或实际解释如何/什么是沟通的结果,以成功配对的设备吗? 我曾考虑将这些研究中的一些纳入大学的最后一年项目中,但至少需要先了解一些蓝牙编程配对的知识。 如果您能帮助描述这些初始通信是如何工作的,我们将不胜感激。 在我的研究中,我听说过“停车模式”和“被动

  • BLE外围模拟器应用程序与Web蓝牙示例相结合,是开发人员的巨大资源。 一旦设备配对,有没有办法通过Web蓝牙绕过配对屏幕直接进入应用程序?