Bluetooth serial genérico con Win 10 IoT-Core RPI2
Componentes y suministros
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicaciones y servicios en línea
| ||||
|
Acerca de este proyecto
Más
Este proyecto se analiza en detalle en embedded101.com:
"Win 10 IoT-Core:Aplicación serial universal de Windows Bluetooth"
Acerca de
Este proyecto es una aplicación universal de Windows que conecta un dispositivo IoT-Core, como una Raspberry PI 2, a un dispositivo Bluetooth integrado a través del perfil de serie de Bluetooth mediante un dispositivo de seguridad USB Bluetooth genético.
Antecedentes
.Bluetooth admite redes de igual a igual en un rango corto. A diferencia de una red Wi-Fi, la conectividad Bluetooth es uno a uno. Dos dispositivos pueden conectarse e interactuar. Por ejemplo, dos dispositivos pueden conectarse de manera simétrica utilizando el perfil en serie y pasar datos sin procesar entre ellos. Sin embargo, en general, la conectividad Bluetooth es asimétrica y un extremo genera un formato de datos específico que se consume en el otro extremo. Por ejemplo, un teléfono móvil puede implementar el perfil A2DP (perfil de distribución de audio avanzado) y transmitir audio a un auricular que implementa el perfil HSP (auricular) OBEX (intercambio de objetos) es una conexión simétrica entre dos dispositivos a medida que intercambian datos entre ellos.
El proyecto de muestra de Microsoft IOT-Core Bluetooth utiliza el GATT (perfil de perfil de atributo genérico). Esto proporciona servicios de descripción y descubrimiento de perfiles para el protocolo Bluetooth Low Energy. Con este protocolo, se pueden conectar dispositivos simples de baja potencia en un extremo generando datos para ser consumidos por un procesador complejo.
Este es un proyecto mucho más simple que el ejemplo de Microsoft. Solo se ocupa del SPP (perfil de puerto serie) más genérico que se basa en el perfil RFCOMM. Se desarrolló con una llave USB Bluetooth muy antigua, por lo que debería funcionar con cualquier llave Bluetooth.
La aplicación de IoT
Esta aplicación es una sencilla aplicación de prueba de Bluetooth Serial Universal Windows (Windows 10). Comienza enumerando (como una lista) todos los dispositivos Bluetooth emparejados con el dispositivo donde se ejecuta la aplicación. Uno se selecciona haciendo doble clic que inicia la conexión. El texto para enviar se ingresa en un cuadro de texto y se envía cuando se presiona un botón. La aplicación recibe automáticamente cualquier texto que se le envíe (y lo muestra). Por lo tanto, cuando el punto final (como el anterior) simplemente se hace eco del texto recibido, el texto enviado debería volver a aparecer en el cuadro de recepción de la aplicación UW.
El punto final
Para probar se utiliza un Arduino Uno con un adaptador Bluetooth. Tiene un escudo simple que simplemente repite cualquier carácter que recibe a través de la conexión Bluetooth:
Configuración del escudo:
// Una aplicación de loop back en serie // Configuración anterior // Iniciada por el sistema conectado // Note se puede usar con Bluetooth donde los RxTx del dispositivo BT // están conectados al TxRx de la placa Arduino. // Necesito desconectar el adaptador BT para programar aunque. Void setup () {// Mi adaptador está configurado para este BAUD 115200 // Esta es la velocidad de puerto del adaptador Arduino a BT // Establecer cuando el adaptador BT está en modo de comando. // NO es la tasa de BT que no puede establecer. Serial.begin (115200); retraso (333); mientras (! Serial); retraso (1000); Serial.println ("¡El rápido zorro marrón salta sobre el perro perezoso!");}
El lazo del escudo:
void loop () {char ch =Serial.read (); while (255 ==(byte) ch) {ch =Serial.read (); } Serial.print (ch);}
Emparejamiento
Bluetooth es un escenario de igual a igual. Antes de que puedan conectarse a través de Bluetooth, deben emparejarse. Esto no se hace dentro de la aplicación. El emparejamiento con una clave de acceso puede ser problemático entre dispositivos integrados, ya que a menudo no tienen cabeza y pueden no admitir ventanas emergentes (como IoT-Core no lo hace). Existe un portal web IoT-Core para hacer esto, así como una utilidad de línea de comandos en el dispositivo que se puede ejecutar sobre un shell SSH. La versión más reciente del portal web del sistema operativo admite el emparejamiento de claves de acceso que faltaba en la época de Windows 10 RTM. "Win 10 IoT-Core:Bluetooth Universal Windows Serial App" analiza el emparejamiento en este contexto en detalle.
Iniciando el proyecto
El proyecto de la aplicación se crea en Visual Studio 2015 con la plantilla de aplicación universal de Windows:
Nuevo proyecto -> Visual C # -> Windows-> Aplicación en blanco (Windows universal)
Creación de la interfaz de usuario de la aplicación
La interfaz de usuario está implementada en XAML
Cree la interfaz de usuario según el diseño anterior (o similar):
La interfaz de usuario es bastante sencilla y se crea de la siguiente manera:
- Todos los elementos de texto son TextBlocks, excepto SendText, que es un TextBox
- SendText acepta CarriageReturn (es decir, es multilínea)
- El texto Recvd tiene WrapText habilitado (es decir, es multilínea)
- Los elementos de la interfaz de usuario se organizan en filas mediante un StackPanel configurado en orientación horizontal
- Estos StackPanels luego se apilan con un StackPanel configurado en orientación vertical, junto con ListBox.
Es posible que prefiera diseñar la interfaz de usuario utilizando paneles de pila relativos o utilizar filas y columnas de cuadrícula, etc.
ConnectDevices es un ListBox con una fuente de enlace establecida en PairedDevices ( ver más adelante ) y una ItemTemplate que consiste en un TextBlock vinculado a la propiedad Name de PairedDevices ( ver más adelante ).
Configuración de la aplicación
- La aplicación no utiliza las funciones de IOT-Core, por lo que no requerirá referencias de extensión.
- La aplicación necesitará algunas capacidades específicas para Bluetooth y Serial agregadas a Package.appxmanifest.
- Desafortunadamente, la interfaz de usuario que obtiene para esto si hace doble clic en ese archivo en el Explorador de soluciones no admite la adición de estas capacidades y, por lo tanto, debe agregarlas manualmente haciendo clic con el botón derecho en el archivo en el Explorador de soluciones y seleccione Abrir con-> Editor XML.
Modifique la sección de capacidades (en la parte inferior) para:
La capacidad de InternetClient ya estará allí. No es necesario para esta aplicación, por lo que es posible que desee eliminarlo. Lo dejo.
Información del dispositivo emparejado
Al inicio de la aplicación, los dispositivos emparejados se enumeran mediante:
DeviceInformationCollection DeviceInfoCollection
=aguardar DeviceInformation.FindAllAsync (RfcommDeviceService.GetDeviceSelector (RfcommServiceId.SerialPort));
Luego, esta colección se convierte en una colección observable . que se puede usar en ListBox:
_pairedDevices =new ObservableCollection
DeviceInfoCollection se repite mediante la creación de un PairedDeviceInfo objeto para cada elemento que luego se agrega a los _pairedDevices colección.
PairedDeviceInfo es una clase con propiedades:
Nombre
Id
DeviceInfo
La clase tiene un constructor apropiado.
Información del dispositivo es Windows.Devices.Enumeration.DeviceInformation
En el cuadro de lista de dispositivos emparejados, el Nombre El campo se muestra (enlazado).
Cuando se selecciona un dispositivo (se hace doble clic), la información del dispositivo del punto final es en realidad parte del elemento de menú seleccionado y, por lo tanto, se utiliza para establecer la conexión.
Conexión
DeviceInformation se utiliza para obtener el servicio RFCOMM. Luego, la conexión se establece como StreamSocket utilizando el nombre de host del punto final (en realidad, su dirección Mac de Bluetooth) y la cadena ServiceName.
_service =await RfcommDeviceService.FromIdAsync (DeviceInfo.Id); _ socket =new StreamSocket (); await _socket.ConnectAsync (_service.ConnectionHostName, _service.ConnectionServiceName);
Si todo está bien, entonces tenemos una conexión ... el conector será significativo (no nulo).
Por supuesto, esto es un error atrapado (try-catch)
Enviar texto y Recibir texto hacen uso de las propiedades InputStream y OutputStream del socket.
Recibir texto
La recepción de texto debe iniciarse primero, ya que se ejecuta como un hilo independiente. Ejecuta una espera asíncrona para obtener la entrada en serie, maneja la entrada y luego ejecuta otra recepción en serie asíncrona ... todo en un bucle. Esto se repite continuamente hasta que se genera una cancelación.
private async void Listen () {ReadCancellationTokenSource =new CancellationTokenSource (); if (_socket.InputStream! =null) {dataReaderObject =nuevo DataReader (_socket.InputStream); // sigue leyendo la entrada serial while (true) {await ReadAsync (ReadCancellationTokenSource.Token); }}} DataReader dataReaderObject; CancellationTokenSource privado ReadCancellationTokenSource; Tarea asíncrona privada ReadAsync (CancellationToken cancellationToken) {uint ReadBufferLength =1024; // Si se solicitó la cancelación de la tarea, cumplir cancellationToken.ThrowIfCancellationRequested (); // Establecer InputStreamOptions para completar la operación de lectura asincrónica cuando hay uno o más bytes disponibles dataReaderObject.InputStreamOptions =InputStreamOptions.Partial; // Cree un objeto de tarea para esperar datos en serialPort.InputStream loadAsyncTask =dataReaderObject.LoadAsync (ReadBufferLength) .AsTask (cancellationToken); // Ejecuta la tarea y espera UInt32 bytesRead =await loadAsyncTask; if (bytesRead> 0) {string recvdtxt =dataReaderObject.ReadString (bytesRead); }}
Enviar texto
Si bien el texto recibido se realiza de forma asincrónica, ya que la llegada del texto no es determinista desde la perspectiva de la aplicación, el texto enviado se procesa desde la interfaz de usuario de la aplicación y, por lo tanto, es esencialmente sincrónico (aunque se usa una espera para liberar la interfaz de usuario).
private async void Send (string msg) {Task storeAsyncTask; DataWriter dataWriteObject =nuevo DataWriter (_socket.OutputStream); dataWriteObject.WriteString (msg); // Ejecuta una tarea asíncrona para completar la operación de escritura storeAsyncTask =dataWriteObject.StoreAsync (). AsTask (); UInt32 bytesWritten =aguardar storeAsyncTask;}
Estados del botón
Los botones de comando están habilitados y deshabilitados según el estado de la aplicación. Por ejemplo, los botones Enviar e Iniciar recepción están desactivados cuando la aplicación no está conectada, pero se habilitan cuando la aplicación está conectada, etc.
¡Disfrutar! :)
Código
iotbluetoothserial en Github
También en Codeplex (espejo) https://iotgenbluetoothserialuwa.codeplex.com/https://github.com/djaus2/iotbluetoothserialProceso de manufactura
- GoPiGo v2 con Windows IoT
- Atenuación de luces con PWM usando el botón pulsador
- Dispositivo de medición de flujo de aire a presión con sensor analógico
- Juego de giroscopio Arduino con MPU-6050
- Cámara de seguridad Discord con ESP32
- Sensor DHT11 con LED y altavoz piezoeléctrico
- Unopad - Controlador MIDI Arduino con Ableton
- Control remoto de TV a batería con carcasa impresa en 3D
- ¡Arduino con Bluetooth para controlar un LED!
- Sensor de obstáculos simple con Arduino
- Dispositivos Bluetooth controlados por voz con OK Google