Android

 

Управляем освещением с Android устройства через Bluetooth


 

В статье представлен прототип устройства управления освещением или любой другой нагрузкой при помощи Android устройства: будь то планшет, смартфон, часы и т.п. Связь осуществляется по Bluetooth каналу.

В качестве модуля Bluetooth используется дешевый китайский модуль HC-06.

Целью данной статьи является:

1. Осветить работу связи Bluetooth/Android на контроллерах с .NET Micro Framework. Для этой цели я использовал FEZ Panda II (другого .NET у меня нет :) ), но подойдет естественно любой контроллер с фрэймворком .NET Micro Framework. В коде нужно лишь будет подправить подключаемые библиотеки и проверить правильность указания I/O.

2. В предыдущих статьях по связи с Android STM32 и Arduino многие интересовались как передавать не по одному символу, а целую строку. Здесь я хотел бы привести пример передачи целых строк в обеих направлениях.

Для этого, мы возьмем реальную задачу — управление двумя лампочками в квартире. В качестве лампочек я буду использовать галогенные светодиодные лампочки с цоколем G4. Как известно, питание таких лампочек составляет 12 Вольт и запитываться они будут от отдельного источника питания.





Список элементов:

Android планшет или телефон

Плата FEZ Panda II (или любой другой контроллер с .NET Micro Framework)

Bluetooth модуль (HC-05, HC-06 и т.п.)

Модуль реле (или любое реле на 5В)


Схема подключения:



Исходный код программы для .NET Micro Framework в среде разработке Visual C# Express:


using System;

using System.Threading;

using System.IO.Ports;

using System.Text;


using Microsoft.SPOT;

using Microsoft.SPOT.Hardware;


using GHIElectronics.NETMF.FEZ;                                     // библиотека для FEZ-контроллеров


namespace CxemCAR

{

    public class Program

    {

        public static void Main()

        {

            byte[] My_Data = new byte[20];                          // массив для хранения строки

            int My_index = 0;                                       // индекс массива

            byte[] rx_data = new byte[1];                           // массив UART данных


            OutputPort relay1 = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di8, false);

            OutputPort relay2 = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di9, false);


            SerialPort UART1 = new SerialPort("COM1", 9600);        // новый объект UART1 (порт COM1)

            UART1.Open();

            UART1.Flush();


            while (true)

            {

                int read_count = UART1.Read(rx_data, 0, 1);         // считываем данные

                if (read_count > 0)                                 // пришли данные?

                {

                    My_Data[My_index] = rx_data[0];                 // записываем принятый байт в наш массив


                    if (rx_data[0] == '\r')                         // если пришел конец строки

                    {

                        My_Data[My_index] = 0;                                               // удаляем последний элемент, т.е. внашем случае это \r


                        string strMy_Data = new string(Encoding.UTF8.GetChars(My_Data));     // формируем строку из байтового массива


                        if (strMy_Data != null && strMy_Data.Equals("Start1"))               // сравниваем сформированную строку с нашей

                        {

                            byte[] buffer = Encoding.UTF8.GetBytes("LED 1 On\r\n");          // подготавливаем байтовый массив Led On для вывода в UART

                            UART1.Write(buffer, 0, buffer.Length);                           // записываем в UART1 байтовый массив

                            relay1.Write(true);                                              // включаем катушку реле 1

                        }

                        else if (strMy_Data != null && strMy_Data.Equals("Stop1"))           // сравниваем сформированную строку с нашей

                        {

                            byte[] buffer = Encoding.UTF8.GetBytes("LED 1 Off\r\n");         // подготавливаем байтовый массив Led Off для вывода в UART

                            UART1.Write(buffer, 0, buffer.Length);                           // записываем в UART1 байтовый массив

                            relay1.Write(false);                                             // выключаем катушку реле 1

                        }

                        else if (strMy_Data != null && strMy_Data.Equals("Start2"))          // сравниваем сформированную строку с нашей

                        {

                            byte[] buffer = Encoding.UTF8.GetBytes("LED 2 On\r\n");          // подготавливаем байтовый массив Led On для вывода в UART

                            UART1.Write(buffer, 0, buffer.Length);                           // записываем в UART1 байтовый массив

                            relay2.Write(true);                                              // включаем катушку реле 2

                        }

                        else if (strMy_Data != null && strMy_Data.Equals("Stop2"))           // сравниваем сформированную строку с нашей

                        {

                            byte[] buffer = Encoding.UTF8.GetBytes("LED 2 Off\r\n");         // подготавливаем байтовый массив Led Off для вывода в UART

                            UART1.Write(buffer, 0, buffer.Length);                           // записываем в UART1 байтовый массив

                            relay2.Write(false);                                             // выключаем катушку реле 2

                        }

                        else

                        {

                            byte[] buffer = Encoding.UTF8.GetBytes("Command Error!\r\n");    // формируем надпись о неправильной команде

                            UART1.Write(buffer, 0, buffer.Length);                           // выводим надпись в UART

                        }


                        Array.Clear(My_Data, 0, My_Data.Length - 1);                         // очищаем наш массив

                        My_index = -1;                                                       // сброс индекса нашего массива

                        Thread.Sleep(100);

                    }

                    if (My_index < 19) My_index++;                                           // увеличиваем индекс нашего массива

                }

            }

        }

    }

}



Алгоритм программы очень простой. Все команды мы будем отделять при помощи символа перевода строки "\r". Весь буфер UART мы по приходу каждого байта скидываем в массив My_Data[]. Как только пришел символ "\r", который означает конец команды, мы формируем строку strMy_Data и сравниваем её с заранее внесенными командами для управления реле. Всего, я определил 4 команды:

Start1 — включает реле 1

Stop1 — выключает реле 1

Start2 — включает реле 2

Stop2 — выключает реле 2

После успешного принятия команды, в Android устройство отсылаются соответствующие статусные сообщения: LED 1 On, LED 1 Off и т.д. Если команда не распознана, то передается сообщение об ошибке Command Error!


Программа для Android писалась на Java в среде Eclipse. Весь код программы я приводить не буду, т.к. он достаточно велик, но разберу ключевые моменты.

Для работы с Bluetooth сделан отдельный класс: cBluetooth.java. Прием данных от Bluetooth ведется в отдельном асинхронном потоке. В основное активити принятые данные и системные сообщения передаются при помощи класса Handler. Для формирования принятой строки от контроллера используется класс StringBuilder.

Вот кусок кода, отвечающий за формирование строки:


case cBluetooth.RECIEVE_MESSAGE:

   byte[] readBuf = (byte[]) msg.obj;

   String strIncom = new String(readBuf, 0, msg.arg1);

   sb.append(strIncom);                                                         // добавляем новые данные в sb

   int endOfLineIndex = sb.indexOf("\r\n");                                     // определяем конец строки

   if (endOfLineIndex > 0) {                                                    // если конец строки

      String sbprint = sb.substring(0, endOfLineIndex);

      sb.delete(0, sb.length());                                                // очищаем sb

      text_answer_txt.setText("Answer: " + sbprint);                            // обновляем TextView

   }

   break;    



В Android-приложении можно писать команду с клавиатуры (для этого предусмотрено поле ввода и кнопка отправки), а можно управлять реле при помощи двух ToggleButton. Ниже, предусмотрено текстовое поле, где отображается текст принятый с FEZ Panda II.


Выше был приведен лишь рабочий прототип устройства для показа возможностей насколько все это просто. На основе этого проекта можно построить систему умного дома, мониторинга, контроля какого-либо устройства и т.п. При использовании мощных MOSFET транзисторов можно расширить функции устройства и сделать диммирование (плавное регулирование яркости) источников света. Резюмирую можно сказать, что с Android устройством открывается широкое поле для творчества радиолюбителя.


На этом все, будут вопросы — задавайте!


Скачать APK файл для андроид

Скачать архив с проектом для Eclipse и для Visual C#2010 Express

 

Android в опасности: Найдена ошибка, «убивающая» устройства

31 марта 2014

Антивирусная компания Trend Micro сообщает о выявлении багов в Google Android. Вредоносы используют уязвимость Denial-of-Service, которая работает в среде операционных систем Android 2.3, 4.2.2 и 4.3.

 

Устройства на Android могут внезапно выйти из строя 

 

Атакующие здесь могут использовать находящийся баг класса memory corruption, а также прятать атаку в коде легитимного приложения, так как выполнение кода можно спровоцировать только после попадания на избранное устройство. Вызывая поле Android с названием приложения с экстремально длинным названием параметров (более 387 тыс символов), приложение может вызывать на смартфоне или планшете бесконечные циклы сбоев.


В Trend Micro говорят, что потенциально данная уязвимость может привести устройство к полной неработоспособности и может причинить значительный вред пользовательским данным. При некоторой модификации кода и возможности автозапуска приложения, устройство можно отправить в нескончаемый цикл перезагрузок. По словам экспертов Trend Micro, ранее похожие уязвимости обнаруживались в Windows.

Эксперты говорят, что в случае с Android дополнительная опасность кроется в том, что у создателей приложения есть возможность надежно спрятать вредоносный потенциал на время тестирования приложения в Google Play.

В Trend Micro говорят, что в некоторых случаях эксплуатация бага может привести к тому, что устройству потребуется заводской сброс ОС с полной переустановкой в ROM-памяти.

 

Хочешь узнать больше - читай

отзывы techno.bigmir.net