Це стаття про те, як налаштувати Omega для з'єднання з AWS IoT,
відправити дані з датчика на AWS та візуалізувати їх на графіку
Інформація про проект
- Рівень складності - Середній
- Необхідний час – 1 година
Що потрібно для проекту
Компоненти:
Onion Omega2 Plus | |
Набір кабелів | |
Датчик температури DS18B20 | |
Резистор 4,75 кОм | |
Onion Expansion Dock |
Програми та онлайн-сервіси:
Amazon Web Services AWS IoT |
Вступ
В статті описано як з'єднати Omega з веб сервісом від Амазон (AWS IoT). Передбачається, що читач вже знайомий з MQTT та AWS IoT. Якщо ви ще не знайомі з AWS IoT, ми рекомендуємо вам ознайомитись з наступною статтею: https://aws.amazon.com/iot-core/. Потім ми приєднаємо 1-провідний датчик температури, проведемо його ініціалізацію при завантаженні мікрокомп'ютера та напишемо скрипт для публікації отриманих з датчика даних на сервісі AWS IoT. Насамкінець ми використаємо AWS для візуалізації даних з датчика. Спершу ми створимо місце для зберігання даних датчика (ElasticSearch), зробимо в AWS IoT правило, що відправлятиме данні з датчика в ElasticSearch та використаємо Kibana для візуалізації.
Зауваження перед початком: AWS це платний сервіс і за використання з вас може стягуватись плата. Користуйтесь AWS на свій розсуд.
Налаштування AWS IoT
Вам знадобиться профіль в Amazon AWS, якщо у вас його ще немає, перейдіть за посиланням https://aws.amazon.com/ і зареєструйтесь.
Потім перейдіть на сервіс AWS IoT, ви побачите щось подібне:
Натисніть кнопку Register a thing ("Зареєструвати річ").
Ми створимо лише один пристрій, тому натисніть Create a single thing ("Створити одну річ"). Далі у вас запросять ввести назву для цієї речі, в нашому випадку назва співпадає з назвою мікрокомп'ютера:
Решту налаштувань поки що пропустимо, можна завжди повернутись до них та зробити поправки. Прогорніть сторінку до низу і натисніть Next. Наступним кроком ми створимо засоби автентифікації вашого Omega з AWS IoT. Зі списку оберіть створення сертифікату одним кліком (One-Click certificate creation):
В результаті буде згенеровано сертифікат, публічний та приватний ключі. Завантажте сертифікат та приватний ключ на комп'ютер, після чого натисніть Activate ("Активувати") для приведення сертифікатів у дію:
Натисніть Attach a policy ("Додати правила"), після чого ви потрапите на відповідну сторінку. Тепер потрібно створити правила, для чого натисніть знову Register Thing.
Тепер ми створили нашу Річ та повернулись на головну консоль AWS IoT. Проте все ще потрібно створити правила, щоб надати доступ до щойно створеного сертифікату. Отже перейдіть до меню Secure ("Безпека"), а потім до підменю Policies ("Правила") і натисніть Create Policy ("Створити правило"):
Вигадайте назву для правила (ми назвали його omega-thing-policy) і натисніть Advanced Mode ("Розширений режим)", щоб записати власне правило. Але перед цим зауважте, що вам потрібно змінити написане нижче правило під ваш власний AWS профіль та регіон використання. Замініть [YOUR AWS REGION] на ваш регіон та замініть [YOUR AWS ACCOUNT NUMBER] на номер вашого профілю AWS, який можна побачити у верхньому правому кутку консолі AWS, після спадних меню Support та Region.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:[YOUR AWS REGION]:[YOUR AWS ACCOUNT NUMBER]:client/${iot:ClientId}" }, { "Effect": "Allow", "Action": [ "iot:Receive", "iot:Publish" ], "Resource": [ "arn:aws:iot:[YOUR AWS REGION]:[YOUR AWS ACCOUNT NUMBER]:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:[YOUR AWS REGION]:[YOUR AWS ACCOUNT NUMBER]:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/*", "arn:aws:iot:[YOUR AWS REGION]:[YOUR AWS ACCOUNT NUMBER]:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/get/*" ] }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow" ], "Resource": [ "arn:aws:iot:[YOUR AWS REGION]:[YOUR AWS ACCOUNT NUMBER]:thing/${iot:Connection.Thing.ThingName}" ] } ] }
Це правило потрібно приєднати до сертифікату. В загальному випадку доступ пристроїв, що автентифікуються з сертифікатом встановлюється в правилі. Створене нами правило призначене бути стандартним та придатним для повторного використання, тому ви можете використовувати це правило з іншими сертифікатами.
Для допитливих, нижче наведено короткий огляд доступу, що надається нашим правилом:
- Дозволяє MQTT з'єднання пристрою клієнта з ID, що відповідає назві Речі
- З цим сертифікатом можна зробити лише одне MQTT з'єднання з AWS IoT
- Дозволяє приєднаному пристрою отримувати повідомлення та здійснювати публікації у всіх розділах MQTT, що пов’язані з даною Річчю
- Дозволяє приєднаному пристрою підписуватись на всі shadow/update та shadow/get теми даної Речі
- Дозволяє пристрою оновлювати та повертати в початковий стан тінь Речі (Thing shadow)
Тепер, коли правило створене, його потрібно приєднати до сертифікату. Вам потрібно повернутись до перегляду правил, натиснути на підменю Certificates ("Cертифікати") і обрати свій сертифікат:
В меню огляду сертифікату зайдіть в спадне меню Actions ("Дії"), а потім натисніть Attach Policy ("Додати правило"):
Оберіть правило з назвою omega-thing-policy і натисніть Attach ("Додати"):
Чудово, ми завершили налаштовувати AWS IoT, переходимо до роботи з Omega!
Налаштування Omega
Спершу потрібно перевірити, чи підключено наш Omega до інтернету через WIFI і чи встановлено на ньому останнє програмне забезпечення. Для деталей перегляньте статтю про перше налаштування Omega.
Далі нам потрібно завантажити сертифікат та приватний ключ на Omega. Скористаємось командою rsync для передачі файлів в директорію /root на Omega (проте є й інші способи це зробити).
Тепер ми готові завантажити та запустити наступний скрипт:
wget -qP /tmp https://raw.githubusercontent.com/OnionIoT/Onion-Scripts/master/awsiot_setup.sh; sh /tmp/awsiot_setup.sh; rm /tmp/awsiot_setup.sh
Це встановить необхідні інструменти Mosquitto MQTT та дозволить користувачу налаштувати MQTT з'єднання.
Перше, що потрібно ввести, це кінцева точка AWS IoT, за допомогою якої буде здійснюватися MQTT з'єднання. Ця IoT кінцева точка є унікальною для кожного профілю AWS. Щоб знайти кінцеву точку для свого профілю, перейдіть до вашого меню Things ("Речі" в консолі IoT, оберіть підменю Interact ("Взаємодія") та скопіюйте кінцеву точку з Rest API Endpoint:
Вхідні дані є досить прозорими:
- Введіть назву Речі, в даному випадку - Omega-27BF
- Введіть шлях до файлу сертифікату
- І, насамкінець, введіть шлях до файлу приватного ключа
Після цього налаштування з'єднання MQTT буде завершено, а в консолі ви побачите кілька прикладів для приєднання та публікації в темах AWS IoT:
Ця інформація досить корисна, тому вона копіюється у файл: /root/aws-topics.txt. Тепер у вас налаштовано з’єднання з AWS IoT!
Перевірка з'єднання
Перевіримо наше з'єднання, оновивши тінь пристрою за допомогою Omega:
mosquitto_pub -t \$aws/things/Omega-27BF/shadow/update -m '{"state": {"desired": {"temperature": 1 }}}' -q 1
Якщо все було налаштовано правильно, в консолі AWS IoT ви побачите, що Thing shadow оновлено.
Періодична передача даних з датчика на AWS IoT
Наступним кроком необхідно організувати передачу даних з датчика на AWS IoT через певні проміжки часу. Нижче буде описано, як підключити датчик, налаштувати Omega для ініціалізації датчика при завантаженні системи та написати скрипт передачі зчитаних даних на AWS IoT.
Апаратна частина
Тут все просто, з'єднуємо наступні виводи:
- Землю датчика (чорний провід) з виводом GND на платі Omega
- Підтягуючий резистор: з'єднайте вивід датчика Vcc (червоний провід) з лінією передачі даних (жовтий провід) за допомогою резистора
- Приєднайте лінію передачі даних (жовтий провід) до виводу GPIO18 на платі Omega
- Приєднайте вивід датчика Vcc (червоний провід) до виводу 3,3V на платі Omega
Налаштування датчика
Перейдемо до програмного забезпечення. Програмний код можна знайти на сховищі GitHub.
Для початку ми налаштуємо Omega для автоматичної ініціалізації однопровідного датчика на виводі GPIO18 (до якого ми приєднали датчик раніше) при завантаженні системи. Щоб зробити це додамо файл в директорію /etc/modules.d. Під час увімкнення Omega, в цій директорії шукатимуться модулі ядра, що повинні бути завантаженими до завершення процесу запуску системи. Отже створимо файл /etc/modules.d/w1-gpio-custom і запишемо в ньому наступне:
w1-gpio-custom bus0=0,18,0
Перезавантажте ваш Omega, і якщо все було зроблено правильно, у вас з'явиться директорія /sys/devices/w1_bus_master1/.
Написання скрипту
Тепер нам потрібен скрипт, який робитиме наступне:
- Зчитуватиме показання датчика та форматуватиме вихідні дані
- Генеруватиме стрічку тексту, сумісну з AWS IoT JSON форматом
- І, насамкінець, використовуватиме MQTT для оновлення AWS IoT Thing shadow
Для завантаження скрипту запустимо наступну команду:
cd /root; wget
Для запуску скрипту необхідно вказати назву вашої "Речі" як аргумент команди. На приклад якщо ім'я вашої Речі - "Omega-27BF", команда для запуску скрипту матиме наступний вигляд:
sh publishReading.sh Omega-27BF
Якщо вам цікаво, як працює скрипт, погляньте на нього на GitHub.
Автоматизація передачі даних
Насамкінець налаштуємо періодичне виконання цього скрипту (кожні 5 хвилин) за допомогою cron. Для цього запустіть команду crontab –e, після чого введіть наступну стрічку, замінивши [THING NAME] на ім'я вашої Речі:
# */5 * * * * sh /root/publishReading.sh [THING NAME] #
Перезапустіть cron:
/etc/init.d/cron restart
після чого ваш Omega почне відправляти дані з датчика на AWS кожні 5 хвилин.
Візуалізація даних на AWS
Ми використаємо AWS для візуалізації даних з датчика. Спершу створимо кластер ElasticSearch для зберігання та індексування даних з датчика, після чого створимо правило, що перенаправлятиме дані в наш кластер, і на сам кінець, ми скористаємось Kibana для візуалізації даних.
Створення домену ElasticSearch
Увійдемо в AWS та перейдемо в сервіс ElasticSearch, де створимо новий домен (new domain):
Тепер необхідно назвати ваш домен. Назвемо його iot-dashboard:
Наступним кроком буде налаштування кластера ElasticSearch. Для наших цілей чудово підійдуть налаштування за умовчанням. Прогортайте сторінку донизу і натисніть Next.
Далі ми налаштуємо доступ. Оскільки ми хочемо мати доступ до домену ElasticSearch з будь-якого браузера, а не лише з внутрішнього сервісу AWS, обираємо публічний доступ (Public Access):
Тепер нам потрібно налаштувати доступ до домену. Зробимо його повністю відкритим:
Важливе зауваження: Відкритий доступ не рекомендовано застосовувати для виробничих проектів та при роботі з точними даними. В нашому випадку цей вид доступу обрано для ілюстративності процесу і в майбутньому ми рекомендуємо вам використовувати більш захищені види доступу.
Прогляньте свої налаштування і натисніть "Confirm" ("Підтвердити") щоб створити домен. Може пройти кілька хвилин, поки домен запуститься. Після цього ви можете перевірити свій домен ElasticSearch та скопіювати в блокнот кінцеву точку (endpoint), оскільки вона нам знадобиться.
В домені ElasticSearch подібні дані зберігаються (і так само можуть бути знайдені) під індексами index. Один домен ElasticSearch може мати як-завгодно багато індексів. Окремі елементи даних в комірці з індексом index зберігаються в документі document у форматі JSON. В нашому випадку ми отримаємо дані від кожного зчитування датчика в окремому документі document. Останнім елементом головоломки є мепінг mapping, що визначає як документ document зберігається та індексується. Мепінг зазвичай використовують разом з індексуванням.
Створимо новий індекс index та мепінг mapping в нашому домені ElasticSearch за допомогою HTTP-запиту PUT. Встановіть curl на ваш Omega:
opkg update opkg install curl
Запустіть наступний код на вашому Omega, тільки не забудьте замінити кінцеву точку в кінці на вашу власну:
curl -i -H'Content-Type: application/json' -X PUT -d '{ "mappings": { "temperature": { "properties": { "timestamp": { "type": "long", "copy_to": "datetime" }, "datetime": { "type": "date", "store": true }, "temperature": { "type": "float" } } } } } ' 'https://search-iot-dashboard-ogqgvki7phpnbtfrjtyoi6bt7e.us-east-2.es.amazonaws.com/temperature'
В результаті буде створено індекс з назвою temperature і налаштовано мепінг для дати, часу та значень температури.
Передача даних з AWS IoT в домен ElasticSearch
Тепер, коли домен ElasticSearch та індекс налаштовано, нам потрібно налаштувати нашу IoT Річ автоматично збільшувати індекс з кожним наступним зчитуванням. Спершу перейдіть в сервіс AWS IoT, після чого перейдіть в меню Act та натисніть кнопку "Create a rule" ("Створити правило"):
Назвіть правило:
Прогорніть сторінку вниз та налаштуйте message source (джерело повідомлень). Нам потрібно отримувати всі повідомлення за останній тиждень від Речі з назвою Omega-27BF, тому ми налаштуємо фільтр так:
$aws/things/Omega-27BF/shadow/update/accepted
Для максимальної гнучкості додамо штамп часу, при цьому атрибути виглядатимуть так:
*, timestamp() AS timestamp
Зауважте, як поле Rule query statement автоматично оновлюється:
Тепер необхідно записати дію для Правила. Прогорніть сторінку нижче і натисніть Add action ("Додати дію"):
Оберіть як дію Send messages to the Amazon ElasticSearch Service ("Надсилати повідомлення в сервіс Amazon ElasticSearch") і натисніть Configure Action ("Налаштувати дію"):
На новій сторінці оберіть назву домену зі спадного меню. Ми оберемо iot-dashboard, який ми створили раніше:
Після цього форма кінцевої точки заповниться автоматично. Останні три параметри визначають як кожен новий документ буде створюватись: документ розміщуватиметься за індексом temperature, створеним нами раніше, він матиме тип temperature, і кожен новий документ матиме унікальний ID, що генерується через uuid:
І, на кінець, нам потрібно надати для AWS IoT доступ до ресурсу ElasticSearch. Натисніть Create a new role, після чого AWS створить нову роль та сконфігурує доступ. Назвемо нову роль iot-es-access:
Прогорніть сторінку нижче і натисніть Add Action ("Додати дію"). Ви перейдете назад на сторінку з правилами, прогорніть її донизу і натисніть Create rule ("Створити правило"):
Тепер правило налаштоване і всі дані від пристрою Omega-27BF будуть додаватись за індексом temperature ElasticSearch. Якщо ви виконували все за інструкціями, ваш Omega кожні 5 хвилин відправлятиме дані з датчика на AWS IoT, а звідти в індекс ElasticSearch!
Щоб перевірити, чи відправляються дані, зачекайте півгодини і за допомогою вашого Omega виконайте запит індексу ElasticSearch:
curl -i -X GET \ 'https://search-iot-dashboard-ogqgvki7phpnbtfrjtyoi6bt7e.us-east-2.es.amazonaws.com/temperature/_search'
Знову ж, не забудьте змінити в команді кінцеву точку на свою власну. В результаті виконання команди ви маєте побачити щось подібне:
{ "took": 16, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 5, ... } }
Зверніть особливу увагу на поле hits.total, оскільки там відображається кількість комірок даних, що зберігаються в індексі ElasticSearch.
Візуалізація даних
Тепер отримуємо результат всього проробленого шляху: візуалізація зібраних даних. Ми використаємо новий інструмент під назвою Kibana, що допоможе нам з цією задачею. Kibana може використовуватись для створення досить складних графіків, тому ми рекомендуємо вам ознайомитись з цим інструментом детальніше.