Buenas tardes
Hace un par de semanas, me enfrenté al problema de que simplemente no hay un artículo normal y moderno sobre la
primera recepción de datos con Bluetooth . Y tuve que jugar con eso para entender por dónde empezar y cómo hacerlo. Y para que la gente no repita mis errores, aquí hay un breve ensayo sobre cómo hacer esto.
Pero primero, un par de palabras pathos, para las cuales esto es generalmente necesario. El mundo moderno está cada vez más inmerso en la ideología de Internet de las cosas. Ahora todo interactúa entre sí, un refrigerador con estufa, una plancha con una aspiradora, etc. Se generó mucho ruido debido al ECG en el Apple Watch, pero los modernos monitores de presión arterial, monitores de frecuencia cardíaca y termómetros han sido capaces de transmitir datos a través de Bluetooth. Y todo esto de alguna manera necesita estar conectado a una sola red. Y el elemento clave en esta red es, sea lo que sea que se diga, una computadora. En este sentido, surgió la tarea de recibir datos de un dispositivo específico a través de Bluetooth.
Para empezar, lo que ya teníamos y lo que exacerbó la búsqueda de una solución. Y teníamos una aplicación escrita en
.Net Core . Lo que la esencia de la aplicación no es importante, por simplicidad asumiremos que solo tenemos una consola en
.Net Core . Bueno, el dispositivo se llamará la letra
N.Los primeros intentos de encontrar algo que funcione con Bluetooth a través de C # conducirán a la biblioteca de
32 pies .
En los paquetes NuGet, suena como
32feet.NET .
Y ella, por cierto, en su última edición del producto, incluso encuentra dispositivos Bluetooth, pero no el estándar BLE [como resultó mucho más tarde]. Por ejemplo, se buscó de forma estable el mismo OnePlus 5T, pero no el dispositivo
N necesario. Paralelamente a esto, se encontró que la respuesta oficial del autor fue que su biblioteca no interactúa con BLE en principio, y no tiene sentido intentarlo. Aunque hay una versión preliminar de
InTheHand.Devices.Bluetooth en Github que debería admitir BLE, todo cambia tanto y no hay documentación en absoluto que ni siquiera funcionó para compilar el proyecto con ideas tomadas de
32feet.NET .
Una nueva investigación me llevó a soluciones más estándar, a saber, la
Plataforma Universal de Windows (
UWP ). Al desarrollar esta plataforma,
Microsoft , abrazado por la idea de versatilidad y una sola aplicación para una computadora y un teléfono, probó e hizo interacción con Bluetooth. Y aquí todo funciona bien, pero ... Tenemos un proyecto en
.Net Core ... Y no hay nada que hacer al respecto.
Debo decir de
inmediato que no pudimos encontrar soluciones para la interacción de las bibliotecas de
UWP con
.Net Core y el proyecto tuvo que cambiarse a
4.7.1. , el beneficio no es difícil. Aunque se pensó cómo dejar el proyecto en
.Net Core y, por ejemplo, hacer un servicio separado de Windows con transferencia de datos a través de canalizaciones con nombre (canalización con nombre) o generar un servicio
WCF y establecer interacción con él, pero en nuestro caso no tenía sentido.
Así que al final tenemos antes del inicio:
- Proyecto sobre 4.7.1.
- Win10 se ha actualizado a la versión 10.0.17134 Build 17134.
Primero necesita conectar un par de bibliotecas con bolígrafos, a saber
- "Windows desde la plataforma universal de Windows"
C: \ Archivos de programa (x86) \ Windows Kits \ 10 \ UnionMetadata \ 10.0.17134.0 \ Windows.winmd - "System.Runtime.WindowsRuntime"
C: \ Archivos de programa (x86) \ Ensamblados de referencia \ Microsoft \ Framework \ .NETCore \ v4.5 \ System.Runtime.WindowsRuntime.dll
Y en realidad todo, el trabajo con el dispositivo en sí pasa por la documentación sin problemas.
Interactúa con BLE a través de la clase BluetoothLEAdvertisementWatcher
Pero no debemos olvidar que sin la API del dispositivo en sí, algo sensato no funciona.
Aquí está mi código de muestra sobre cómo obtener datos de un dispositivo.
Este código está diseñado para garantizar que el dispositivo ya se haya agregado (conectado).
public class BluetoothObserver { BluetoothLEAdvertisementWatcher Watcher { get; set; } public void Start() { Watcher = new BluetoothLEAdvertisementWatcher() { ScanningMode = BluetoothLEScanningMode.Active }; Watcher.Received += Watcher_Received; Watcher.Stopped += Watcher_Stopped; Watcher.Start(); } private bool isFindDevice { get; set; } = false; private async void Watcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args) { if (isFindDevice) return; if (args.Advertisement.LocalName.Contains("deviceName")) { isFindDevice = true; BluetoothLEDevice bluetoothLeDevice = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress); GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesAsync(); if (result.Status == GattCommunicationStatus.Success) { var services = result.Services; foreach (var service in services) { if (!service.Uuid.ToString().StartsWith("serviceName")) { continue; } GattCharacteristicsResult characteristicsResult = await service.GetCharacteristicsAsync(); if (characteristicsResult.Status == GattCommunicationStatus.Success) { var characteristics = characteristicsResult.Characteristics; foreach (var characteristic in characteristics) { if (!characteristic.Uuid.ToString().StartsWith("characteristicName")) { continue; } GattCharacteristicProperties properties = characteristic.CharacteristicProperties; if (properties.HasFlag(GattCharacteristicProperties.Indicate)) { characteristic.ValueChanged += Characteristic_ValueChanged; GattWriteResult status = await characteristic.WriteClientCharacteristicConfigurationDescriptorWithResultAsync(GattClientCharacteristicConfigurationDescriptorValue.Indicate); return; } if (properties.HasFlag(GattCharacteristicProperties.Read)) { GattReadResult gattResult = await characteristic.ReadValueAsync(); if (gattResult.Status == GattCommunicationStatus.Success) { var reader = DataReader.FromBuffer(gattResult.Value); byte[] input = new byte[reader.UnconsumedBufferLength]; reader.ReadBytes(input);
Gracias por su atencion