将蓝牙设备连接到32位.NET蓝牙库的电脑上
如果您想知道如何使用32feet.NET库与蓝牙设备进行通信,请阅读该解决scheme
我目前正试图通过计算机和自build的.NET Gadgeteer原型之间的蓝牙进行通信。
Gadgeteer原型由主板,电源和蓝牙模块组成。 该模块处于可发现模式。
在计算机上运行基于32feet .NET蓝牙的自定义蓝牙程序。 该程序检测范围内的所有蓝牙设备,并尝试与他们配对。 但是,这不是自动完成的,我必须input设备的配对码。
如何配对设备而不input配对码?
设备被find,问题是配对的一部分。 我尝试了很多,但没有find解决scheme…
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要求我input设备的配对代码。 我读了关于BluetoothWin32Authentication以防止这种情况,但我不明白。
private void HandleRequests(object that, BluetoothWin32AuthenticationEventArgs e) { e.Confirm = true; }
这是事件处理程序的代码( http://32feet.codeplex.com/wikipage?title=BluetoothWin32Authentication )
如果你只是想让配对继续,当SSP设备连接,然后处理callback和设置e.Confirm = True将是足够的 – 但是有点不安全…
我很困惑 – 目标是应用程序和gadgeteer模块可以在两个方向上发送数据,而不会有任何用户干扰。
如果没有用户交互,我不能自动配对设备是真的吗?
如果两个设备已经配对,是否可以在没有用户交互的情况下交换数据?
我想出了如何解决我的问题,现在我对蓝牙连接的知识有点大了。 如果别人有问题,我提供我的解决scheme。 代码示例代表了32位蓝牙库的蓝牙控制器的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 }
配对
这意味着设备与本地蓝牙设备耦合。 这需要通过input双方代码来完成一次。 可以通过代码完成,以便用户甚至不会注意到已添加设备。 我的代码为此目的:
// 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 } } }
连
这意味着build立数据的连接和交换。 再一些代码:
// 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 :) } }
如果你保持订单扫描,配对,连接,一切都应该正常工作。 要发送或接收数据,请使用BluetoothClient
的GetStream()
方法。 它提供了可以被操纵的networkingstream。
接收连接
如果您希望其他设备连接到您的设备,则需要监听传入的连接请求。 这只在设备已经配对之前有效。 我的代码:
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
replace为有效的BluetoothAddress(例如,通过使用BluetoothAddress.Parse();
)。 设备连接后,他们可以通过基础stream交换消息。 如果连接不起作用,可能会有身份validation问题,所以请尝试在侦听器中设置本地设备引脚( l.SetPin(LOCAL_MAC, MY_PASSWORD);