Tentang proyek ini
Selanjutnya
Proyek ini dibahas secara mendetail di embedded101.com:
"Menangkan 10 IoT-Core:Bluetooth Universal Windows Serial App"
Tentang
Project ini adalah Aplikasi Windows Universal yang menghubungkan perangkat IoT-Core seperti Raspberry PI 2 ke perangkat Bluetooth tersemat melalui Bluetooth Serial Profile menggunakan dongle USB Bluetooth genetik.
Latar belakang
.Bluetooth mendukung jaringan peer to peer dalam jarak dekat. Tidak seperti jaringan Wi-Fi, konektivitas Bluetooth adalah satu-ke-satu. Dua perangkat dapat terhubung dan berinteraksi. Misalnya, dua perangkat dapat terhubung secara simetris menggunakan profil serial dan mengirimkan data mentah di antara keduanya. Namun secara umum, konektivitas Bluetooth tidak simetris dengan satu ujung menghasilkan format data tertentu untuk digunakan di ujung lainnya. Misalnya ponsel dapat menerapkan Profil A2DP (Advanced Audio Distribution Profile) dan mengalirkan audio ke perangkat kepala yang mengimplementasikan Profil HSP (Headset) OBEX (Object Exchange) adalah koneksi simetris antara dua perangkat saat mereka bertukar data di antara mereka.
Proyek Microsoft IOT-Core Bluetooth Sample menggunakan GATT (Generic Attribute Profile Profile). Ini menyediakan layanan penemuan dan deskripsi profil untuk protokol Bluetooth Low Energy. Dengan protokol ini, perangkat berdaya rendah yang sederhana dapat dihubungkan di satu ujung yang menghasilkan data untuk dikonsumsi oleh prosesor yang kompleks.
Ini adalah proyek yang jauh lebih sederhana daripada contoh Microsoft. Ini hanya terkait dengan SPP (Profil Port Serial) yang lebih umum yang didasarkan pada profil RFCOMM. Ini dikembangkan dengan dongle Bluetooth USB yang sangat tua dan seharusnya berfungsi dengan dongle Bluetooth apa pun.
Aplikasi IoT
Aplikasi ini adalah aplikasi uji Bluetooth Serial Universal Windows (Windows 10) sederhana. Ini dimulai dengan menghitung (sebagai daftar) semua perangkat Bluetooth yang dipasangkan ke perangkat tempat aplikasi berjalan. Satu dipilih dengan mengklik dua kali yang memulai koneksi. Teks untuk dikirim dimasukkan ke dalam Kotak Teks dan dikirim saat tombol ditekan. Aplikasi secara otomatis menerima teks apa pun yang dikirim ke sana (dan menampilkannya). Oleh karena itu ketika titik akhir (seperti di atas) hanya menggemakan teks yang diterimanya, teks yang dikirim akan muncul kembali di kotak penerimaan pada aplikasi UW.
Titik Akhir
Untuk pengujian Arduino Uno dengan adaptor Bluetooth digunakan. Ia memiliki perisai sederhana yang hanya menampilkan kembali karakter apa pun yang diterimanya melalui koneksi Bluetooth:
Pengaturan Perisai:
// Aplikasi loop belakang serial// Pengaturan sebelumnya// Diprakarsai oleh sistem yang terhubung// Catatan dapat digunakan dengan Bluetooth di mana RxTx perangkat BT// terhubung ke TxRx papan Arduino. // Perlu melepas adaptor BT untuk pemrograman. // Ini BUKAN tingkat BT yang tidak dapat Anda atur. Serial.begin(115200); penundaan(333); while (!Serial); penundaan (1000); Serial.println("Rubah coklat cepat melompati anjing malas!");}
Lingkaran Perisai:
void loop() { char ch =Serial.read(); while ( 255 ==(byte) ch) { ch =Serial.read(); } Serial.print(ch);}
Memasangkan
Bluetooth adalah skenario peer to peer. Sebelum mereka dapat terhubung melalui Bluetooth, mereka harus dipasangkan. Ini tidak dilakukan dalam aplikasi. Memasangkan dengan kunci sandi dapat menimbulkan masalah di antara perangkat yang disematkan karena perangkat tersebut sering kali tanpa kepala dan mungkin tidak mendukung munculan (seperti yang tidak didukung oleh IoT-Core). Ada portal web IoT-Core untuk melakukan ini serta utilitas baris perintah pada perangkat yang dapat dijalankan melalui shell SSH. Versi terbaru portal web OS mendukung penyandingan kunci sandi yang tidak ada selama Windows 10 RTM. "Win 10 IoT-Core:Bluetooth Universal Windows Serial App" membahas penyandingan dalam konteks ini secara mendetail.
Memulai proyek
Project aplikasi dibuat menggunakan Visual Studio 2015 menggunakan template aplikasi Universal Windows:
Proyek Baru-->Visual C#->Windows->Aplikasi Kosong (Universal Windows)
Membuat UI Aplikasi
UI diimplementasikan dalam XAML
Buat UI sesuai tata letak seperti di atas (atau serupa):
UI cukup lurus ke depan dan dibuat sebagai berikut:
- Semua elemen teks adalah TextBlocks kecuali SendText yang merupakan TextBox
- SendText menerima CarriageReturn (yaitu Multiline)
- Teks Recvd telah mengaktifkan WrapText (yaitu Multiline)
- Elemen UI diatur dalam baris menggunakan StackPanel yang disetel ke orientasi horizontal
- StackPanel ini kemudian ditumpuk dengan StackPanel yang disetel ke orientasi vertikal, bersama dengan ListBox.
Anda mungkin lebih suka menata UI menggunakan Relative StackPanels atau menggunakan baris dan kolom Grid dll.
ConnectDevices adalah ListBox dengan Sumber Binding yang disetel ke PairedDevices(lihat nanti ) dan ItemTemplate yang terdiri dari TextBlock yang terikat ke properti Name dari PairedDevices (lihat nanti ).
Konfigurasi Aplikasi
- Aplikasi ini tidak menggunakan fitur IOT-Core sehingga tidak memerlukan Referensi Ekstensi apa pun.
- Aplikasi akan memerlukan beberapa kemampuan khusus untuk Bluetooth dan Serial yang ditambahkan ke Package.appxmanifest.
- Sayangnya, UI yang Anda dapatkan untuk ini jika Anda mengklik dua kali file itu di Solution Explorer tidak mendukung penambahan kemampuan ini dan karenanya Anda perlu menambahkannya secara manual dengan mengklik kanan file di Solution Explorer dan pilih Buka Dengan->Editor XML.
Ubah bagian kemampuan (di bagian bawah) menjadi:
Kemampuan internetClient sudah ada. Ini tidak diperlukan untuk aplikasi ini sehingga Anda mungkin ingin menghapusnya. Aku meninggalkannya.
Pada awal aplikasi, perangkat yang dipasangkan dihitung menggunakan:
DeviceInformationCollection DeviceInfoCollection
=menunggu DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));
Koleksi ini kemudian diubah menjadi ObservableCollection yang dapat digunakan dalam ListBox:
_pairedDevices =new ObservableCollection();
DeviceInfoCollection diulang melalui pembuatan PairedDeviceInfo objek untuk setiap item yang kemudian ditambahkan ke _pairedDevices koleksi.
Info Perangkat Berpasangan adalah kelas dengan properti:
Nama
Id
DeviceInfo
Kelas memiliki konstruktor yang sesuai.
Informasi Perangkat adalah Windows.Devices.Enumeration.DeviceInformation
Di kotak daftar perangkat yang dipasangkan, Nama bidang (terikat) ditampilkan.
Saat perangkat dipilih (diklik dua kali), DeviceInformation titik akhir sebenarnya adalah bagian dari item menu yang dipilih dan digunakan untuk membuat koneksi.
Koneksi
DeviceInformation digunakan untuk mendapatkan layanan RFCOMM. Koneksi kemudian dibuat sebagai StreamSocket menggunakan Endpoint HostName (sebenarnya Bluetooth Mac Address-nya) dan string ServiceName.
_service =menunggu RfcommDeviceService.FromIdAsync(DeviceInfo.Id);_socket =new StreamSocket();menunggu _socket.ConnectAsync(_service.ConnectionHostName, _service.ConnectionServiceName);
Jika semuanya baik-baik saja maka kita memiliki koneksi .. socket akan bermakna (bukan null).
Tentu saja ini adalah kesalahan yang terjebak (try-catch)
Kirim teks dan Terima teks menggunakan properti InputStream dan OutputStream soket.
Terima Teks
Menerima teks harus dimulai terlebih dahulu karena berjalan sebagai utas terpisah. Ini menjalankan async wait untuk mendapatkan input serial, menangani input kemudian menjalankan penerimaan serial async lainnya .. semua dalam satu lingkaran. Ini terus berulang hingga pembatalan dibuat.
private async void Listen(){ ReadCancellationTokenSource =new CancellationTokenSource(); if (_socket.InputStream !=null) { dataReaderObject =new DataReader(_socket.InputStream); // tetap membaca input serial while (true) { menunggu ReadAsync(ReadCancellationTokenSource.Token); } }}DataReader dataReaderObject;Private CancellationTokenSource ReadCancellationTokenSource;Private async Task ReadAsync(CancellationToken CancellationToken){ uint ReadBufferLength =1024; // Jika pembatalan tugas diminta, patuhi CancellationToken.ThrowIfCancellationRequested(); // Atur InputStreamOptions untuk menyelesaikan operasi baca asinkron ketika satu atau lebih byte tersedia dataReaderObject.InputStreamOptions =InputStreamOptions.Partial; // Buat objek tugas untuk menunggu data di serialPort.InputStream loadAsyncTask =dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken); // Luncurkan tugas dan tunggu UInt32 byteRead =menunggu loadAsyncTask; if (byteRead> 0) { string recvdtxt =dataReaderObject.ReadString(bytesRead); }}
Kirim Teks
Sementara teks yang diterima dilakukan secara asinkron karena kedatangan teks bersifat nondeterministik dari perspektif aplikasi, teks yang dikirim ditindaklanjuti dari UI aplikasi dan pada dasarnya sinkron (walaupun menunggu digunakan untuk mengosongkan UI).
private async void Send(string msg){ Task storeAsyncTask; DataWriter dataWriteObject =new DataWriter(_socket.OutputStream); dataWriteObject.WriteString(msg); // Luncurkan tugas asinkron untuk menyelesaikan operasi tulis storeAsyncTask =dataWriteObject.StoreAsync().AsTask(); UInt32 byteWritten =menunggu storeAsyncTask;}
Tombol perintah diaktifkan dan dinonaktifkan tergantung pada status aplikasi. Misalnya tombol Kirim dan Mulai Penerimaan dinonaktifkan saat aplikasi tidak terhubung tetapi diaktifkan saat aplikasi terhubung, dll.
Menikmati! :)
Kode
iotbluetoothserial di Github
Juga di Codeplex (mirror)https://iotgenbluetoothserialuwa.codeplex.com/https://github.com/djaus2/iotbluetoothserial