- Blog Back to all posts View all authors
- Basics Of Bluetooth LE Protocole
- Xamarin.Forms App as a GATT Client
- Android project set up
- iOS project set up
- Devices search
- Connecting with a device
- Communication
- «Каких Марин?» или управляем контроллером через bluetooth с помощью мобильного приложения на Xamarin (Android)
- Часть I: Введение
- Часть II: Подключение схемы и программа для CANNY 3 tiny
- Часть III: Пишем приложение на Xamarin для Android
- Часть IV: Заключение
Blog Back to all posts View all authors
My first approach to programming was at primary school. During Computer Science classes, we were navigating a little turtle in Logo. It was the time when I got fascinated by IT. Controlling the turtle was fun. Who knew that one day I will be creating mobile applications that are going to control real things like robots via Bluetooth LE? I definitely didn’t.
Now I’m a Mobile Developer who wants to teach you how to get things moving via Bluetooth with the help of Xamarin.Forms.
Basics Of Bluetooth LE Protocole
Alright, that’s enough of nostalgia, let’s get down to business. We use Bluetooth LE Protocole to the communication between devices. Each of them can have one of the following roles:
— GATT Client
— GATT Server
This construction is similar to the traditional Client – Server architecture.
Before we dig into the code, you must recognize some useful definitions:
Services — provided features and associated behaviors made to interact with the peripheral. Every service contains a collection of characteristics. Remember, first come services, then characteristics.
Characteristics — definition of the data divided into value and declaration. They occur in several modes: read, write, notify, indicate
Descriptor — an optional attribute that involves data on the specific value and ways of accessing it. It’s located in characteristics.
UUID: Universally Unique ID that get transmitted over the air. This way, peripheral can pass the information to a central on services it provides.
Bluetooth LE: Client-Service scheme
Attention! You can’t leave this page without remembering the following stuff:
— You can connect Bluetooth LE peripheral to only one central device at a time,
— Client must request the Server to send data – it won’t do it on its own,
— Server initiates operations of Notifications and Indications are whenever a value in the database changes.
Mental notes made? Great, let’s move on to another part!
Xamarin.Forms App as a GATT Client
For the communication of cross-platform app with Bluetooth LE, use ACR Reactive BluetoothLE Plugin library, you can get it here. Install the package I’ve mentioned above to every project. (Core, Android, iOS).
Android project set up
In Android, we add permissions to AndroidManifest.xml. Remember that in the case of Android 6+ and other later versions, you should ask the user for the permissions with the pop-up. For this purpose, use PermissionPlugin available here.
iOS project set up
In the case of iOS, add following keys to the Info.plist file:
NSBluetoothPeripheralUsageDescription
YOUR CUSTOM MESSAGE
Devices search
To find nearby devices, use the adapter from the plugin, which contains the following methods:
var _adapter = CrossBleAdapter.Current;
_adapter.Scan();
_adapter.ScanExtra();
_adapter.ScanInterval();
_adapter.ScanForUniqueDevices();
_adapter.ScanUntilDeviceFound();
_adapter.ScanForHeartRateSensors();
You can even attach an event that will inform you about finding a device:
_adapter.ScanForUniqueDevices(). Subscribe(device => DeviceDiscovered(device));
Connecting with a device
You can simply do this by calling a method on found device:
foundDevice.Connect();
Before connecting with a device, you can use events like:
foundDevice.WhenConnected().Subscribe(result => Connected(result));
foundDevice.WhenAnyCharacteristicDiscovered().Subscribe(result => CharacteristicsDiscovered(result));
foundDevice.WhenStatusChanged().Subscribe(status => StatusChanged(status));
They will help you with monitoring of the connection with the device and finding characteristics that are necessary for communication.
Disconnecting from the device occurs after you run the following code:
if (_connectedDevice.IsConnected())
_connectedDevice.CancelConnection();
Communication
READ
var result = await characteristic.Read(); // use result.Data to see response
WRITE
await characteristic.Write(bytes);
NOTIFICATIONS
characteristic.EnableNotifications();
characteristic.WhenNotificationReceived().Subscribe( result => <
//result.Data to get at response
>);
If you have any questions, feel free to ask ’em in the comments 🙂
SEE ALSO
Check out other awesome articles from Xamarin Month!
Источник
«Каких Марин?» или управляем контроллером через bluetooth с помощью мобильного приложения на Xamarin (Android)
В прошлой статье я пообещал рассказать, о том как подключать CANNY 3 tiny с помощью UART к bluetooth. И поскольку на этих майских особо не разгуляешься, было принято решение провести время с пользой и таки сдержать обещание. Но просто подключить контроллер к Bluetooth адаптеру HC-06, было бы слишком просто для Хабра.
Поэтому мы не просто всё подключим, но еще и напишем для нашей схемы примитивнейшее приложение для Android используя C# и Xamarin.
Если вы любите мониторить «концевики» и герконы, так как это люблю я, милости прошу под кат.
Вот о чем пойдет речь сегодня:
Часть I: Введение
Начну с хорошего, если не считать вставок программного кода на C#, то в этот раз статья будет сравнительно небольшая, потому что основные приемы работы с контроллером мы разобрали раньше. Чтобы не повторяться лишний раз, вот список статей, в которых мы уже разбирали основные приёмы работы с контроллером CANNY:
- «Раз, два, три – ёлочка гори!» или мой первый взгляд на контроллер CANNY 3 tiny — в этой статье мы разбирали что из себя представляет контроллер, а также азы работы в среде разработки CannyLab.
- «У Предназначения масса обличий. » или автоматизируем управление автолампой с помощью CANNY 3 tiny и фоторезистора — в этой статье мы разбирали работу с USB Virtual COM-port, подключение датчиков к АЦП, а также высокочастотный ШИМ на выходах контроллера.
- «Как зеницу ока. » или делаем простенькую охранную систему на базе микроконтроллера (CANNY или Arduino) и Raspberry PI — в этой статье мы разбирали работу с UART, а также повторили ранее пройденное.
При подготовке данной статьи я использовал следующее железо: контроллер CANNY 3 tiny, bluetooth адаптер HC-06, концевой выключатель (концевик Trema-модуль), геркон, старые проводные наушники, макетную плату, провода, «крокодилы».
Мы будем собирать систему, которая с помощью мобильного приложения мониторит состояние двух датчиков и при необходимости может в ручном режиме подавать звуковой сигнал.
Все что будет изложено в данной статье, выдумано чисто в учебно-демонстрационных целях. Я просто хотел показать, некоторые приемы работы с контроллером, а также, чтобы купленные в свое время железки хоть как-то отработали свою стоимость.
Несмотря на далекий от реальности характер решаемой задачи мы представим, что делаем систему мониторинга за раздвижной дверью купе. Когда она начнет движение, сработает геркон, а в конце пути даст сигнал концевик. Если нам надо будет привлечь внимание, например, чтобы дверь обратно закрыли, мы подадим «писклявый» сигнал через динамик. Правда динамика у меня нет, но зато есть старые наушники.
Ну и, как всегда, примечание. Настоятельно не рекомендую использовать, материалы данной статьи, как истину в последней инстанции. Многие вещи я сам делал в первый раз, их наверняка можно сделать лучше.
Часть II: Подключение схемы и программа для CANNY 3 tiny
Для начала, чтобы никого в авторских правах не обидеть уточню, что идею подключить контроллер к HC-06, по управлять им через приложение «Serial bluetooth terminal» и некоторые приемы при разработке диаграммы, я позаимствовал с форума, но само собой я их адаптировал под свою задачу.
Схема подключения выглядит следующим образом:
Концевик и геркон подключены к выводам контроллера №6 и №5, наушники к выводу №4 (у него есть ВЧ ШИМ), UART RX – это вывод № 1, UART TX – вывод № 2, вывод № 3 используется для подачи «+5В», вывод «-» — для связи с «землей».
Вот как это выглядит в сборе:
Диаграмму (программу) для СANNY 3 tiny я разрабатывал в CannyLab версии 1.42, возможно в других версиях среды разработки и с другими контроллерами, надо будет внести изменения в диаграмму.
Вот, что получилось:
Блоки связанные с настройкой контроллера и отправкой сообщения по UART, разбирали в прошлой статье.
Разберём подробней два оставшихся.
Блок «Получение сообщения по UART», отвечает за включение сирены(наушников). В принципе он нужен, чтобы разобрать пример, получения сообщения по UART.
Вначале мы проверяем есть ли полученные данные в UART, если есть, то подаем на вход «Е» D-триггера единицу, в таком случае триггер копирует значение со входа “D” в который мы запишем первые два символа из сообщения пришедшего по UART. Я не хотел всё усложнять поэтому дальше мы используем простую схему. Предполагаем, что по UART к нам придет любое число от 00 до 99, переводим это число из символьной формы в числовую (рекомендую почитать как работает блок конвертера у меня с ним был небольшой «затык»). Дальше любое значение «>0» на входе детектора переднего фронта вызывает единичный сигнал, который включит на 5 секунд выход №4, работающий в режиме ВЧ ШИМ.
Вы можете в настройках поиграться с периодом заполнения ВЧ ШИМ, от этого будет зависеть, звук в наушниках.
Перейдем к блоку «Формирование сообщения». Его реализация на первый взгляд может показаться необычной. Объясняется это тем, что я толком не разобрался как работать с программой Serial bluetooth terminal и с аналогичным bluetooth протоколом в Xamarin.
Забегу немножко вперёд и скажу, что я так и не научился гарантированно получать на смартфоне отправленное с контроллера сообщение. Если с проводным UART в прошлой статье все было очевидно, то с Bluetooth на практике вместо отправленного сообщения может прочитаться только его часть и смысл передаваемой команды нарушиться.
Я решил, что самое простое решение — это передавать одно число, которое гарантированно дойдет до адресата без потерь.
В нашем случае мы мониторим дискретное состояние геркона и концевика. То есть у нас всего 4 возможные комбинации: геркон и концевик выключены, включен только кто-то один, оба включены.
Поскольку геркон и концевик дают дискретный сигнал (0/1) нужно как-то их различить. Для этого умножим значение сигнала геркона на 2. Теперь получается, что сумма сигналов даст нам значения от 0 до 3.
Теперь разберем не очевидный вариант с прибавлением к этому значению пятидесяти. Дело в том, что CannyLab передает в UART пару символов, то есть вместо 3 допустим 03, но как я говорил есть риск потери части информации. Например, из значения 01, программа на смартфоне может прочитать только первый «0», а это уже будет ошибка.
Можно было бы заморочиться и преобразовать данные, заменив, например символ «D1» регистра какой-нибудь буквой или пробелом, но я решил сделать проще. Я превратил значение 01 в 51 (02 в 52 и т.д.). Пятерка не несет сигнала и я ее вырезаю на уровне программы для смартфона. Таким образом, у нас всегда гарантированно остается полезная часть сообщения.
Загружаем программу в контроллер, нажимаем «запустить», если все работает как задумано, то HC-06 начнет периодически мигать красным светодиодом.
Далее сопрягаем смартфон с адаптером. Теперь можно проверить работоспособность в приложении «Serial Bluetooth terminal» или любом другом с похожим функционалом.
Запишите адрес Bluetooth адаптера, он нам пригодится в следующей главе.
Как видите данные приходят, в зависимости от состояния датчиков, а если отправить «11», то в наушниках послышится противный писк. Можно было бы на этом и остановиться, но давайте набросаем примитивное приложение.
Программу для контроллера и исходный код программы для смартфона можно скачать с GitHub
Хотелось бы отметить, что вам не обязательно реализовывать всё в железе именно на контроллерах CANNY, вы вполне можете написать программу для Arduino или другого любимого вами контроллера. Изначально я и сам планировал написать дополнительно еще и версию скетча для Arduino, но поскольку убил почти все майские праздники, на подключение CANNY и приложение для смартфона у меня уже просто не осталось сил.
Часть III: Пишем приложение на Xamarin для Android
Я знаю, что Xamarin скажем мягко – не самое популярное решение для мобильной разработки. И возможно у вас уже возник вопрос: «Почему я его выбрал?». Ответить на него мне бы хотелось словами из одноименной песни Псоя Короленко:
Честно, нет никаких объективных причин. Просто пару лет назад я учил азы C# и все хотел посмотреть, что такое Xamarin. И теперь из-за «самоизоляции» наконец-то дошли руки.
Ну и еще раз напомню. Я первый раз встречаюсь с Xamarin и это мое первое приложение для Android. Не стоит слепо копировать мой кривой код, если вдруг вы сможете найти более красивое решение, воспользуйтесь им.
При разработке своей программы я опирался на этот материал. Статья не особо разжевана, да еще и на испанском, поэтому я всё-таки счел уместным поделиться с вами своей вариацией на эту тему.
Я собирал программу в Visual studio 2019 community edition.
Первым делом создадим новый пустой проект для Android (Xamarin), как на картинке.
Я вносил изменения только в три файла, целиком их можно просмотреть на GitHub, а тут разберем только важные части:
В стандартный шаблон добавлены 2 разрешения:
activity_main.xml
Был убран контейнер по умолчанию (RelativeLayout). Вместо него был добавлен, контейнер LinearLayout просто потому, что он проще. В данном контейнере все элементы выравниваются по вертикали, растягиваясь на всю ширину экрана.
Любому человеку немного знакомому с HTML вёрсткой или XML не составит труда разобраться со структурой пользовательского интерфейса. У нас есть три доступных только для чтения текстовых поля (TextView), один переключатель(Switch), который работает по сути как чекбокс и одна самая обычная кнопка(Button). Элементы можно разместить на форме путем перетаскивания из конструктора, а в окне свойств или в коде задать им более удобные Id, текстовые заглушки и другие параметры.
Осталось описать логику программы.
Ниже под спойлером код целиком для удобства
Теперь по частям.
Блоки с подключением пространств имен, объявлением класса и т.п. я пропущу.
Создаём переменные с которыми позже свяжем элементы пользовательского интерфейса:
Дальше идет, код из примера на который я опирался. Переменные (поля) необходимые для работы тех или иных методов.
Нам здесь важно вбить адрес вашего модуля HC-06 в поле address.
Поскольку это мой первый опыт разработки для смартфонов в том числе работы с Xamarin, я решил ничего не усложнять поэтому адрес устройства, как и в исходном примере, жестко зафиксирован. Если хотите вы можете посмотреть эту статью, там похоже реализован перебор доступных Bluetooth устройств.
Этот метод создается автоматически, наша задача связать в нем объекты UI с полями класса, а также привязать обработчики для реакций на события ( startSiren.Click и bltSwitch.CheckedChange ).
Проверяем подключение по Bluetooth:
Включение сирены. По сути просто отправка символов «11» в контроллер:
Проверка состояния переключателя (если смещен в право значит включён):
При включении начинаем соединение с Bluetooth.
Реализация непосредственно подключения:
А вот один из самых важных методов — непосредственно считывание данных:
Многие элементы метода я оставил как в примере, как я понимаю вначале создается соединение с потоком данных, если в буфере с прочитанными данными, что-то есть то оно считывается в переменную valor . При этом как я и обещал, цифру «5» мы просто удалим.
Дальше мы убираем из считанного сообщения все символы кроме цифр string command = new string(valor.Where(char.IsDigit).ToArray());
Ну а после уже все просто в зависимости от того какое число нам пришло, выводим тот или иной статус в UI.
Эти два метода я кардинально не менял:
Как я понимаю в данном блоке кода реализованы отправка сообщения и обработчик события на зарос разрешения доступа к Bluetooth.
Как ни странно, но все работает:
Часть IV: Заключение
Вот как работа программы выглядит в натуре:
Вот таким был мой первый опыт разработки приложений для смартфона на Android.
Хотелось бы отметить, что VS 2019 и Xamarin на моем стареньком компьютере работают очень медленно.
При первой сборке проекта, я реально успел съесть еще этих мягких французских булок да выпить чаю. Также само приложение получилось откровенно убогое, переключатель «вкл/выкл» работает очень не удобно, но с другой стороны учитывая, что я лишь немного знаком с базовыми приёмами разработки для .NET, а также то, что я вообще не программист, я смог даже не проходя целиком ни одного туториала и ни одного урока, за день набросать свое первое приложение. Поэтому порог вхождения для создания элементарного приложения получается достаточно низкий.
Я так понимаю, контроллеры CANNY можно использовать при тюнинге автомобилей, особенно отечественных так, что вполне можно сделать какую-нибудь «фичу» и написать к ней приложение для смартфона. Главное помнить, что при питании от бортовой сети автомобиля на выходах контроллера будет тоже напряжение что и на входе (например, 12 В вместо 5 В). Не забудьте защитить Bluetooth адаптер, чтобы он ненароком не вышел из строя.
Статья оказалась для меня очень трудоёмкой, надеюсь, что все было не зря и она вам понравиться.
Источник