Bluetooth Serial Mulus pada Raspberry Pi 2 dengan Windows 10 IoT Core
Komponen dan Perlengkapan
Raspberry Pi 2 Model B
×
1
Bluetooth USB Dongle generik
×
1
Arduino UNO
×
1
SparkFun Bluetooth Modem - BlueSMiRF Silver
×
1
Aplikasi dan Layanan Online
Microsoft Windows 10 IoT Core
Microsoft Visual Studio 2015
Tentang Proyek Ini
Selengkapnya
Proyek ini dibahas secara detail di embedded101.com:
"Win 10 IoT-Core: Bluetooth Universal Windows Serial App"
Tentang
Proyek ini adalah Universal Windows App yang menghubungkan perangkat IoT-Core seperti Raspberry PI 2 ke perangkat Bluetooth terembed melalui Profil Serial Bluetooth menggunakan dongle USB Bluetooth genetik.
Latar Belakang
Bluetooth mendukung jaringan peer-to-peer pada jarak dekat. Berbeda dengan 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 mentransfer data mentah antara mereka. Umumnya walaupun, konektivitas Bluetooth adalah asimetris dengan satu ujung menghasilkan format data tertentu untuk dikonsumsi di ujung lainnya. Misalnya ponsel seluler dapat menerapkan Profil A2DP (Advanced Audio Distribution Profile) dan memstreaming audio ke headset yang menerapkan Profil HSP (Headset). OBEX (Object Exchange) adalah koneksi simetris antara dua perangkat saat mereka bertukar data antara mereka.
Proyek Contoh Bluetooth Microsoft IOT-Core menggunakan profil GATT (Generic Attribute Profile Profile). Ini menyediakan layanan penemuan dan deskripsi profil untuk protokol Bluetooth Low Energy. Dengan protokol ini perangkat daya rendah sederhana dapat terhubung di satu ujung menghasilkan data untuk dikonsumsi oleh prosesor kompleks.
Ini adalah proyek yang jauh lebih sederhana daripada contoh Microsoft. Ini hanya terkait dengan profil SPP (Serial Port Profile) yang lebih generik yang didasarkan pada profil RFCOMM. Ini dikembangkan dengan dongle USB Bluetooth yang sangat lama dan seharusnya bekerja dengan semua dongle Bluetooth.
Aplikasi IoT
Aplikasi ini adalah aplikasi tes Bluetooth Serial Universal Windows (Windows 10) sederhana. Ini dimulai dengan memetapkan (sebagai daftar) semua perangkat Bluetooth yang dipasangkan dengan perangkat tempat aplikasi berjalan. Salah satu dipilih dengan double klik yang memulai koneksi. Teks untuk dikirim dimasukkan di Textbox dan dikirim saat tombol ditekan. Aplikasi secara otomatis menerima teks apa pun yang dikirim kepadanya ( dan menampilkannya). Oleh karena itu ketika titik akhir (seperti di atas) hanya mengomori teks yang diterimanya, teks yang dikirim seharusnya muncul kembali di kotak penerimaan pada aplikasi UW.
Titik Akhir
Untuk pengujian Arduino Uno dengan adapter Bluetooth digunakan. Ini memiliki shield sederhana yang hanya mengomori kembali karakter apa pun yang diterimanya melalui koneksi Bluetooth:
Pengaturan Shield:
// A serial loop back app // Past setup // Initiated by connected system // Note can be used with Bluetooth where the RxTx of the BT device // are connected to the TxRx of the Arduino board. // Need to disconnect BT adapter for programming though. void setup() { // My adapter is set to this BAUD 115200 // This is the Arduino to BT adapter port rate // Set when the BT adapter is in command mode. // Its NOT the BT rate which you can't set. Serial.begin(115200); delay(333); while (!Serial) ; delay(1000); Serial.println("The quick brown fox jumps over the lazy dog!"); }
Bluetooth adalah skenario peer to peer. Sebelum mereka dapat terhubung melalui Bluetooth mereka harus dipasangkan. Ini tidak dilakukan dalam aplikasi. Pasangan dengan passkey dapat bermasalah antara perangkat terembed karena mereka sering tidak memiliki layar dan mungkin tidak mendukung popup (seperti yang tidak dilakukan IoT-Core). Ada portal web IoT-Core untuk melakukan ini serta utilitas command line di perangkat yang dapat dijalankan melalui shell SSH. Versi terbaru dari portal web OS mendukung passkey pairing yang hilang sekitar waktu Windows 10 RTM. "Win 10 IoT-Core: Bluetooth Universal Windows Serial App" membahas pasangan dalam konteks ini secara detail.
Memulai Proyek
Proyek aplikasi dibuat menggunakan di Visual Studio 2015 menggunakan template aplikasi Universal Windows:
New Project-->Visual C#->Windows->Blank App (Universal Windows)
Membuat UI Aplikasi
UI diimplementasikan dalam XAML
Buat UI sesuai tata letak di atas (atau serupa):
UI cukup sederhana dan dibuat sebagai berikut:
Semua elemen teks adalah TextBlock kecuali SendText yang merupakan TextBox
SendText menerima CarriageReturn (ie adalah Multiline)
Teks Recvd memiliki WrapText diaktifkan (ie adalah Multiline)
Elemen UI diorganisir dalam baris menggunakan StackPanel dengan orientasi horizontal
StackPanel ini kemudian ditumpuk dengan StackPanel dengan orientasi vertikal, bersama dengan ListBox.
Anda mungkin lebih suka menata UI menggunakan StackPanel Relatif atau menggunakan baris dan kolom Grid dll.
ConnectDevices adalah ListBox dengan Binding Source yang diatur ke PairedDevices(lihat selanjutnya) dan ItemTemplate yang terdiri dari TextBlock yang terikat ke properti Name dari PairedDevices (lihat selanjutnya).
Aplikasi tidak menggunakan fitur IoT-Core jadi tidak akan memerlukan Referensi Ekstensi.
Aplikasi akan memerlukan beberapa kemampuan spesifik untuk Bluetooth dan Serial ditambahkan ke Package.appxmanifest.
Sayangnya, UI yang Anda dapatkan untuk ini jika Anda double klik pada file itu di Solution Explorer tidak mendukung penambahan kemampuan ini jadi Anda perlu menambahkannya secara manual dengan klik kanan pada file di Solution Explorer dan pilih Open With->XML Editor.
Koleksi ini kemudian diubah menjadi ObservableCollection yang dapat digunakan di ListBox:
_pairedDevices = new ObservableCollection<PairedDeviceInfo>();
DeviceInfoCollection diiterasi untuk membuat objek PairedDeviceInfo untuk setiap item yang kemudian ditambahkan ke koleksi _pairedDevices.
PairedDeviceInfo adalah kelas dengan properti:
Name <string>
Id <string>
DeviceInfo <DeviceInformation>
Kelas memiliki konstruktor yang sesuai.
DeviceInformation adalah Windows.Devices.Enumeration.DeviceInformation
Di listbox perangkat yang dipasangkan, bidang Name (terikat) ditampilkan.
Saat perangkat dipilih (double klik) DeviceInformation titik akhir sebenarnya merupakan bagian dari item menu yang dipilih dan digunakan untuk menentukan koneksi.
Koneksi
DeviceInformation digunakan untuk mendapatkan layanan RFCOMM. Koneksi kemudian ditetapkan sebagai StreamSocket menggunakan Endpoint HostName (sebenarnya adalah alamat MAC Bluetooth) dan string ServiceName.
Jika semuanya baik maka kita memiliki koneksi .. soket akan bermakna (tidak null).
Tentu saja ini ditangkap kesalahan (try-catch)
Kirim tekan dan Terima teks menggunakan properti InputStream dan OutputStream soket.
Terima Teks
Penerimaan teks harus dimulai terlebih dahulu karena berjalan sebagai thread terpisah. Ini menjalankan async wait untuk mendapatkan input serial, menangani input lalu menjalankan async serial receive lainnya .. semuanya dalam loop. Loop ini berlanjut terus hingga pembatalan dihasilkan.
private async void Listen() { ReadCancellationTokenSource = new CancellationTokenSource(); if (_socket.InputStream != null) { dataReaderObject = new DataReader(_socket.InputStream); // keep reading the serial input while (true) { await ReadAsync(ReadCancellationTokenSource.Token); } } } DataReader dataReaderObject; private CancellationTokenSource ReadCancellationTokenSource; private async Task ReadAsync(CancellationToken cancellationToken) { uint ReadBufferLength = 1024; // If task cancellation was requested, comply cancellationToken.ThrowIfCancellationRequested(); // Set InputStreamOptions to complete the asynchronous read operation when one or more bytes is available dataReaderObject.InputStreamOptions = InputStreamOptions.Partial; // Create a task object to wait for data on the serialPort.InputStream loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken); // Launch the task and wait UInt32 bytesRead = await loadAsyncTask; if (bytesRead > 0) { string recvdtxt = dataReaderObject.ReadString(bytesRead); } }
Kirim Teks
Sementara teks yang diterima dilakukan secara asinkron karena kedatangan teks tidak deterministik dari sudut pandang aplikasi, teks yang dikirim dilakukan dari UI aplikasi dan pada dasarnya sinkron (meskipun await digunakan untuk membebaskan UI).
private async void Send(string msg) { Task storeAsyncTask; DataWriter dataWriteObject = new DataWriter(_socket.OutputStream); dataWriteObject.WriteString(msg); // Launch an async task to complete the write operation storeAsyncTask = dataWriteObject.StoreAsync().AsTask(); UInt32 bytesWritten = await storeAsyncTask; }
Status Tombol
Tombol perintah diaktifkan dan dinonaktifkan tergantung pada status aplikasi. Misalnya tombol Send dan Start Recv dinonaktifkan saat aplikasi tidak terhubung tetapi diaktifkan saat aplikasi terhubung, dll.
Nikmati! :)
Kode
iotbluetoothserial on Github
Bisa juga di Codeplex (mirror) https://iotgenbluetoothserialuwa.codeplex.com/ https://github.com/djaus2/iotbluetoothserial