Boa tarde
Há algumas semanas, tive o problema de simplesmente não existir um artigo normal e moderno sobre o
primeiro recebimento de dados com Bluetooth . E eu tive que mexer com ele para entender por onde começar e como fazê-lo. E para que as pessoas não repitam meus erros, aqui está um pequeno ensaio sobre como fazer isso.
Mas primeiro, algumas palavras pathos, para as quais isso geralmente é necessário. O mundo moderno está cada vez mais imerso na ideologia da Internet das coisas. Agora tudo interage, uma geladeira com um fogão, um ferro com um aspirador de pó, etc. Muito barulho foi gerado devido ao ECG no Apple Watch, mas os modernos monitores de pressão arterial, monitores de freqüência cardíaca e termômetros têm sido capazes de transmitir dados via Bluetooth. E tudo isso de alguma forma precisa estar conectado a uma única rede. E o elemento chave nessa rede é, o que quer que se diga, um computador. Nesse sentido, surgiu a tarefa de receber dados de um dispositivo específico via Bluetooth.
Para começar, o que já tínhamos e o que exacerbou a busca por uma solução. E tivemos um aplicativo escrito em
.Net Core . Qual é a essência do aplicativo não importa, por simplicidade, assumimos que temos apenas um console no
.Net Core . Bem, o dispositivo será chamado a letra
N.As primeiras tentativas de encontrar algo que funcione com Bluetooth via C # levarão à biblioteca
32feet .
Nos pacotes NuGet, parece
32feet.NET .
E ela, a propósito, em sua última edição do produto, até encontra dispositivos Bluetooth, mas não o padrão BLE [como se viu muito mais tarde]. Por exemplo, o mesmo OnePlus 5T foi pesquisado de forma estável, mas o dispositivo
N necessário não
é . Paralelamente, a resposta oficial do autor foi encontrada em princípio, que sua biblioteca não interage com o BLE, e não faz sentido tentar. Embora exista uma versão preliminar do
InTheHand.Devices.Bluetooth no Github que deve suportar o BLE, tudo mudou muito e não há documentação alguma que nem funcionou para compilar o projeto com as idéias tiradas do
32feet.NET .
Novas pesquisas me levaram a soluções mais padrão, a saber, a
Universal Windows Platform (
UWP ). Ao desenvolver essa plataforma, a
Microsoft , adotada pela idéia de versatilidade e um único aplicativo para computador e telefone, tentou e fez a interação com o Bluetooth. E aqui tudo funciona bem, mas ... Temos um projeto no
.Net Core ... E não há nada a ser feito sobre isso.
Devo dizer
imediatamente que não foi possível encontrar soluções para a interação das bibliotecas
UWP com o
.Net Core e o projeto precisou ser alterado para
4.7.1. , o benefício não é difícil. Embora houvesse pensado em como deixar o projeto no
.Net Core e, por exemplo, criar um serviço Windows separado com transferência de dados por meio de pipes nomeados (pipe nomeado) ou criar um serviço
WCF e estabelecer interação com ele, mas, no nosso caso, não fazia sentido.
Então, no final, temos antes do início:
- Projeto em 4.7.1.
- O Win10 foi atualizado para a versão 10.0.17134 Build 17134.
Primeiro, você precisa conectar algumas bibliotecas com canetas, a saber
- “Windows da Plataforma Universal do Windows”
C: \ Arquivos de programas (x86) \ Windows Kits \ 10 \ UnionMetadata \ 10.0.17134.0 \ Windows.winmd - "System.Runtime.WindowsRuntime"
C: \ Arquivos de programas (x86) \ Assemblies de referência \ Microsoft \ Framework \ .NETCore \ v4.5 \ System.Runtime.WindowsRuntime.dll
E, na verdade, tudo, então o trabalho com o próprio dispositivo passa pela documentação sem problemas.
Interaja com o BLE por meio da classe BluetoothLEAdvertisementWatcher
Mas não devemos esquecer que, sem a API do próprio dispositivo, algo sensato a fazer não funciona.
Aqui está o meu código de exemplo sobre como obter dados de um dispositivo.
Este código foi projetado para garantir que o dispositivo já tenha sido adicionado (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);
Obrigado pela atenção.