32feet.net如何在c#中发现附近的蓝牙设备async

时间:2011-10-14 20:07:54

标签: c# asynchronous bluetooth discovery

我正在尝试在C#应用程序中使用32feet.NET蓝牙库来检测附近的设备。我的小应用程序的目的是让PC知道谁在房间里使用人们手机的蓝牙功能。

做这样的事情的最好方法是让我想要“跟踪”的设备连接一次,然后不断检查是否可以通过蓝牙检测到它们。

现在我的问题:

  1. 我是否需要将设备与我的应用程序配对或验证?如何在C#中使用32feet.NET进行此操作?

  2. 如何持续检查范围内的设备并将其与存储的设备进行比较?

  3. 我知道所有这些都可能在库文档中,但是对我来说真的很难读,大多数例子似乎都在VB中,我不知道并且很难翻译成C#(特别是当它来自AsyncCallbacks之类的东西。)

    如果有人能帮助我朝正确的方向努力,我会很高兴的!

2 个答案:

答案 0 :(得分:8)

前面有几点需要注意,我假设你没有在这里处理HID设备,它们通常由操作系统处理。我也刚刚开始使用32feet,我正在使用它来创建蓝牙条码扫描器上串口服务的连接,所以可能有更好的方法满足您的需求,但这可能会指出您正确的方向开始

你需要配对设备,是的。如果你在WinForms应用程序中使用它,那么实际上你可以显示哪种形式处理扫描设备,并允许你选择一个,如下所示:

bool PairDevice()
{
    using (var discoverForm = new SelectBluetoothDeviceDialog())
    {
        if (discoverForm.ShowDialog(this) != DialogResult.OK)
        {
            // no device selected
            return false;
        }

        BluetoothDeviceInfo deviceInfo = discoverForm.SelectedDevice;

        if (!deviceInfo.Authenticated) // previously paired?
        {
            // TODO: show a dialog with a PIN/discover the device PIN
            if (!BluetoothSecurity.PairDevice(deviceInfo.DeviceAddress, myPin)) 
            {
                // not previously paired and attempt to pair failed
                return false;
            }
        }

        // device should now be paired with the OS so make a connection to it asynchronously
        var client = new BluetoothClient();
        client.BeginConnect(deviceInfo.DeviceAddress, BluetoothService.SerialPort, this.BluetoothClientConnectCallback, client);

        return true;
    }
}

void BluetoothClientConnectCallback(IAsyncResult result)
{
    var client = (BluetoothClient)result.State;
    client.EndConnect();

    // get the client's stream and do whatever reading/writing you want to do.
    // if you want to maintain the connection then calls to Read() on the client's stream should block when awaiting data from the device

    // when you're done reading/writing and want to close the connection or the device servers the connection control flow will resume here and you need to tidy up
    client.Close();
}

到目前为止,最好的方法是,如果您的设备正在广播它们可用于连接,则设置BluetoothListener将持续收听广播设备,当找到一个广播设备时,您将会获取一个BluetoothClient实例,您可以使用与第一次配对时相同的实例:

void SetupListener()
{
    var listener = new BluetoothListener(BluetoothService.SerialPort);
    listener.Start();
    listener.BeginAcceptBluetoothClient(this.BluetoothListenerAcceptClientCallback, listener);
}


void BluetoothListenerAcceptClientCallback(IAsyncResult result)
{
    var listener = (BluetoothListener)result.State;

    // continue listening for other broadcasting devices
    listener.BeginAcceptBluetoothClient(this.BluetoothListenerAcceptClientCallback, listener);

    // create a connection to the device that's just been found
    BluetoothClient client = listener.EndAcceptBluetoothClient();

    // the method we're in is already asynchronous and it's already connected to the client (via EndAcceptBluetoothClient) so there's no need to call BeginConnect

    // TODO: perform your reading/writing as you did in the first code sample

    client.Close();
}

不太吸引人,但如果您的设备没有广播连接,则有用,您可以创建一个新的BluetoothClient并要求它返回它可以找到的所有设备:

void ScanForBluetoothClients()
{
    var client = new BluetoothClient();
    BluetoothDeviceInfo[] availableDevices = client.DiscoverDevices(); // I've found this to be SLOW!

    foreach (BluetoothDeviceInfo device in availableDevices)
    {
        if (!device.Authenticated)
        {
            continue;
        }

        var peerClient = new BluetoothClient();
        peerClient.BeginConnect(deviceInfo.DeviceAddress, BluetoothService.SerialPort, this.BluetoothClientConnectCallback, peerClient);
    }
}

答案 1 :(得分:1)

这不是答案,但我无法将这么多代码放在评论部分。更改这些代码行:

//continue listening for other broadcasting devices
listener.BeginAcceptBluetoothClient(this.BluetoothListenerAcceptClientCallback, listener);

// create a connection to the device that's just been found
BluetoothClient client = listener.EndAcceptBluetoothClient();


// create a connection to the device that's just been found
BluetoothClient client = listener.EndAcceptBluetoothClient();

// continue listening for other broadcasting devices
listener.BeginAcceptBluetoothClient(this.BluetoothListenerAcceptClientCallback, listener);

基本上,更改代码序列..
至于每次调用BeginXXXX方法必须有下一个EndXXXX。以上所有代码,您正在尝试通过 开始 “BeginAcceptBluetoothClient”来开始接受蓝牙客户端。

希望你明白。