"Marina apa?" atau kami mengontrol pengontrol via bluetooth menggunakan aplikasi seluler di Xamarin (Android)

Dalam artikel sebelumnya , saya berjanji untuk berbicara tentang cara menghubungkan CANNY 3 mungil menggunakan UART ke bluetooth. Dan karena Anda tidak benar-benar berjalan-jalan di liburan Mei ini, diputuskan untuk menghabiskan waktu dengan manfaat dan tetap menepati janji. Tetapi hanya untuk menghubungkan controller ke adaptor Bluetooth HC-06, itu akan terlalu mudah untuk Habr.

Oleh karena itu, kami tidak hanya akan menghubungkan semuanya, tetapi kami juga akan menulis aplikasi Android primitif untuk rangkaian kami menggunakan C # dan Xamarin.

Jika Anda suka memantau "limit switch" dan buluh switch, seperti yang saya suka, Anda dipersilakan di bawah kucing.



Inilah yang akan kita bicarakan hari ini:

Bagian I: Pendahuluan
Bagian II: Menghubungkan sirkuit dan program untuk CANNY 3 mungil
Bagian III: Kami menulis aplikasi di Xamarin untuk Android
Bagian IV: Kesimpulan

Bagian I: Pendahuluan


Saya akan mulai dengan yang bagus, kecuali untuk penyisipan kode program dalam C #, maka kali ini artikelnya akan relatif kecil, karena kami telah memeriksa teknik dasar bekerja dengan controller sebelumnya. Agar tidak mengulangi sekali lagi, berikut adalah daftar artikel di mana kami telah memeriksa metode dasar bekerja dengan pengontrol CANNY:

  1. "Satu, dua, tiga - bakar pohon Natal!" atau tampilan pertama saya di CANNY 3 controller kecil - dalam artikel ini kami menganalisis apa controller itu, serta dasar-dasar bekerja di lingkungan pengembangan CannyLab.
  2. "Destinasi memiliki banyak kedok ..." atau kami mengotomatisasi kontrol lampu menggunakan CANNY 3 mungil dan photoresistor - dalam artikel ini kami melihat bekerja dengan USB Virtual COM-port, menghubungkan sensor ke ADC, serta PWM frekuensi tinggi pada output pengontrol.
  3. Β« ...Β» (CANNY Arduino) Raspberry PI β€” UART, .

Dalam mempersiapkan artikel ini, saya menggunakan perangkat keras berikut: CANNY 3 controller kecil, HC-06 bluetooth adapter, limit switch (trailer modul Trema), saklar buluh, headphone kabel tua, papan tempat memotong roti, kabel, buaya.

Kami akan membangun sistem yang, menggunakan aplikasi seluler, memantau status dua sensor dan, jika perlu, dapat membunyikan alarm secara manual.

Segala sesuatu yang akan disajikan dalam artikel ini diciptakan murni untuk tujuan pendidikan dan demonstrasi. Saya hanya ingin menunjukkan beberapa trik bekerja dengan controller, serta untuk potongan-potongan besi yang dibeli pada suatu waktu entah bagaimana caranya mengetahui nilainya.

Terlepas dari sifat masalah yang sedang dipecahkan, yang jauh dari kenyataan, kita akan membayangkan bahwa kita sedang membuat sistem pemantauan di balik pintu geser kompartemen. Ketika mulai bergerak, saklar buluh akan bekerja, dan di ujung jalan itu akan memberi sinyal ke trailer. Jika kita perlu menarik perhatian, misalnya, agar pintu tertutup kembali, kita akan memberikan sinyal "mencicit" melalui pengeras suara. Benar, saya tidak punya speaker, tetapi ada headphone lama.



Baik dan, seperti biasa, sebuah catatan. Saya sangat tidak merekomendasikan menggunakan materi dalam artikel ini sebagai kebenaran pamungkas. Saya melakukan banyak hal untuk pertama kalinya, saya sendiri pasti bisa melakukannya dengan lebih baik.


Bagian II: Menghubungkan sirkuit dan program untuk CANNY 3 mungil


Untuk memulai, agar tidak menyinggung siapa pun dalam hak cipta, saya meminjam dari forum , tetapi saya sendiri mengadaptasinya untuk ide menghubungkan controller ke HC-06, dengan mengendalikannya melalui aplikasi "Serial bluetooth terminal" dan beberapa trik ketika mengembangkan diagram. tugas Anda.

Diagram koneksi adalah sebagai berikut:



Saklar batas dan sakelar buluh dihubungkan ke terminal pengontrol No. 6 dan No. 5, headphone ke terminal No. 4 (memiliki RF PWM), UART RX adalah terminal No. 1, UART TX adalah terminal No. 2, terminal No. 3 Ini digunakan untuk memasok "+ 5V", output "-" - untuk komunikasi dengan "ground".

Begini tampilannya dalam perakitan:



Saya mengembangkan diagram (program) untuk CANNY 3 tiny di CannyLab versi 1.42, mungkin di versi lain dari lingkungan pengembangan dan dengan pengontrol lain, akan perlu untuk membuat perubahan pada diagram.

Inilah yang terjadi:



Blok yang terkait dengan pengaturan controller dan mengirim pesan melalui UART dibongkar di artikel sebelumnya .

Mari kita periksa lebih detail dua yang tersisa.

Blok β€œ Terima pesan UART ” bertanggung jawab untuk menyalakan sirene (headphone). Pada prinsipnya, diperlukan untuk mem-parse contoh menerima pesan melalui UART.

Pertama, kami memeriksa apakah data yang diterima ada di UART, jika demikian, maka kami mengirim satu ke input pemicu D "E", dalam hal ini pemicu menyalin nilai dari input "D" di mana kami akan menulis dua karakter pertama dari pesan yang diterima melalui UART. Saya tidak ingin menyulitkan semuanya, jadi kami akan menggunakan skema sederhana lebih lanjut. Kami berasumsi bahwa angka 00 hingga 99 akan datang kepada kami oleh UART, kami akan menerjemahkan angka ini dari bentuk simbolis ke angka numerik (saya sarankan membaca cara kerja blok konverter , saya punya sedikit "plug" dengan itu) Lebih lanjut, setiap nilai "> 0" pada input detektor tepi utama menyebabkan sinyal tunggal, yang menyalakan output 5 selama 5 detik, beroperasi dalam mode RF PWM.

Anda dapat bermain dalam pengaturan dengan periode pengisian RF PWM, suara di headphone akan tergantung pada ini.

Mari kita lanjutkan ke blok"Pembentukan pesan . " Penerapannya sekilas mungkin tampak tidak biasa. Ini dijelaskan oleh fakta bahwa saya tidak benar-benar mencari cara untuk bekerja dengan program terminal Serial bluetooth dan dengan protokol bluetooth yang sama di Xamarin.

Saya akan berlari sedikit ke depan dan mengatakan bahwa saya belum belajar bagaimana menerima pesan yang dikirim dari pengontrol di ponsel cerdas saya. Jika semuanya jelas dengan kabel UART di artikel terakhir, maka dengan Bluetooth, dalam prakteknya, bukannya pesan yang dikirim, hanya bagiannya yang dapat dibaca dan makna dari perintah yang dikirimkan dilanggar.

Saya memutuskan bahwa solusi paling sederhana adalah mengirimkan satu nomor, yang dijamin untuk mencapai penerima tanpa kehilangan.

Dalam kasus kami, kami memantau keadaan diskrit dari sakelar buluh dan sakelar batas. Artinya, kita hanya memiliki 4 kemungkinan kombinasi: saklar buluh dan saklar batas mati, hanya satu yang aktif, keduanya aktif.

Karena saklar buluh dan saklar batas memberikan sinyal diskrit (0/1), Anda perlu membedakannya. Untuk melakukan ini, kita mengalikan nilai sinyal buluh dengan 2. Sekarang ternyata jumlah sinyal akan memberi kita nilai dari 0 hingga 3.

Sekarang kita akan menganalisis opsi yang tidak jelas dengan lima puluh ditambahkan ke nilai ini. Faktanya adalah CannyLab mengirim beberapa karakter ke UART, yaitu bukannya 3, katakanlah 03, tetapi seperti yang saya katakan ada risiko kehilangan beberapa informasi. Misalnya, dari nilai 01, program pada ponsel cerdas hanya dapat membaca "0" pertama, dan ini sudah merupakan kesalahan.

Mungkin akan membingungkan dan mengubah data, menggantikan, misalnya, karakter "D1" dari register dengan beberapa huruf atau spasi, tetapi saya memutuskan untuk membuatnya lebih mudah. Saya mengonversi nilai 01 menjadi 51 (02 hingga 52, dll.). Kelima tidak membawa sinyal dan saya hentikan itu di tingkat program untuk smartphone. Dengan demikian, kami selalu menjamin bahwa bagian pesan yang berguna tetap ada.

Kami memuat program ke controller, klik "run", jika semuanya berjalan sesuai rencana, maka HC-06 akan secara berkala mem-flash LED merah.

Selanjutnya, kami memasangkan smartphone dengan adaptor. Sekarang Anda dapat memeriksa kinerja di aplikasi "terminal Bluetooth Serial" atau yang lainnya dengan fungsi serupa.

Tuliskan alamat adaptor Bluetooth, itu akan berguna bagi kita di bab berikutnya.



Seperti yang Anda lihat, datanya datang, tergantung pada keadaan sensor, dan jika Anda mengirim "11", maka suara mencicit terdengar di headphone. Kita bisa berhenti di sini, tetapi mari kita buat sketsa aplikasi primitif.

Program untuk pengontrol dan kode sumber program untuk telepon pintar dapat diunduh dari GitHub.

Saya ingin mencatat bahwa Anda tidak harus mengimplementasikan semuanya dalam perangkat keras khususnya pada pengontrol CANNY, Anda dapat menulis sebuah program untuk Arduino atau pengontrol lain yang Anda suka. Awalnya, saya sendiri juga berencana untuk menulis versi tambahan sketsa untuk Arduino, tetapi karena saya membunuh hampir semua liburan Mei, saya tidak lagi memiliki kekuatan untuk menghubungkan CANNY dan aplikasi smartphone.

Bagian III: Menulis Aplikasi Android Xamarin


Saya tahu bahwa Xamarin, secara sederhana, bukanlah solusi yang paling populer untuk pengembangan ponsel. Dan mungkin Anda sudah memiliki pertanyaan: "Mengapa saya memilihnya?" . Saya ingin menjawabnya dengan kata-kata dari lagu dengan nama yang sama oleh Psoya Korolenko:



Jujur, tidak ada alasan obyektif. Hanya beberapa tahun yang lalu saya mempelajari dasar-dasar C # dan semua orang ingin melihat apa itu Xamarin. Dan sekarang, karena "isolasi diri", tangan akhirnya mencapai.

Baiklah, izinkan saya mengingatkan Anda lagi. Ini adalah pertama kalinya saya bertemu Xamarin dan ini adalah aplikasi Android pertama saya. Jangan menyalin kode kurva saya secara membabi buta, jika tiba-tiba Anda dapat menemukan solusi yang lebih indah, gunakan itu.

Ketika mengembangkan program saya, saya mengandalkan materi ini. Artikel ini tidak terlalu dikunyah, dan bahkan dalam bahasa Spanyol, jadi saya masih merasa pantas untuk berbagi dengan Anda variasi saya tentang topik ini.

Saya membangun program dalam edisi komunitas Visual studio 2019.

Pertama-tama, buat proyek Android kosong baru (Xamarin), seperti pada gambar.



Saya membuat perubahan hanya dalam tiga file, semuanya dapat dilihat sepenuhnya di GitHub , dan di sini kami hanya akan menganalisis bagian-bagian penting: Izin

AndroidManifest.xml

2 ditambahkan ke templat standar:

  <uses-permission android:name="android.permission.BLUETOOTH"/>
  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

activity_main.xml
Wadah default (RelativeLayout) telah dihapus. Sebaliknya, wadah LinearLayout ditambahkan hanya karena lebih sederhana. Dalam wadah ini, semua elemen disejajarkan secara vertikal, membentang di seluruh lebar layar.

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:minWidth="25px"
    android:minHeight="25px"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/linearLayout1">
    <TextView
        android:text="Reed switch status - undefined"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/rSwitch"
        android:textSize="12pt" />
    <TextView
        android:text="End sensor status - undefined"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/EndSensor"
        android:textSize="12pt" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/startSiren"
        android:text="Send signal to siren" />
    <Switch
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bltSwitch"
        android:checked="false"
        android:showText="true"
        android:text="Connect bluetooth" />
    <TextView
        android:text="status"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/status" />
</LinearLayout>

Siapa pun yang sedikit terbiasa dengan tata letak HTML atau XML dapat dengan mudah memahami struktur antarmuka pengguna. Kami memiliki tiga bidang teks hanya baca (TextView), satu sakelar (Switch), yang pada dasarnya berfungsi seperti kotak centang dan satu tombol biasa (Tombol). Elemen dapat ditempatkan pada formulir dengan menyeret dan menjatuhkan dari konstruktor, dan di jendela properti atau dalam kode untuk mengatur mereka Id lebih nyaman, bertopik teks dan parameter lainnya.

Masih menjelaskan logika program.

MainActivity.cs

Di bawah ini, di bawah spoiler, seluruh kode untuk kenyamanan

Kode MainActivity.cs Lengkap
// based on http://alejandroruizvarela.blogspot.com/2014/01/bluetooth-arduino-xamarinandroid.html
// for this article https://habr.com/ru/post/500454/


// based on http://alejandroruizvarela.blogspot.com/2014/01/bluetooth-arduino-xamarinandroid.html
// for this article https://habr.com/ru/post/500454/


using Android.App;
using Android.OS;
using Android.Support.V7.App;
using Android.Runtime;
using Android.Widget;
using System.Linq;
using System;
using System.IO;
using Java.Util;
using Android.Bluetooth;
using System.Threading.Tasks;

namespace _6.Canny_Xanarin_Bluetooth_Android
{
    [Activity(Label = "Control Canny 3 tiny via bluetooth", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {

        Button startSiren;
        TextView rSwitch;
        TextView EndSensor;
        Switch bltSwitch;
        TextView status;
        private Java.Lang.String dataToSend;
        private BluetoothAdapter mBluetoothAdapter = null;
        private BluetoothSocket btSocket = null;
        private Stream outStream = null;
        // don't forget change addres to your device:
        private static string address = "98:D3:91:F9:6C:F6";
        // MY_UUID can be saved as is
        private static UUID MY_UUID = UUID.FromString("00001101-0000-1000-8000-00805F9B34FB");
        private Stream inStream = null;


        protected override void OnCreate(Bundle savedInstanceState)
        {

            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);

            startSiren = FindViewById<Button>(Resource.Id.startSiren);
            rSwitch = FindViewById<TextView>(Resource.Id.rSwitch);
            EndSensor = FindViewById<TextView>(Resource.Id.EndSensor);
            status = FindViewById<TextView>(Resource.Id.status);
            bltSwitch = FindViewById<Switch>(Resource.Id.bltSwitch);


            startSiren.Click += startSiren_ClickOnButtonClicked;
            bltSwitch.CheckedChange += bltSwitch_HandleCheckedChange;
            CheckBt();
        }

        private void CheckBt()
        {
            mBluetoothAdapter = BluetoothAdapter.DefaultAdapter;

            if (!mBluetoothAdapter.Enable())
            {
                Toast.MakeText(this, "Bluetooth Off",
                    ToastLength.Short).Show();
            }

            if (mBluetoothAdapter == null)
            {
                Toast.MakeText(this,
                    "Bluetooth does not exist or is busy", ToastLength.Short)
                    .Show();
            }
        }

        void startSiren_ClickOnButtonClicked(object sender, EventArgs e)
        {
            if (bltSwitch.Checked)
            {
                try
                {
                    dataToSend = new Java.Lang.String("11");
                    writeData(dataToSend);
                    System.Console.WriteLine("Send signal to siren");
                }
                catch (System.Exception execept)
                {
                    System.Console.WriteLine("Error when send data" + execept.Message);
                }

            }
            else status.Text = "bluetooth not connected";
        }
        void bltSwitch_HandleCheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
        {
            if (e.IsChecked)
            {
                Connect();
            }
            else
            {
                status.Text = "bluetooth not connected";
                if (btSocket.IsConnected)
                {
                    try
                    {
                        btSocket.Close();
                        System.Console.WriteLine("Connection closed");
                    }
                    catch (System.Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
            }
        }

        public void Connect()
        {
            BluetoothDevice device = mBluetoothAdapter.GetRemoteDevice(address);
            System.Console.WriteLine("Connection in progress" + device);
            mBluetoothAdapter.CancelDiscovery();
            try
            {
                btSocket = device.CreateRfcommSocketToServiceRecord(MY_UUID);
                btSocket.Connect();
                System.Console.WriteLine("Correct Connection");
                status.Text = "Correct Connection to bluetooth";
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
                try
                {
                    btSocket.Close();
                    System.Console.WriteLine("Connection closed");
                }
                catch (System.Exception)
                {
                    System.Console.WriteLine("Impossible to connect");
                    status.Text = "Impossible to connect";
                }
                System.Console.WriteLine("Socket Created");
  
            }
            beginListenForData();

        }

        public void beginListenForData()
        {
            try
            {
                inStream = btSocket.InputStream;
            }
            catch (System.IO.IOException ex)
            {
                Console.WriteLine(ex.Message);
            }
            Task.Factory.StartNew(() => {
                byte[] buffer = new byte[1024];
                int bytes;
                
                while (true)
                {

                    try
                    {
                        bytes = inStream.Read(buffer, 0, 1024);
                        System.Console.WriteLine("bytes " + bytes.ToString());
                        if (bytes > 0)
                        {
                            
                            RunOnUiThread(() => {
                                string valor = System.Text.Encoding.ASCII.GetString(buffer).Replace("5",String.Empty);
                                // transform string for deleate all symbols except 1-4(command from canny).
                                string command = new string(valor.Where(char.IsDigit).ToArray());

                                if (command.Length > 0)
                                {
                                     status.Text="data successfully readed";
                                    System.Console.WriteLine("command  " + command);
                                    switch (Int32.Parse(command))
                                    {
                                        case 0:
                                            rSwitch.Text = "reed switch - disconnected ";
                                            EndSensor.Text = "end sensor - not pressed ";
                                            break;
                                        case 1:
                                            rSwitch.Text = "reed switch - disconnected ";
                                            EndSensor.Text = "end sensor - pressed ";
                                            break;
                                        case 2:
                                            rSwitch.Text = "reed switch - connected ";
                                            EndSensor.Text = "end sensor - not pressed ";
                                            break;
                                        case 3:
                                            rSwitch.Text = "reed switch - connected ";
                                            EndSensor.Text = "end sensor - pressed ";
                                        break;
                                    }
                                }
                            });
                        }
                    }
                    catch (Java.IO.IOException)
                    {
                        RunOnUiThread(() => {
                            EndSensor.Text = "End sensor status - undefined";
                            rSwitch.Text = "Reed switch status - undefined ";
                        });
                        break;
                    }
                }
            });
        }

        private void writeData(Java.Lang.String data)
        {
            try
            {
                outStream = btSocket.OutputStream;
            }
            catch (System.Exception e)
            {
                System.Console.WriteLine("Error with OutputStream when write to Serial port" + e.Message);
            }

            Java.Lang.String message = data;

            byte[] msgBuffer = message.GetBytes();

            try
            {
                outStream.Write(msgBuffer, 0, msgBuffer.Length);
                System.Console.WriteLine("Message sent");
            }
            catch (System.Exception e)
            {
                System.Console.WriteLine("Error with  when write message to Serial port" + e.Message);
                status.Text = "Error with  when write message to Serial port";
            }
        }


    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
 }


Sekarang di beberapa bagian.

Blok dengan koneksi ruang nama, deklarasi kelas, dll. Aku akan merindukan.
 

Kami membuat variabel yang nantinya akan kami ikat dengan elemen antarmuka pengguna:

   Button startSiren;
   TextView rSwitch;
   TextView EndSensor;
   Switch bltSwitch;
   TextView status;

Berikutnya adalah kode dari contoh yang saya andalkan. Variabel (bidang) yang diperlukan untuk pengoperasian metode tertentu.

  private Java.Lang.String dataToSend;
        private BluetoothAdapter mBluetoothAdapter = null;
        private BluetoothSocket btSocket = null;
        private Stream outStream = null;
        // don't forget change addres to your device:
        private static string address = "98:D3:91:F9:6C:F6";
        // MY_UUID can be saved as is
        private static UUID MY_UUID = UUID.FromString("00001101-0000-1000-8000-00805F9B34FB");
        private Stream inStream = null;

Penting bagi kami di sini untuk mengarahkan alamat modul HC-06 Anda ke bidang alamat.

Karena ini adalah pengalaman pengembangan pertama saya untuk ponsel cerdas, termasuk bekerja dengan Xamarin, saya memutuskan untuk tidak mempersulit apa pun, sehingga alamat perangkat, seperti dalam contoh asli, diperbaiki. Jika mau, Anda bisa melihat artikel ini , sepertinya sudah ada enumerasi perangkat Bluetooth yang tersedia.

Berpindah.


        protected override void OnCreate(Bundle savedInstanceState)
        {

            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);

            startSiren = FindViewById<Button>(Resource.Id.startSiren);
            rSwitch = FindViewById<TextView>(Resource.Id.rSwitch);
            EndSensor = FindViewById<TextView>(Resource.Id.EndSensor);
            status = FindViewById<TextView>(Resource.Id.status);
            bltSwitch = FindViewById<Switch>(Resource.Id.bltSwitch);


            startSiren.Click += startSiren_ClickOnButtonClicked;
            bltSwitch.CheckedChange += bltSwitch_HandleCheckedChange;
            CheckBt();
        }

Metode ini dibuat secara otomatis, tugas kami adalah untuk mengaitkan objek UI di dalamnya dengan bidang kelas, dan juga melampirkan penangan untuk reaksi terhadap peristiwa ( startSiren.Click bltSwitch.CheckedChange).

Memeriksa koneksi melalui Bluetooth:


        private void CheckBt()
        {
            mBluetoothAdapter = BluetoothAdapter.DefaultAdapter;

            if (!mBluetoothAdapter.Enable())
            {
                Toast.MakeText(this, "Bluetooth Off",
                    ToastLength.Short).Show();
            }

            if (mBluetoothAdapter == null)
            {
                Toast.MakeText(this,
                    "Bluetooth does not exist or is busy", ToastLength.Short)
                    .Show();
            }
        }

Nyalakan sirene. Intinya hanya mengirim karakter "11" ke controller:


   void startSiren_ClickOnButtonClicked(object sender, EventArgs e)
        {
            if (bltSwitch.Checked)
            {
                try
                {
                    dataToSend = new Java.Lang.String("11");
                    writeData(dataToSend);
                    System.Console.WriteLine("Send signal to siren");
                }
                catch (System.Exception execept)
                {
                    System.Console.WriteLine("Error when send data" + execept.Message);
                }

            }
            else status.Text = "bluetooth not connected";
        }

Memeriksa status sakelar (jika digeser ke kanan, artinya sakelar dihidupkan):

   void bltSwitch_HandleCheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
        {
            if (e.IsChecked)
            {
                Connect();
            }
            else
            {
                if (btSocket.IsConnected)
                {
                    try
                    {
                        btSocket.Close();
                        System.Console.WriteLine("Connection closed");
                    }
                    catch (System.Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
            }
        }

Ketika Anda menghidupkan, kami memulai koneksi dengan Bluetooth.

Implementasi koneksi itu sendiri:

   public void Connect()
        {
            BluetoothDevice device = mBluetoothAdapter.GetRemoteDevice(address);
            System.Console.WriteLine("Connection in progress" + device);
            mBluetoothAdapter.CancelDiscovery();
            try
            {
                btSocket = device.CreateRfcommSocketToServiceRecord(MY_UUID);
                btSocket.Connect();
                System.Console.WriteLine("Correct Connection");
                status.Text = "Correct Connection to bluetooth";
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);
                try
                {
                    btSocket.Close();
                    System.Console.WriteLine("Connection closed");
                }
                catch (System.Exception)
                {
                    System.Console.WriteLine("Impossible to connect");
                    status.Text = "Impossible to connect";
                }
                System.Console.WriteLine("Socket Created");
  
            }
            beginListenForData();

        }

Dan inilah salah satu metode paling penting - membaca data secara langsung:


    public void beginListenForData()
        {
            try
            {
                inStream = btSocket.InputStream;
            }
            catch (System.IO.IOException ex)
            {
                Console.WriteLine(ex.Message);
            }
            Task.Factory.StartNew(() => {
                byte[] buffer = new byte[1024];
                int bytes;
                
                while (true)
                {

                    try
                    {
                        bytes = inStream.Read(buffer, 0, 1024);
                        System.Console.WriteLine("bytes " + bytes.ToString());
                        if (bytes > 0)
                        {
                            
                            RunOnUiThread(() => {
                                string valor = System.Text.Encoding.ASCII.GetString(buffer).Replace("5",String.Empty);
                                // transform string for deleate all symbols except 1-4(command from canny).
                                string command = new string(valor.Where(char.IsDigit).ToArray());

                                if (command.Length > 0)
                                {
                                     status.Text="data successfully readed";
                                    System.Console.WriteLine("command  " + command);
                                    switch (Int32.Parse(command))
                                    {
                                        case 0:
                                            rSwitch.Text = "reed switch - disconnected ";
                                            EndSensor.Text = "end sensor - not pressed ";
                                            break;
                                        case 1:
                                            rSwitch.Text = "reed switch - disconnected ";
                                            EndSensor.Text = "end sensor - pressed ";
                                            break;
                                        case 2:
                                            rSwitch.Text = "reed switch - connected ";
                                            EndSensor.Text = "end sensor - not pressed ";
                                            break;
                                        case 3:
                                            rSwitch.Text = "reed switch - connected ";
                                            EndSensor.Text = "end sensor - pressed ";
                                        break;
                                    }
                                }
                            });
                        }
                    }
                    catch (Java.IO.IOException)
                    {
                        RunOnUiThread(() => {
                            EndSensor.Text = "End sensor status - undefined";
                            rSwitch.Text = "Reed switch status - undefined ";
                        });
                        break;
                    }
                }
            });
        }

Saya meninggalkan banyak elemen metode seperti pada contoh, seperti yang saya pahami, pada awalnya koneksi ke aliran data dibuat, jika ada sesuatu di buffer dengan data yang dibaca, maka itu dibaca menjadi variabel valor. Selain itu, seperti yang saya janjikan, kami cukup menghapus angka "5".

Selanjutnya, kami menghapus semua karakter kecuali angka-angka dari pesan baca. string command = new string(valor.Where(char.IsDigit).ToArray());

Nah, setelah itu semuanya sederhana, tergantung pada nomor apa yang datang kepada kami, kami menampilkan status ini atau itu di UI.

Saya tidak secara mendasar mengubah dua metode ini:

  private void writeData(Java.Lang.String data)
        {
            try
            {
                outStream = btSocket.OutputStream;
            }
            catch (System.Exception e)
            {
                System.Console.WriteLine("Error with OutputStream when write to Serial port" + e.Message);
            }

            Java.Lang.String message = data;

            byte[] msgBuffer = message.GetBytes();

            try
            {
                outStream.Write(msgBuffer, 0, msgBuffer.Length);
                System.Console.WriteLine("Message sent");
            }
            catch (System.Exception e)
            {
                System.Console.WriteLine("Error with  when write message to Serial port" + e.Message);
                status.Text = "Error with  when write message to Serial port";
            }
        }


    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
 }

Seperti yang saya pahami, blok kode ini mengimplementasikan pengiriman pesan dan pengendali event untuk meningkatkan izin untuk mengakses Bluetooth.

Nah, hanya itu yang tersisa untuk mengatur koneksi ponsel cerdas untuk debug aplikasi .

Cukup aneh, tetapi berhasil:



Bagian IV: Kesimpulan


Inilah cara program bekerja dengan baik:



Itu adalah pengalaman pertama saya dalam mengembangkan aplikasi untuk smartphone di Android.

Saya ingin mencatat bahwa VS 2019 dan Xamarin pada komputer lama saya bekerja sangat lambat.

Pada pertemuan pertama proyek, saya benar-benar berhasil makan roti Prancis lembut ini dan minum teh. Juga, aplikasi itu sendiri ternyata terus terang menyedihkan, tombol on / off tidak bekerja dengan sangat mudah, tetapi di sisi lain, mengingat bahwa saya hanya sedikit akrab dengan teknik pengembangan dasar untuk .NET, dan bahwa saya bukan seorang programmer sama sekali, saya bahkan bisa tanpa melalui satu tutorial atau satu pelajaran, garis besar aplikasi pertama Anda dalam sehari. Oleh karena itu, ambang entri untuk membuat aplikasi dasar cukup rendah.

Seperti yang saya pahami, pengontrol CANNY dapat digunakan ketika menyetel mobil, terutama yang domestik, sehingga sangat mungkin untuk membuat semacam "fitur" dan menulis aplikasi untuk smartphone. Hal utama yang perlu diingat adalah bahwa ketika digerakkan dari jaringan on-board kendaraan, output pengontrol juga akan memiliki tegangan yang sama dengan input (misalnya, 12 V, bukannya 5 V). Jangan lupa untuk melindungi adaptor Bluetooth agar tidak gagal secara tidak sengaja.

Artikel itu ternyata sangat melelahkan bagi saya, saya harap semuanya tidak sia-sia dan Anda akan menyukainya.

All Articles