我找到了解决我的问题的方法,现在我对蓝牙连接的知识更加深入了一点。如果其他人遇到问题,我可以提供我的解决方案。下面的代码示例展示了使用32feet蓝牙库实现蓝牙控制器的C#实现。
扫描
这意味着检测到了范围内的设备。我的代码:
BluetoothEndPoint localEndpoint = new BluetoothEndPoint(mac, BluetoothService.SerialPort);
BluetoothClient localClient = new BluetoothClient(localEndpoint);
BluetoothComponent localComponent = new BluetoothComponent(localClient);
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)
{
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)
{
}
配对
这意味着设备与本地蓝牙设备进行了配对。需要通过输入双方的代码进行一次操作。可以通过代码完成此操作,以便用户甚至无需注意到添加了设备。我用于此目的的代码:
BluetoothDeviceInfo[] paired = localClient.DiscoverDevices(255, false, true, false, false);
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 (!isPaired)
{
isPaired = BluetoothSecurity.PairRequest(device.DeviceAddress, DEVICE_PIN);
if (isPaired)
{
}
else
{
}
}
}
连接
这意味着建立连接并交换数据。以下是一些代码:
if (device.Authenticated)
{
localClient.SetPin(DEVICE_PIN);
localClient.BeginConnect(device.DeviceAddress, BluetoothService.SerialPort, new AsyncCallback(Connect), device);
}
private void Connect(IAsyncResult result)
{
if (result.IsCompleted)
{
}
}
如果您保持扫描、配对、连接的顺序,一切都应该正常工作。要发送或接收数据,请使用BluetoothClient
的GetStream()
方法。它提供一个可以操作的网络流。
接收连接
如果您希望另一个设备与您的设备连接,您需要监听传入的连接请求。这仅在设备之前已经配对时才有效。我的代码:
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);
}
}
请用有效的 BluetoothAddress 替换 LOCAL_MAC
(例如通过使用 BluetoothAddress.Parse();
)。设备连接后,它们可以通过底层流交换消息。如果连接不起作用,则可能存在身份验证问题,请尝试在监听器中设置本地设备 PIN (l.SetPin(LOCAL_MAC, MY_PASSWORD);
)。