Как создать себе IoT. Учимся делать интернет вещей на Android и хардкорном железе

К 2020 году на планете будет 50 миллиардов устройств из мира «интернета вещей» (IoT). Это предсказание Cisco, сделанное в 2013 году, начинает сбываться. Кроме умных холодильников с подключением к облаку и роботов-пылесосов, сейчас появляется довольно много полезных систем — прототипы с неносимой электроникой, которая помогает по косвенным признакам определить состояние человека, прототип умной парковки и системы управления автомобильным трафиком (Intel)... Возможно, IoT перевернет экономику. Когда-нибудь, возможно уже совсем скоро, нанороботы в человеческой крови, которые вводят точные дозы лекарства и следят за состоянием человека, будут скачивать обновление через беспроводное подключение к облаку. Какой дивный новый мир открывается перед хакерами :).

Концепция IoT

Погружение в мир машин

Сегодня я расскажу, как сделать свою первую сеть для IoT, мостик между миром окружающим и миром программ, и поделюсь методикой построения интернета вещей. Несмотря на то что некоторые небезосновательно считают это просто рекламным трюком (обычный М2М в новой обертке с подешевевшими компонентами и интернетом), системы с довольно мощными вычислительными ресурсами и малым энергопотреблением все больше завоевывают сердца пользователей, маркетологов и инженеров. Интернет вещей (англ. Internet of Things, IoT) — это концепция вычислительной сети физических объектов («вещей»), оснащенных встроенными технологиями для взаимодействия друг с другом или с внешней средой.

Реализация IoT

Реализации интернета вещей очень разнятся по протоколам, по типу сетей и по цене. Обычно общее в них — это набор сенсоров и (или) актуаторов (исполнительных устройств) с первичной сборкой и обработкой данных и пересылкой в хаб или gateway, где происходит дальнейшая обработка данных, отправка команд на сенсоры или пересылка в облако, на серверы (возможно, для работы с алгоритмами из мира Big Data, если данных очень много) и к пользователю.

Рецепт же моей реализации довольно прост: берем набор датчиков с технологией Bluetooth Smart для сбора сведений об окружающей среде, смартфон, облако по вкусу. Смешиваем, взбалтываем — и получаем маленький IoT.

План действий

Для нашего простого IoT подойдет схема считывания показаний измеренных физических величин (например, температура и влажность), простая их обработка и отправка клиенту. Завершающий этап — отображение данных на стороне клиента. В самом кратком виде наши действия можно описать тремя пунктами:

  1. Для начала нужно выбрать сам датчик или набор датчиков, с которых мы будем получать измеренные данные, и способ обработки полученных данных.
  2. Затем нужно определиться с тем, как мы будем общаться с датчиками, определить объемы данных и понять, как мы будем строить общение.
  3. Наконец, нам нужно найти подходящий клиент для нашей сети и описать работу с ним.

Выбор орудия

Роль датчика и предварительного обработчика будет играть SensorTag 2 (или SensorTag 2015) от Texas Instruments. Как вариант — Ардуино с BLE-шилдом или BLEduino.

Техасовский инструмент мне понравился ценой (примерно 3 тысячи рублей) и возможностями. Представь, что на этой платке размером 5 x 6,7 x 1,4 см есть целых десять разных сенсоров на любой вкус: датчик освещенности, цифровой микрофон, магнитометр, датчик влажности, барометр, акселерометр, гироскоп, геркон, температурный датчик и температурный датчик по ИК-излучению, и все это с возможностью передавать данные по BLE (Bluetooth low energy, малопотребляющий Bluetooth, Bluetooth Smart), или по 6LoWPAN, или по ZigBee, а скоро ожидается выход Wi-Fi SensorTag. Железный человек с Бэтменом обзавидовались бы. А еще SensorTag может быть брелоком, и у него красненький силиконовый чехольчик (приятно потрогать).


На этой платке размером 5x6,7x1,4 см есть целых десять разных сенсоров на любой вкус: датчик освещенности, цифровой микрофон, магнитометр, датчик влажности, барометр, акселерометр, гироскоп, геркон, температурный датчик и температурный датчик по ИК-излучению.

Внутри главной микросхемы СС2650, сердца SensorTag 2, крутится операционная система реального времени (TI-RTOS), которая вместе с фирменным BLE-стеком обеспечивает надежное управление, по сути, тремя разными микроконтроллерами:

  1. Ядро первого микроконтроллера — Cortex-M3 (на нем обычно выполняется написанное нами пользовательское приложение).
  2. Ядро второго — Cortex-M0 (отвечает за физический уровень, радиосвязь).
  3. Отдельный контроллер для датчиков (помогает быстро получать от них данные).

Основная идея заключается в том, чтобы уменьшить разряд батареи, включая и отключая разные ядра в нужное время. Например, если требуется радиосвязь, включаем «радиоядро», отключаем контроллер сенсоров, и наоборот. В результате этих ухищрений достигается снижение энергопотребления до 75% по сравнению с другими BLE-микросхемами. По документации от TI, если устройство отправляет данные раз в секунду, то оно проработает один год от батарейки-монетки CR2032. Если же устройство не будет слать данные, а будет лишь опрашивать датчики раз в секунду, то может продержаться десять лет!


Устройство работает один год от батарейки-монетки CR2032. А если устройство не будет слать данные, а лишь опрашивать датчики раз в секунду, то может продержаться десять лет!

Выбор способа общения

Почему BLE? Да потому, что он идеален для IoT:

  • Как ленивец из мультика, он очень крепко спит (мало потребляет энергии), просыпается, быстро передает данные и снова засыпает.
  • Андроидофоны с поддержкой BLE-стека сейчас есть у каждого, а именно его мы будем использовать в качестве хаба и перевалочного пункта (gateway) на пути к облаку.

Ключевые термины и понятия BLE

  • Профиль общих атрибутов (GATT), GATT-профиль — это общие спецификации для отправки и получения коротких фрагментов данных («атрибутов») во время BLE-связи. Все существующие BLE-устройства применяют профили на его основе.
    GATT разработан согласно Bluetooth SIG (ассоциация разработчиков стандартов и протоколов для Bluetooth) и определяет множество профилей для устройств с BLE.
  • Профиль — это определение того, как устройство работает в конкретном приложении. Обрати внимание, что устройство может реализовывать больше одного профиля. Например, устройство может содержать профили «монитор сердечного ритма» и «детектор уровня заряда батареи».
  • Протокол атрибутов (АТТ). GATT — это верхний слой в BLE-стеке над атрибутом протокола (АТТ). Также именуется GATT/АТТ. АТТ оптимизирован для работы на BLE-устройствах. С этой целью он посылает насколько возможно меньше байтов. У каждого атрибута есть уникальный универсальный идентификатор (UUID). Он представляет собой стандартизированный 128-битный строковый ID, который используется для однозначной идентификации информации. Атрибуты, передаваемые через АТТ, могут быть двух типов: характеристики и службы.
  • Характеристики — содержат одно значение и дескрипторы, описывающие значения характеристик. Характеристики можно рассматривать как тип.
  • Дескрипторы — определения атрибутов, которые описывают характерные значения. Например, дескриптор может указать удобочитаемое описание, диапазон для значения характеристики или единицы измерения, относящиеся к характеристике и ее значению.
  • Сервис (служба) — это набор характеристик. Например, можно создать сервис под названием «монитор сердечного ритма», который включает в себя такие характеристики, как измерение частоты сердечных сокращений. Найти список существующих GATT профилей и служб можно на bluetooth.org.

Теперь рассмотрим архитектуру GATT (General Attribute Profile):

  • GATT определяет структуры, с помощью которых идет обмен данными и в которых данные сохраняются;
  • сервисы оперируют данными, которые предоставляются с использованием характеристик;
  • клиент использует эти данные.
Архитектура GATT (General Attribute Profile)
Структура стека TI Bluetooth low energy

Обзор подходящих инструментов

Для начала работы с SensorTag 2 нужно установить среду разработки от TI — Code Composer Studio (CCS) или IDE IAR. Установщик CCS можно найти по следующей ссылке. Там тебе предложат зарегистрироваться, и затем можно будет скачать установщик (для Windows или Linux). IAR можно найти тут. Нужно выбрать IAR Embedded Workbench for ARM, и после регистрации тебе будет доступна версия без ограничений по размеру компилируемого кода, но с лицензией на месяц или с ограничениями (32 Кбайт компилируемого кода), но без лимита по времени использования. Существует и набор облачных инструментов TI, в числе которых среда CCS Cloud.

Рекомендую попробовать все перечисленные IDE, тем более что их не так много. Также для работы с нашим gateway/хаб-устройством (смартфон с OS Android) нужно установить Java Development Kit (JDK) 7 и Android Studio. Кроме того, рекомендую взять программатор-отладчик cc-devpack-debug. Эта платка не только может прошивать и отлаживать SensorTag 2, но и умеет работать с другими контроллерами от TI (например, СС3200 и СС1310).

Предположим, что у нас нет отладчика, и будем прошивать SensorTag 2 через Android- или iOS-устройство по воздуху. Как это сделать, расскажу дальше.

Еще полезно скачать и установить Bluetooth Low Energy Software Stack, или просто BLE-STACK. Нам пригодится стек версии 2.1.1. После установки пакета в папке ti на жестком диске ты найдешь разные полезные примеры, документацию и прошивки для ST2 под разные IDE. Также для удобной работы из-под Windows с визуализацией и парсингом служб, профилей и пакетов BLE можно установить настольное приложение TI BLE Device Monitor и SmartRF Studio или [BTool] (из состава пакета BLE-STACK).

RTFM: читаем документацию перед началом работы

Из полезной документации перед началом работы я советую почитать введение в разработку BLE-приложений CC2640 BLE Software Developers Guide.

На страничке, посвященной SensorTag 2, есть также достаточно много полезной информации про устройство. Например, там рассказано, как написать приложение к SensorTag 2 для смартфона c использованием JavaScript-фреймворка.

Горсть SensorTag
Отладчик cc-devpack-debug

Для того чтобы понять, что мы делаем, советую зайти на страничку SimpleLink Academy. На ней в форме лабораторных работ и викторин дается введение в TI-RTOS (операционная система реального времени (RTOS) от TI, которая вместе с BLE-STACK является частью прошивки SensorTag), знакомство с ее понятиями и сущностями (например, есть рассказ о таких общих понятиях для всех RTOS, как семафор или задача). Следующие за этим лабораторные работы посвящены как раз Bluetooth Smart:

  • Фундаментальные концепции устройства BLE-стека.
  • Создание своего кастомного профиля в BLE.
  • Создание простой сети.
  • Работа с другой IDE (Sensor Controller Studio) и пример для SensorTag — снятие данных по шине I2C от датчика освещенности.

Да, чуть не забыл: можно и не менять прошивку SensorTag 2, если интересно только программирование на стороне Android. Скачать исходники для Android всегда можно c Git-репозитория по ссылке. Это же приложение есть и на Google Play. Так что можешь просто экспериментировать на Android-стороне.

Работа с железом

Для запуска SensorTag (если мы это делаем в первый раз) нужно вытащить пленку, чтобы запитать плату от батарейки. В дальнейшем включать/выключать устройство можно, нажимая на кнопку сбоку с гравировкой включения (не узнать ее может только совсем дикий человек, который не видел даже телевизора :)).

Итак, мы установили CCS. Запустим ее. Выберем рабочую область. Работа с CCS происходит так же, как и в других Eclipse-подобных средах.

  1. Откроем TI Resource Explorer через пункт меню View -> Resource Explorer (Examples).
  2. Откроем папку SimpleLink Academy -> Bluetooth Smart.
  3. Выберем проект Project Zero -> СС2650DK SensorTag -> ProjectZeroApp.
  4. Нажмем кнопку Import the example project into CCS в правой части Resource Explorer. Дальнейшие шаги описаны в этом окне, и при выполнении шагов рядом с их значками появляется зеленая галочка. После этого в Project Explorer слева и в рабочей области должны появиться две папки — два проекта (ProjectZeroApp_CC2650STK и ProjectZeroStack_CC2650STK). Если ProjectZeroStack_CC2650STK не добавился, нужно добавить его вручную. В этих примерах BLE-стек и проект с самим нашим приложением связаны и импортируются, компилируются вместе. В других средах и примерах, не из SimpleLink Academy (например, из пакета BLE SDK), нужно добавлять стек и приложение самому.
  5. Если у тебя есть cc-devpack-debug, можно прошить SensorTag им. Необходимо сначала подключить devpack к ПК, а затем — SensorTag к devpack. Сам процесс несложен и описан в SimpleLink Academy. Сc-devpack-debug пригодится и для возвращения исходной прошивки-примера, если что-то пошло не так.
  6. Компилируем проект, нажав сочетание клавиш Ctrl + B или на иконку молотка на панели.
  7. Отладка проекта осуществляется нажатием клавиши F11 или нажатием на иконку зеленого жучка.
  8. Завершение отладки — Ctrl + F2 или нажатие на иконку красного квадрата.
  9. Нажатие F8 — запуск/остановка, продолжение отладки и выполнение программы.
  10. После начала выполнения программы и в случае, если у нас есть подключенный отладчик, в терминале последовательного порта появится служебная информация об инициализации трех BLE-служб:
    1. состояние светодиода (светит или нет);
    2. состояние кнопки (нажата или нет);
    3. состояние данных (есть у нас данные или нет).

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

В отсылаемый широковещательный пакет могут быть включены и полезные данные, например измеряемая датчиком температура (режим Advertisement). Если в терминале ничего не отображается, можно попробовать запустить SmartRF Flash Programmer v2 и оживить с его помощью устройство.

Ура, промежуточный результат: мы сделали Bluetooth-маячок (почти iBeacon :)). Пока он только посылает в мир состояние светодиода и кнопки. Теперь можно запустить приложение наподобие BLEScanner на телефоне и прочитать атрибуты (данные) устройства.

Импорт проектов в CCS
Запуск и отслеживание служб в терминале

Соединение и навигация по службам

Для того чтобы взаимодействовать с BLE-устройствами, нам нужно будет использовать что-то, что выступало бы в качестве центрального устройства по отношению к нему. В нашем случае это будет Android-смартфон (с версией не ниже 4.3, я испытал Nexus 5X и Xperia C3), но может быть и ПК.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Комментарии (1)

  • Спасибо за освещение данной темы. Всё руки не доходят сделать что-то подобное для дома.

Похожие материалы