Bluetooth serial genérico com Win 10 IoT-Core RPI2
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicativos e serviços online
| ||||
|
Sobre este projeto
Além
Este projeto é discutido em detalhes em embedded101.com:
"Win 10 IoT-Core:Bluetooth Universal Windows Serial App"
Sobre
Este projeto é um aplicativo universal do Windows que conecta um dispositivo IoT-Core, como o Raspberry PI 2, a um dispositivo Bluetooth incorporado no perfil serial do Bluetooth, usando um dongle USB Bluetooth genético.
Antecedentes
.Bluetooth suporta rede ponto a ponto em um curto alcance. Ao contrário de uma rede Wi-Fi, a conectividade Bluetooth é um para um. Dois dispositivos podem se conectar e interagir. Por exemplo, dois dispositivos podem se conectar de maneira simétrica usando o perfil serial e passar dados brutos entre eles. Geralmente, porém, a conectividade Bluetooth é assimétrica com uma extremidade gerando um formato de dados específico a ser consumido na outra extremidade. Por exemplo, um telefone móvel pode implementar o Perfil A2DP (Perfil de Distribuição de Áudio Avançada) e transmitir áudio para um fone de ouvido que implementa o Perfil HSP (Fone de ouvido). OBEX (Troca de Objetos) é uma conexão simétrica entre dois dispositivos enquanto trocam dados entre eles.
O projeto Microsoft IOT-Core Bluetooth Sample usa o GATT (Generic Attribute Profile Profile). Isso fornece serviços de descoberta e descrição de perfil para o protocolo Bluetooth Low Energy. Com este protocolo, dispositivos simples de baixo consumo de energia podem ser conectados em uma extremidade, gerando dados a serem consumidos por um processador complexo.
Este é um projeto muito mais simples do que o exemplo da Microsoft. Ele está preocupado apenas com o SPP (Perfil de Porta Serial) mais genérico que é baseado no perfil RFCOMM. Ele foi desenvolvido com um dongle Bluetooth USB muito antigo e, portanto, deve funcionar com qualquer dongle Bluetooth.
O aplicativo IoT
Este aplicativo é um aplicativo de teste simples do Bluetooth Serial Universal Windows (Windows 10). Ele começa enumerando (como uma lista) todos os dispositivos Bluetooth emparelhados com o dispositivo em que o aplicativo está sendo executado. Um é selecionado clicando duas vezes, o que inicia a conexão. O texto a ser enviado é inserido em uma caixa de texto e enviado quando um botão é pressionado. O aplicativo recebe automaticamente qualquer texto enviado a ele (e o exibe). Portanto, quando o ponto de extremidade (como acima) simplesmente ecoa o texto recebido, o texto enviado deve reaparecer na caixa de recepção no aplicativo UW.
O ponto final
Para testar um Arduino Uno com um adaptador Bluetooth é usado. Ele tem um escudo simples que apenas ecoa quaisquer caracteres recebidos pela conexão Bluetooth:
Configuração do escudo:
// Um aplicativo de loop back serial // Configuração anterior // Iniciado pelo sistema conectado // Nota pode ser usado com Bluetooth onde o RxTx do dispositivo BT // está conectado ao TxRx da placa Arduino. // É necessário desconectar o adaptador BT para programação embora.void setup () {// Meu adaptador está definido para este BAUD 115200 // Esta é a taxa de porta do adaptador Arduino para BT // Definida quando o adaptador BT está no modo de comando. // NÃO é a taxa de BT que você não pode definir. Serial.begin (115200); atraso (333); while (! Serial); atraso (1000); Serial.println ("A rápida raposa marrom pula sobre o cachorro preguiçoso!");}
The Shield Loop:
void loop () {char ch =Serial.read (); enquanto (255 ==(byte) ch) {ch =Serial.read (); } Serial.print (ch);}
Emparelhamento
O Bluetooth é um cenário ponto a ponto. Antes que eles possam se conectar por Bluetooth, eles devem ser emparelhados. Isso não é feito no aplicativo. O emparelhamento com uma chave de acesso pode ser problemático entre os dispositivos incorporados, pois eles geralmente não têm cabeça e podem não suportar pop-ups (o que o IoT-Core não oferece). Há um portal da web IoT-Core para fazer isso, bem como um utilitário de linha de comando no dispositivo que pode ser executado em um shell SSH. A versão mais recente do portal da web do sistema operacional oferece suporte ao emparelhamento de chave de acesso que estava faltando na época do Windows 10 RTM. "Win 10 IoT-Core:Bluetooth Universal Windows Serial App" discute o emparelhamento neste contexto em detalhes.
Iniciando o projeto
O projeto do aplicativo é criado usando o Visual Studio 2015 usando o modelo de aplicativo Universal do Windows:
Novo projeto -> Visual C # -> Windows-> Aplicativo em branco (Windows universal)
Criação da IU do aplicativo
A IU é implementada em XAML
Crie a IU de acordo com o layout acima (ou semelhante):
A IU é bastante simples e é criada da seguinte maneira:
- Todos os elementos de texto são TextBlocks, exceto SendText, que é um TextBox
- SendText aceita CarriageReturn (ou seja, é multilinha)
- O texto do Recvd tem WrapText ativado (ou seja, é multilinha)
- Os elementos da IU são organizados em linhas usando um StackPanel definido para orientação horizontal
- Esses StackPanels são então empilhados com um StackPanel definido para orientação vertical, junto com o ListBox.
Você pode preferir fazer o layout da IU usando Relative StackPanels ou usar linhas e colunas de grade, etc.
O ConnectDevices é um ListBox com uma Binding Source definida para PairedDevices ( ver mais tarde ) e um ItemTemplate que consiste em um TextBlock vinculado à propriedade Name de PairedDevices ( ver mais tarde )
Configuração do aplicativo
- O aplicativo não faz uso dos recursos do IOT-Core, portanto não exigirá nenhuma referência de extensão.
- O aplicativo precisará de alguns recursos específicos para Bluetooth e Serial adicionados a Package.appxmanifest.
- Infelizmente, a IU que você obtém para isso se clicar duas vezes nesse arquivo no Solution Explorer não suporta a adição desses recursos e, portanto, você precisa adicioná-los manualmente clicando com o botão direito no arquivo no Solution Explorer e selecione Open With-> Editor XML.
Modifique a seção de recursos (na parte inferior) para:
O recurso internetClient já estará lá. Não é necessário para este aplicativo, então você pode querer removê-lo. Eu deixo.
Informações do dispositivo pareado
No início do aplicativo, os dispositivos emparelhados são enumerados usando:
DeviceInformationCollection DeviceInfoCollection
=await DeviceInformation.FindAllAsync (RfcommDeviceService.GetDeviceSelector (RfcommServiceId.SerialPort));
Esta coleção é então transformada em uma ObservableCollection que pode ser usado no ListBox:
_pairDevices =new ObservableCollection ();
O DeviceInfoCollection é iterado através da criação de um PairedDeviceInfo objeto para cada item que é adicionado a _pairDevices coleção.
PairedDeviceInfo é uma classe com propriedades:
Nome
Id
DeviceInfo
A classe possui um construtor apropriado.
DeviceInformation é Windows.Devices.Enumeration.DeviceInformation
Na caixa de listagem de dispositivos emparelhados, o Nome campo é (vinculado) exibido.
Quando um dispositivo é selecionado (clicado duas vezes), DeviceInformation do terminal é, na verdade, parte do item de menu selecionado e, portanto, é usado para estabelecer a conexão.
Conexão
O DeviceInformation é usado para obter o serviço RFCOMM. A conexão é então estabelecida como um StreamSocket usando o Endpoint HostName (na verdade, seu endereço Bluetooth Mac) e a string ServiceName.
_service =await RfcommDeviceService.FromIdAsync (DeviceInfo.Id); _ socket =new StreamSocket (); await _socket.ConnectAsync (_service.ConnectionHostName, _service.ConnectionServiceName);
Se tudo estiver bem, então temos uma conexão .. o soquete será significativo (não nulo).
Claro que isso é uma armadilha de erro (try-catch)
Envie e receba texto usando as propriedades InputStream e OutputStream do soquete.
Receber Texto
O recebimento de texto deve ser iniciado primeiro, pois é executado como um thread separado. Ele executa uma espera assíncrona para obter a entrada serial, lida com a entrada e, em seguida, executa outra recepção serial assíncrona .. tudo em um loop. Isso faz um loop contínuo até que um cancelamento seja gerado.
private assíncrono void Listen () {ReadCancellationTokenSource =new CancelamentoTokenSource (); if (_socket.InputStream! =null) {dataReaderObject =new DataReader (_socket.InputStream); // continue lendo a entrada serial while (true) {await ReadAsync (ReadCancellationTokenSource.Token); }}} DataReader dataReaderObject; privado CancelamentoTokenSource ReadCancellationTokenSource; privado assíncrono Tarefa ReadAsync (Cancelamento CancelTokenToken) {uint ReadBufferLength =1024; // Se o cancelamento da tarefa foi solicitado, cumpra cancellationToken.ThrowIfCancellationRequested (); // Defina InputStreamOptions para concluir a operação de leitura assíncrona quando um ou mais bytes estiverem disponíveis dataReaderObject.InputStreamOptions =InputStreamOptions.Partial; // Crie um objeto de tarefa para aguardar os dados no serialPort.InputStream loadAsyncTask =dataReaderObject.LoadAsync (ReadBufferLength) .AsTask (cancellationToken); // Inicie a tarefa e aguarde UInt32 bytesRead =await loadAsyncTask; if (bytesRead> 0) {string recvdtxt =dataReaderObject.ReadString (bytesRead); }}
Enviar Texto
Embora o texto recebido seja executado de forma assíncrona, visto que a chegada do texto não é determinística da perspectiva do aplicativo, o texto enviado é acionado a partir da IU do aplicativo e, portanto, é essencialmente síncrono (embora um await seja usado para liberar a IU).
private assíncrono void Send (string msg) {Task storeAsyncTask; DataWriter dataWriteObject =new DataWriter (_socket.OutputStream); dataWriteObject.WriteString (msg); // Inicie uma tarefa assíncrona para concluir a operação de gravação storeAsyncTask =dataWriteObject.StoreAsync (). AsTask (); UInt32 bytesWritten =await storeAsyncTask;}
Estados do botão
Os botões de comando são habilitados e desabilitados dependendo do estado do aplicativo. Por exemplo, os botões Enviar e Iniciar recebimento são desativados quando o aplicativo não está conectado, mas são ativados quando o aplicativo é conectado, etc.
Aproveitar! :)
Código
iotbluetoothserial no Github
Também no Codeplex (espelho) https://iotgenbluetoothserialuwa.codeplex.com/https://github.com/djaus2/iotbluetoothserialProcesso de manufatura
- GoPiGo v2 com Windows IoT
- Luzes de dimerização com PWM usando o botão de ação
- Dispositivo de medição de pressão de fluxo de ar com sensor analógico
- Jogo Arduino Gyroscope com MPU-6050
- Câmera de segurança Discord com ESP32
- Sensor DHT11 com LEDs e um alto-falante Piezo
- Unopad - Controlador Arduino MIDI com Ableton
- Controle remoto de TV a bateria com caixa impressa em 3D
- Arduino com Bluetooth para controlar um LED!
- Sensor de obstáculo simples com Arduino