Hello World untuk menerima data dari perangkat Bluetooth (BLE) melalui C #

Selamat siang

Beberapa minggu yang lalu, saya dihadapkan dengan masalah bahwa tidak ada artikel normal dan modern tentang menerima data dengan Bluetooth . Dan saya harus mengotak-atik untuk memahami di mana untuk memulai dan bagaimana melakukannya sama sekali. Dan agar orang tidak mengulangi kesalahan saya, berikut adalah esai singkat tentang cara melakukan ini.



Tapi pertama-tama, beberapa kata-kata menyedihkan, yang umumnya perlu. Dunia modern semakin tenggelam dalam ideologi Internet segala sesuatu. Sekarang semuanya berinteraksi satu sama lain, kulkas dengan kompor, setrika dengan penyedot debu, dll. Banyak kebisingan dinaikkan karena EKG di Apple Watch, tetapi monitor tekanan darah modern, monitor detak jantung, termometer telah lama mampu mengirimkan data melalui Bluetooth. Dan semua ini entah bagaimana perlu dihubungkan ke satu jaringan. Dan elemen kunci dalam jaringan ini adalah, apa pun yang dikatakan, komputer. Dalam hal ini, tugas muncul untuk menerima data dari perangkat tertentu melalui Bluetooth.

Untuk memulainya, apa yang sudah kita miliki dan apa yang memperburuk pencarian solusi. Dan kami memiliki aplikasi yang ditulis dalam .Net Core . Apa esensi dari aplikasi ini tidak penting, untuk kesederhanaan kami akan menganggap bahwa kami hanya memiliki konsol di .Net Core . Nah, perangkat itu akan disebut huruf N.

Upaya pertama untuk menemukan sesuatu yang berfungsi dengan Bluetooth melalui C # akan mengarah ke pustaka 32feet .

Dalam paket NuGet, sepertinya 32feet.NET .

Dan dia, omong-omong, dalam edisi produk terbarunya, bahkan menemukan perangkat Bluetooth, tetapi bukan standar BLE [seperti yang ternyata kemudian]. Misalnya, OnePlus 5T yang sama telah dicari secara stabil, tetapi perangkat N yang diperlukan tidak. Sejalan dengan ini, jawaban resmi penulis ditemukan bahwa perpustakaannya tidak berinteraksi dengan BLE pada prinsipnya, dan tidak ada gunanya mencoba. Meskipun ada versi awal InTheHand.Devices.Bluetooth pada Github yang seharusnya mendukung BLE, semuanya berubah begitu banyak dan tidak ada dokumentasi sama sekali sehingga bahkan tidak berfungsi untuk menyusun proyek dengan ide-ide yang diambil dari 32feet.NET .

Penelitian baru membawa saya ke solusi yang lebih standar, yaitu Universal Windows Platform ( UWP ). Dalam mengembangkan platform ini, Microsoft , yang dianut oleh gagasan fleksibilitas dan aplikasi tunggal untuk komputer dan telepon, mencoba dan melakukan interaksi dengan Bluetooth. Dan di sini semuanya berjalan dengan baik, tapi ... Kami memiliki proyek di .Net Core ... Dan tidak ada yang bisa dilakukan tentang itu.

Saya harus mengatakan segera bahwa itu tidak mungkin untuk menemukan solusi untuk interaksi perpustakaan UWP dengan .Net Core dan proyek harus dialihkan ke 4.7.1. , manfaatnya tidak sulit. Meskipun ada pemikiran bagaimana meninggalkan proyek di .Net Core dan misalnya membuat layanan Windows terpisah dengan transfer data melalui pipa bernama (pipa bernama) atau meningkatkan layanan WCF dan menjalin interaksi dengannya, tetapi dalam kasus kami itu tidak masuk akal.



Jadi pada akhirnya kita memiliki sebelum memulai:

  • Proyeksikan pada 4.7.1.
  • Win10 telah diperbarui ke Versi 10.0.17134 Build 17134.

Pertama, Anda perlu menghubungkan beberapa perpustakaan dengan pena, yaitu

  • “Windows dari Platform Windows Universal”
    C: \ Program Files (x86) \ Windows Kits \ 10 \ UnionMetadata \ 10.0.17134.0 \ Windows.winmd
  • "System.Runtime.WindowsRuntime"
    C: \ Program Files (x86) \ Assemblies Referensi \ Microsoft \ Framework \ .NETCore \ v4.5 \ System.Runtime.WindowsRuntime.dll

Dan sebenarnya semuanya, maka pekerjaan dengan perangkat itu sendiri melewati dokumentasi tanpa masalah.
Berinteraksi dengan BLE melalui kelas BluetoothLEAdvertisementWatcher
Tetapi kita tidak boleh lupa bahwa tanpa API perangkat itu sendiri, sesuatu yang masuk akal untuk dilakukan tidak akan berfungsi.

Berikut ini contoh kode saya tentang cara mendapatkan data dari perangkat.

Kode ini dirancang untuk memastikan bahwa perangkat telah ditambahkan (terhubung).

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); // input } } } } } } } } private void Characteristic_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args) { var reader = DataReader.FromBuffer(args.CharacteristicValue); byte[] input = new byte[reader.UnconsumedBufferLength]; reader.ReadBytes(input); // input } private void Watcher_Stopped(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementWatcherStoppedEventArgs args) { ; } } 

Terima kasih atas perhatian anda

Source: https://habr.com/ru/post/id423893/


All Articles