【问题标题】:Pair bluetooth devices to a computer with 32feet .NET Bluetooth library将蓝牙设备与具有 32feet .NET 蓝牙库的计算机配对
【发布时间】:2013-05-24 01:24:02
【问题描述】:

如果您想知道如何使用 32feet.NET 库与蓝牙设备进行通信,请阅读解决方案


我目前正在尝试通过蓝牙在计算机和自建的 .NET Gadgeteer 原型之间进行通信。

Gadgeteer 原型机由主板、电源和蓝牙模块组成。模块处于可发现模式。

计算机上正在运行基于 32feet .NET 蓝牙的自定义蓝牙程序。该程序检测范围内的所有蓝牙设备并尝试与它们配对。但是,目前这不是自动完成的,我必须输入设备的配对码。

如何在不输入配对码的情况下配对设备?

设备已找到,问题出在配对部分。我尝试了很多,但没有找到解决方案...

foreach (BluetoothDeviceInfo device in this.deviceList)
{
    try
    {
        //BluetoothClient client = new BluetoothClient(this.CreateNewEndpoint(localAddress));
        //BluetoothEndPoint ep = this.CreateNewEndpoint(device.DeviceAddress);

        EventHandler<BluetoothWin32AuthenticationEventArgs> handler = new EventHandler<BluetoothWin32AuthenticationEventArgs>(HandleRequests);
        BluetoothWin32Authentication auth = new BluetoothWin32Authentication(handler);

        BluetoothSecurity.PairRequest(device.DeviceAddress, null);
    }
}

此代码块启动配对并且可以正常工作,但 Windows 要求我输入设备的配对代码。我阅读了有关 BluetoothWin32Authentication 以防止这种情况的信息,但我没有做对。

private void HandleRequests(object that, BluetoothWin32AuthenticationEventArgs e)
{
    e.Confirm = true;
}

这是事件处理程序的代码 (http://32feet.codeplex.com/wikipage?title=BluetoothWin32Authentication)

如果您只是想在 SSP 设备连接时允许配对继续进行,那么处理回调并设置 e.Confirm=True 就足够了——但这有点不安全...


我很困惑 -.- 目标是应用程序和 gadgeteer 模块可以双向发送数据,而无需任何用户干预。

在没有用户交互的情况下我无法自动配对设备是真的吗?

如果两台设备已经配对,它们是否可以在没有用户交互的情况下交换数据?

【问题讨论】:

  • 在 Windows 10 中,这不起作用。操作系统提示我“点击以设置设备” - 我从来没有使用上面的代码获得对“HandleRequests”事件处理程序的回调。关于如何绕过此提示的任何想法?
  • 是的,正如 TheJeff 所说,配对在 Windows 10 中不起作用,设备已配对但在“播放设备”中不可见,有什么办法解决吗?
  • 系统要求没有列出 Windows 10,只列出了 Windows 8。也许目前还不可能。
  • 我还在 Windows 8.1 上收到“点击以设置设备”toast 通知。我想知道它是否与蓝牙设置中的“当有新的蓝牙设备想要连接时提醒我”选项有关。
  • 你能解决这个问题吗?我也得到了相同的 TAP 来设置 toast 通知,一旦我点击,它就会正确配对。

标签: c# bluetooth 32feet .net-gadgeteer


【解决方案1】:

我想出了如何解决我的问题,并且我现在对蓝牙连接的了解更多了。如果其他人对此有问题,我会提供我的解决方案。代码示例表示使用 32feet 蓝牙库的蓝牙控制器的 C# 实现。

扫描

这意味着检测到范围内的设备。我的代码:

// mac is mac address of local bluetooth device
BluetoothEndPoint localEndpoint = new BluetoothEndPoint(mac, BluetoothService.SerialPort);
// client is used to manage connections
BluetoothClient localClient = new BluetoothClient(localEndpoint);
// component is used to manage device discovery
BluetoothComponent localComponent = new BluetoothComponent(localClient);
// async methods, can be done synchronously too
localComponent.DiscoverDevicesAsync(255, true, true, true, true, null);
localComponent.DiscoverDevicesProgress += new EventHandler<DiscoverDevicesEventArgs>(component_DiscoverDevicesProgress);
localComponent.DiscoverDevicesComplete += new EventHandler<DiscoverDevicesEventArgs>(component_DiscoverDevicesComplete);

private void component_DiscoverDevicesProgress(object sender, DiscoverDevicesEventArgs e)
{
    // log and save all found devices
    for (int i = 0; i < e.Devices.Length; i++)
    {           
        if (e.Devices[i].Remembered)
        {
            Print(e.Devices[i].DeviceName + " (" + e.Devices[i].DeviceAddress + "): Device is known");
        }
        else
        {
            Print(e.Devices[i].DeviceName + " (" + e.Devices[i].DeviceAddress + "): Device is unknown");
        }
        this.deviceList.Add(e.Devices[i]);         
    }
}

private void component_DiscoverDevicesComplete(object sender, DiscoverDevicesEventArgs e)
{
    // log some stuff
}

配对

这意味着设备与本地蓝牙设备耦合。这需要通过输入双方的代码来完成一次。可以通过代码完成,这样用户甚至不会注意到添加了设备。我为此目的的代码:

// get a list of all paired devices
BluetoothDeviceInfo[] paired = localClient.DiscoverDevices(255, false, true, false, false);
// check every discovered device if it is already paired 
foreach (BluetoothDeviceInfo device in this.deviceList)
{
    bool isPaired = false;
    for (int i = 0; i < paired.Length; i++)
    {
        if (device.Equals(paired[i]))
        {
            isPaired = true;
            break;
        }
    }

    // if the device is not paired, pair it!
    if (!isPaired)
    {
        // replace DEVICE_PIN here, synchronous method, but fast
        isPaired = BluetoothSecurity.PairRequest(device.DeviceAddress, DEVICE_PIN);
        if (isPaired)
        {
            // now it is paired
        }
        else
        {
            // pairing failed
        }
    }
}

正在连接

这意味着建立连接并交换数据。又是一些代码:

// check if device is paired
if (device.Authenticated)
{
    // set pin of device to connect with
    localClient.SetPin(DEVICE_PIN);
    // async connection method
    localClient.BeginConnect(device.DeviceAddress, BluetoothService.SerialPort, new AsyncCallback(Connect), device);
}

// callback
private void Connect(IAsyncResult result)
{
    if (result.IsCompleted)
    {
        // client is connected now :)
    }
}

如果您保持订单扫描、配对、连接,一切都应该正常。要发送或接收数据,请使用BluetoothClientGetStream() 方法。它提供了一个可以操作的网络流。

接收连接

如果您希望其他设备与您的设备连接,您需要监听传入的连接请求。这仅适用于设备之前已配对的情况。我的代码:

BluetoothListener l = new BluetoothListener(LOCAL_MAC, BluetoothService.SerialPort);
l.Start(10);
l.BeginAcceptBluetoothClient(new AsyncCallback(AcceptConnection), l);

void AcceptConnection(IAsyncResult result){
    if (result.IsCompleted){
        BluetoothClient remoteDevice = ((BluetoothListener)result.AsyncState).EndAcceptBluetoothClient(result);    
    }    
}

LOCAL_MAC 替换为有效的蓝牙地址(例如,使用BluetoothAddress.Parse();)。设备连接后,它们可以通过底层流交换消息。如果连接不起作用,则可能存在身份验证问题,因此请尝试在侦听器中设置本地设备 pin (l.SetPin(LOCAL_MAC, MY_PASSWORD);

【讨论】:

  • 您还需要自己的代码在远程设备上运行吗?
  • @xmarshallax 套接字未通过 BeginConnect 方法连接。Socket.connected 状态为 false,这就是 Getstream() 方法无法发送或接收数据的原因。
  • 这是一个问题还是一个陈述?上面的代码对我有用
  • 不应该在调用DiscoverDevicesAsync方法之前注册ProgressComplete事件处理器吗?
  • 对于那些寻找如何找到蓝牙 MacAddress "mac" 的人:stackoverflow.com/questions/1819971/…
猜你喜欢
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多