0

我正在尝试使用 C#/Visual Studio 2010 构建一个 Windows 应用程序,它将执行以下功能(按顺序): 对于蓝牙操作,我正在使用 32feet.Net 库函数。

  1. 找到蓝牙设备并将它们列在列表/组合框中供用户选择。(我想允许用户选择多个设备,因此不去SelectBluetoothDeviceDialog上课选项。)。我可以通过 获取设备列表BluetoothClient.DiscoverDevices(),但是,它不是异步操作。如果可能的话,我想进行异步操作。我阅读了有关BluetoothComponent事件DiscoverDevicesProgressDiscoverDevicesComplete方法的类,DiscoverDevicesAsync但无法使其正常工作。如果可能,请为此分享示例代码。

  2. 用户从列表中选择设备并单击“配对”按钮。到目前为止,我可以通过BluetoothSecurity.PairRequest. 这里没有问题。

  3. 用户现在从“配对”列表中选择一个/多个设备并单击“连接”。在这里,我尝试使用BeginConnect(用于异步操作)和类Connected的方法连接到设备,BluetoothClient但出现以下异常。

System.Net.Sockets.SocketsException:{“提供的参数无效 000319002CC6:0000110100001000800000805f9b34fb”}。

上述异常中的数字是Connected我使用传递的方法所需的 GUID 号BluetoothService.SerialPort。这将失败,因为我的设备预计将连接到 COM7 端口。我不确定如何在特定的 COM 端口连接/配对设备?32feet.Net 库函数甚至可以实现吗?如果是这样,请提供代码示例。

参考注意事项:我已经阅读并尝试实现下面关于 StackOverflow 的文章中解释的代码。但是,由于我的要求(允许用户在 COM 端口配对并连接到多个设备),我无法运行相同的代码。但是,它确实有助于理解这个概念。 32feet.net 如何在 c# 中异步发现附近的蓝牙设备

请您建议处理这种情况的最佳方法。如果我应该尝试使用 32feet.Net 以外的任何其他库/函数,请告诉我。

我的最终目标是从连接的设备读取和写入数据。所以,到目前为止,我只是想通过蓝牙连接到特定的 COM 端口。

问候, 鲁米特

============================ 编辑:答案1的更新信息:

我收到了一个蓝牙设备(补丁),它应该连接到 TOSHIBA VIRTUAL BT COM 端口。如果需要东芝信息以更好地回答问题,我深表歉意。我不熟悉与端口的通信。到目前为止,我知道我需要使用 COM7。我有一个用 C++ 构建的应用程序,它通过蓝牙连接到 COM7 上的同一个补丁。但是,我没有源代码,我被要求在 C# 中实现相同的实用程序。从您的回复中,我可以假设 C++ 应用程序可能正在使用 Windows Sockets 2 吗?

此外,我可以看到一个选项来指定端口(整数值)值,BluetoothEndClient但这也不起作用。因此,我假设该端口不是 COM,而是某种其他类型的端口。

问候, 鲁米特

4

2 回答 2

0

刚才就简单介绍一下。你似乎大部分都在正确的路线上。

1)该错误可能是名称为“InvalidArgument”且代码为 10022(检查SocketException.SocketErrorCode)的错误。

因此,对于 MSFT 蓝牙堆栈,它具有意义(参见http://32feet.codeplex.com/wikipage?title=Errors):

"Plug and Play, driver-stack event, or other error caused failure." 

因此,这意味着连接的硬件级别出现问题,无论是加密狗本身还是这对设备通信错误。你连接的不是Parani模块,是吗?

在蓝牙 UI 中手动配对,然后查看连接是否正常。

2) 你真的想要一个 COM 端口吗?我非常喜欢使用 Sockets 和 System.IO.Streams。COM 端口很难设置,很难维护,也很难使用。只有当您有一个仅使用 COM 端口的第三方程序时,您才需要使用它们。

BluetoothClient 不创建 COM 端口,它使用 Sockets 并返回一个 Stream 来读取和写入。

于 2013-03-13T15:36:09.740 回答
0

我找到了一个使用 WCL 库成功连接到蓝牙设备的解决方案,如下所述。

Step1:将wclClient 的Transpport 属性设置为ctSerial。

client.Transport = wclClientTransport.ctSerial; //This makes the wclClient to listen to the COM ports.

Step2:通过设置client.SerialParams.Port属性指定COM端口号。例如,

client.SerialParams.Port = 5; // For COM5

问候, 鲁米特

于 2013-03-14T18:11:20.857 回答