32feet.net 如何在 C# 中异步发现附近的蓝牙设备

2024-04-15

我正在尝试使用32英尺.NET http://32feet.codeplex.comC# 应用程序中的蓝牙库用于检测附近的设备。我的小应用程序的目的是通过人们手机的蓝牙功能让电脑知道谁在房间里。

执行此类操作的最佳方法是让我想要“跟踪”的设备连接一次,然后不断检查是否可以通过蓝牙检测到它们。

现在我的问题是:

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

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

我知道所有这些可能都在库文档中,但对我来说真的很难阅读,而且大多数示例似乎都是用 VB 编写的,我不知道并且很难将其转换为 C#(尤其是当涉及到AsyncCallbacks 等)。

如果有人能推动我朝正确的方向前进,我会非常高兴!


前面有几点需要注意,我假设您在这里处理的不是 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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

32feet.net 如何在 C# 中异步发现附近的蓝牙设备 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐