c# - inalambrica - Conecta dispositivos bluetooth a una computadora con la biblioteca Bluetooth de.NET de 32 pies.
coneccion inalambrica bt (1)
Si desea saber cómo usar la biblioteca de 32feet.NET para comunicarse con dispositivos Bluetooth, lea la solución
Actualmente estoy tratando de comunicarme a través de bluetooth entre una computadora y un prototipo Gadgeter de .NET de creación propia.
El prototipo Gadgeteer consta de la placa base, una fuente de alimentación y un módulo Bluetooth. El módulo está en modo detectable.
En la computadora se está ejecutando un programa de bluetooth personalizado basado en 32 pies .NET Bluetooth. El programa detecta todos los dispositivos Bluetooth dentro del alcance e intenta sincronizarlos. Sin embargo, esto no se hace automáticamente en este momento, tengo que ingresar un código de emparejamiento para el dispositivo.
¿Cómo puedo emparejar dispositivos sin ingresar el código de emparejamiento?
Se encuentran los dispositivos, el problema es la parte de emparejamiento. Experimenté mucho, pero no encontré una solución ...
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);
}
}
Este bloque de código inicia el emparejamiento y funciona, pero Windows me pide que ingrese el código de emparejamiento para el dispositivo. Leí sobre la autenticación BluetoothWin32 para evitar este caso, pero no lo hago bien.
private void HandleRequests(object that, BluetoothWin32AuthenticationEventArgs e)
{
e.Confirm = true;
}
Este es el código del controlador de eventos ( http://32feet.codeplex.com/wikipage?title=BluetoothWin32Authentication )
Si simplemente desea permitir que se realice la vinculación cuando se conecten los dispositivos SSP, entonces el manejo de la devolución de llamada y la configuración e.Confirm = True será suficiente, pero eso es un poco inseguro ...
Estoy confundido -.- El objetivo es que la aplicación y el módulo gadgeteer puedan enviar datos en ambas direcciones sin la interferencia del usuario.
¿Es cierto que no puedo emparejar dispositivos automáticamente sin la interacción del usuario?
¿Es cierto que si dos dispositivos ya estaban emparejados, pueden intercambiar datos sin la interacción del usuario?
Descubrí cómo resolver mis problemas y mi conocimiento sobre las conexiones Bluetooth es un poco más grande ahora. Si alguien más tiene problemas con eso, proporciono mi solución. Los ejemplos de código representan la implementación en C # de un controlador bluetooth con la biblioteca Bluetooth de 32 pies.
Exploración
Esto significa que se detectan dispositivos en rango. Mi código:
// 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
}
Emparejamiento
Esto significa que los dispositivos se acoplan con el dispositivo bluetooth local. Esto debe hacerse una vez ingresando un código de ambos lados. Se puede hacer a través del código para que el usuario ni siquiera note que se agregó un dispositivo. Mi código para este propósito:
// 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
}
}
}
Conectando
Esto significa establecer una conexión e intercambio de datos. De nuevo un código:
// 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 :)
}
}
Si mantiene el escaneo de la orden, empareje, conecte, todo debería funcionar bien. Para enviar o recibir datos, use el método GetStream()
del BluetoothClient
. Proporciona un flujo de red que puede ser manipulado.
Recibiendo una conexión
Si desea que otro dispositivo se conecte con su dispositivo, necesita escuchar las solicitudes de conexión entrantes. Esto solo funciona si el dispositivo ya ha sido emparejado anteriormente. Mi código:
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);
}
}
Reemplace LOCAL_MAC
con una dirección de Bluetooth válida (por ejemplo, mediante el uso de BluetoothAddress.Parse();
). Una vez que los dispositivos están conectados, pueden intercambiar mensajes a través del flujo subyacente. Si la conexión no funciona, puede haber problemas de autenticación, así que intente configurar el pin del dispositivo local en el oyente ( l.SetPin(LOCAL_MAC, MY_PASSWORD);