c# - ejemplo - 32feet net install
Emparejamiento de Bluetooth(SSP) en Windows 10 con 32feet.NET (1)
Acabo de comenzar un proyecto que requiere que conecte una tableta con Windows 10 con otro dispositivo Bluetooth.
Decidí comenzar con una aplicación sencilla de formularios de Windows para familiarizarme con el proceso. Agregué el paquete NuGet de 32feet.NET a mi solución, y rápidamente tuve éxito en la búsqueda de dispositivos y en el llenado de un cuadro de lista.
client = new BluetoothClient();
devices = client.DiscoverDevices();
if (devices.Length > 0)
{
foreach (var device in devices)
{
lstBTDevices.Items.Add(device.DeviceName);
}
}
else
{
MessageBox.Show("Unable to detect any bluetooth devices");
}
Luego agregué un controlador de eventos para poder seleccionar un dispositivo detectado e intentar vincularlo.
private void LstBTDevices_SelectedIndexChanged(object sender, EventArgs e)
{
BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex];
if (MessageBox.Show(String.Format("Would you like to attempt to pair with {0}?", selectedDevice.DeviceName), "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
if (BluetoothSecurity.PairRequest(selectedDevice.DeviceAddress, "123456"))
{
MessageBox.Show("We paired!");
}
else
{
MessageBox.Show("Failed to pair!");
}
}
}
En mi PC de escritorio con Windows7 con un adaptador Bluetooth 2.0 barato, esto hace que aparezca una ventana emergente en mi teléfono solicitando que ingrese el código PIN. Cuando entro en "123456" el emparejamiento es exitoso.
Sin embargo, aquí es donde comienza el problema. Luego tomo mi aplicación y la ejecuto en mi tableta Windows10, y ahora, cuando selecciono mi teléfono, aparece una ventana emergente en mi teléfono con un código PIN aleatorio de 6 dígitos y un mensaje que debe coincidir con lo que se muestra en la pantalla de mi tableta. , con los botones de par / cancelar como las opciones. Al presionar cualquiera de los botones se produce un error.
¿Es esto algo que estoy haciendo mal? Un controlador no compatible con 32feet.NET?
Cualquier consejo sería muy apreciado.
ACTUALIZACIÓN: El comentario de bare_metal me ha ayudado a ir un poco más lejos.
Agregué un controlador de eventos BluetoothWin32Authentication y agregué un botón para iniciar un emparejamiento SSP:
EventHandler<BluetoothWin32AuthenticationEventArgs> authHandler = new EventHandler<BluetoothWin32AuthenticationEventArgs>(handleAuthRequests);
BluetoothWin32Authentication authenticator = new BluetoothWin32Authentication(authHandler);
private void btnPairSSP_Click(object sender, EventArgs e)
{
BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex];
if (MessageBox.Show(String.Format("Would you like to attempt to pair with {0}?", selectedDevice.DeviceName), "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
Task t = new Task(PairBluetoothTask);
t.Start();
}
}
private void PairBluetoothTask()
{
BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex];
if (BluetoothSecurity.PairRequest(selectedDevice.DeviceAddress, null))
{
MessageBox.Show("We paired!");
}
else
{
MessageBox.Show("Failed to pair!");
}
}
private void handleAuthRequests(object sender, BluetoothWin32AuthenticationEventArgs e)
{
switch (e.AuthenticationMethod)
{
case BluetoothAuthenticationMethod.Legacy:
MessageBox.Show("Legacy Authentication");
break;
case BluetoothAuthenticationMethod.OutOfBand:
MessageBox.Show("Out of Band Authentication");
break;
case BluetoothAuthenticationMethod.NumericComparison:
if(e.JustWorksNumericComparison == true)
{
MessageBox.Show("Just Works Numeric Comparison");
}
else
{
MessageBox.Show("Show User Numeric Comparison");
if (MessageBox.Show(e.NumberOrPasskeyAsString, "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
e.Confirm = true;
}
else
{
e.Confirm = false;
}
}
break;
case BluetoothAuthenticationMethod.PasskeyNotification:
MessageBox.Show("Passkey Notification");
break;
case BluetoothAuthenticationMethod.Passkey:
MessageBox.Show("Passkey");
break;
default:
MessageBox.Show("Event handled in some unknown way");
break;
}
}
Cuando inicio el emparejamiento desde mi teléfono, esto funciona bien, el evento se activa, el cuadro de mensaje aparece y el emparejamiento es exitoso.
Sin embargo, cuando inicio el emparejamiento desde la tableta, el controlador de eventos nunca se activa, por lo que el emparejamiento falla.
Creo que el problema aquí es que la biblioteca de 32 pies se basa en el emparejamiento heredado, por lo que necesita conocer el pin del dispositivo al que se está conectando o suministrarlo con un nulo para obtener una ventana emergente para ingresar un pin. Es posible que ese cuadro de diálogo no haya llegado a la nueva versión de Windows. No estoy seguro de esto, pero la documentación de la función nativa que la biblioteca de 32 pies envuelve, dice que se llame a otro método si se está desarrollando para una versión más nueva que Vista.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa362770(v=vs.85).aspx
Desde mi búsqueda en las fuentes descompiladas de 32 pies, puede parecer que 32 pies no es compatible con SSP, solo otros - pero eso puede ser que las implementaciones de la pila de bluetooth suministradas necesiten ser actualizadas, o usted debe crear su propia cuenta. no es seguro.
Si lo desea, puede buscar en las bibliotecas suministradas por Microsoft para .NET en lugar de esta tercera parte. Pude usar su ejemplo de Github para conectarse con éxito y vincularme con todos mis dispositivos.
https://msdn.microsoft.com/en-us/library/windows/apps/mt168401.aspx