将蓝牙设备与具有32英尺.NET蓝牙库的计算机配对

xma*_*lax 26 c# bluetooth .net-gadgeteer 32feet

如果您想知道如何使用32feet.NET库与蓝牙设备通信,请阅读解决方案


我目前正在尝试通过蓝牙在计算机和自建的.NET Gadgeteer原型之间进行通信.

Gadgeteer原型包括主板,电源和蓝牙模块.模块处于可发现模式.

在计算机上,基于32feet .NET蓝牙的自定义蓝牙程序正在运行.程序检测范围内的所有蓝牙设备并尝试与它们配对.但是,目前还没有自动完成,我必须输入设备的配对代码.

如何在不输入配对代码的情况下配对设备?

找到设备,问题是配对部分.我做了很多实验,但没有找到解决方案......

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码块启动配对并且它可以工作,但Windows要求我输入设备的配对代码.我读到了关于BluetoothWin32Authentication以防止这种情况,但我没有把它弄好.

private void HandleRequests(object that, BluetoothWin32AuthenticationEventArgs e)
{
    e.Confirm = true;
}
Run Code Online (Sandbox Code Playgroud)

这是事件处理程序的代码(http://32feet.codeplex.com/wikipage?title=BluetoothWin32Authentication)

如果你只想让SSP设备连接时允许配对继续,那么处理回调和设置e.Confirm = True就足够了 - 但这有点不安全......


我很困惑-.-目标是应用程序和gadgeteer模块可以在没有任何用户干扰的情况下向两个方向发送数据.

没有用户交互,我无法自动配对设备吗?

是否真的如果两个设备已经配对,他们可以在没有用户交互的情况下交换数据?

xma*_*lax 43

我想出了如何解决我的问题,而且我对蓝牙连接的了解现在有点大了.如果其他人有问题,我提供我的解决方案.代码示例代表具有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
}
Run Code Online (Sandbox Code Playgroud)

配对

这意味着设备与本地蓝牙设备耦合.这需要通过输入双方的代码来完成一次.可以通过代码完成,这样用户甚至不会注意到已添加设备.我的代码用于此目的:

// 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着建立连接和交换数据.再一些代码:

// 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 :)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您保持订单扫描,配对,连接,一切都应该正常工作.要发送或接收数据,请使用GetStream()方法BluetoothClient.它提供了可以操作的网络流.

接收连接

如果您希望其他设备与您的设备连接,则需要侦听传入的连接请求.这仅适用于之前已配对的设备.我的代码:

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);    
    }    
}
Run Code Online (Sandbox Code Playgroud)

替换LOCAL_MAC为有效的BluetoothAddress(例如,使用BluetoothAddress.Parse();).设备连接后,它们可以通过底层流交换消息.如果连接不起作用,则可能存在身份验证问题,因此请尝试在侦听器中设置本地设备引脚(l.SetPin(LOCAL_MAC, MY_PASSWORD);

  • 对于那些寻找如何找到蓝牙 MacAddress“mac”的人:http://stackoverflow.com/questions/1819971/how-to-get-bluetooth-mac-address-from-local-pc (3认同)
  • @xmarshallax套接字未通过BeginConnect方法进行连接.Socket.connected状态为false,这就是为什么Getstream()方法将无法用于发送或接收数据的原因。 (2认同)
  • 在调用`DiscoverDevicesAsync`方法之前,不应该注册`Progress`和`Complete`事件处理程序吗? (2认同)