Шлюзи Intel для інтернету речей: відправка повідомлень MQTT-брокеру з використанням Python

Сьогодні налаштуємо шлюз для інтернету речей на відправку повідомлень MQTT-брокеру (сервера) з використанням Perl-скрипта. Повідомлення буде приймати комп'ютер, підписаний на відповідну тему на брокері. Після оформлення підписки, повідомлення, опубліковані з цією темою, будуть надходити на комп'ютер. У процесі вивчення цього матеріалу ви виконаєте наступні кроки:

  • Установка на комп'ютер MQTT-клієнта на Python.
  • Налаштування MQTT-брокера.
  • Установка MQTT-клієнта на шлюз, заснований на процесорі Intel Core Atom або Quark.
  • Створення і запуск скрипта для надсилання MQTT-повідомлення зі шлюзу брокеру, які, в кінцевому рахунку, надійдуть на комп'ютер.

Ось схема взаємодії шлюзу, MQTT-брокера і комп'ютера.


Взаємодія шлюзу, MQTT-брокера і комп'ютера

MQTT
MQTT – це протокол обміну повідомленнями, який можна використовувати для передачі даних зі шлюзу на локальний або хмарний сервер. Сервер перенаправляє дані віддаленим клієнтам, які оформили передплату.

Ось, що можна дізнатися про MQTT з Вікіпедії: «MQTT (раніше відомий як MQ Telemetry Transport) це спрощений мережевий протокол, що працює поверх TCP/IP. Він використовується для обміну повідомленнями між пристроями за принципом «видавець-читач». Протокол розроблений для організації зв'язку з віддаленими пристроями, для випадків, коли важливо, щоб код займав якомога менше місця, а так само для роботи в мережах з невеликою пропускною здатністю. Схема взаємодії «видавець-читач» вимагає наявності брокера, посередника між передавальної і приймаючої сторонами. Брокер відповідає за доставку повідомлень клієнтам, які в цих повідомленнях зацікавлені, грунтуючись на теми повідомлень і оформлених клієнтами підписках».

Існують кілька програмних пакетів для створення MQTT-брокерів. Вони розрізняються по набору можливостей, в деяких з них, поверх стандартного протоколу MQTT, реалізовані додаткові функції. Ось порівняння кількох брокерів.

Mosquitto
Mosquitto – це MQTT-брокер з відкритим кодом (ліцензія BSD), який реалізує протокол MQTT версій 3.1. і 3.1.1. У цьому керівництві ми будемо розглядати використання Mosquitto для розгортання MQTT-брокера в локальній мережі.

Python і MQTT
Мова програмування Python можна використовувати для створення MQTT-повідомлень. Вибір може припасти саме на Python якщо, наприклад, код, написаний на цій мові, легко вмонтувати в додаток, або якщо розробник добре знайомий з Python. Іноді ця мова зручно використовувати із-за того, що програми, написані на ньому, не потребують компіляції. Вони інтерпретуються на шлюзі під час виконання.
Інтерпретатор Python входить в стандартний набір попередньо встановленого ПЗ на шлюзах Intel для інтернету речей, що працюють під управлінням Wind River Linux. Таким чином, Python-скрипти можна виконувати на шлюзах без додаткової настройки робочого середовища. Так, інтерпретатор Python 2.7.2 включений у Wind River Linux 5 і в Intelligent Device Platform XT 2. У Wind River Linux 7 і Intelligent Device Platform XT 3.1 є Python 2.7.3 і 3.3.3.

Paho
Python-клієнт Paho надає клас клієнта з підтримкою MQTT v3.1 і v3.1.1 Python 2.7 і 3.1.1. Крім того, він містить деякі допоміжні функції, які значно спрощують публікацію MQTT-повідомлень.

Налаштування комп'ютера
Розглянемо налаштування комп'ютера, який планується використовувати для підписки на повідомлення з якоїсь тестовій темою на MQTT-брокері в інтернеті. Після того, як комп'ютер підпишеться на тему, повідомлення, опубліковані з цією темою, будуть доставлені йому.

Для того, щоб налаштувати комп'ютер, потрібно буде, по-перше, встановити Paho і супутнє ЗА, по-друге, протестувати систему, підключившись до брокера.

Попередні вимоги
  • На комп'ютері повинна бути встановлена Ubuntu Linux 12.04 або вище.
  • Комп'ютер підключений до інтернету.
  • У комп'ютера повинна бути зв'язок з MQTT-брокером.
  • Брокер може бути розташований або в локальній мережі або в інтернеті.
  • Файрвол, якщо він застосовується, не повинен блокувати двосторонній обмін інформацією з використанням портів 1883, 8883, 8884, і 8885, відкритих на комп'ютері.
Установка Paho
1. Завантажити
tar.gz
-архів зі свіжою версією Paho eclipse.org. У нашому випадку це був файл
org.eclipse.paho.mqtt.python-1.1.tar.gz
.

2. Помістіть файл в обрану директорію.

3. Розпакуйте архів. Наприклад, такою командою:

tar -xf org.eclipse.paho.mqtt.python-1.1.tar.gz

4. Вміст архіву опиниться в папці, ім'я якої збігається з його ім'ям. Перейдіть у папку, і, якщо потрібно, змініть її.

cd org.eclipse.paho.mqtt.python-1.1

5. Виконайте наступні команди python:

python setup.py install

Тепер Paho встановлений на комп'ютері.

Тестування Paho
Протестуйте Python-скрипт, який використовує Paho, а заодно – і підключення до MQTT-брокеру, підписавшись на активну тему. Наприклад, якщо вас цікавить брокер, розміщений в інтернеті, для тестування можна скористатися брокером
test.mosquitto.org
. Це дозволить перевірити та мережеве з'єднання, і роботу програмного забезпечення.

1. Перейдіть в директорію з прикладами для Paho:

cd org.eclipse.paho.mqtt.python/examples

2. Змініть скрипт
sub.py
, відредагувавши рядка
mqttc.connect
та
mqttc.subscribe
:

mqttc.connect("test.mosquitto.org", 1883, 60) 
mqttc.subscribe("#", 0)

Розглянемо ці команди:

Mqttc.connect

— test.mosquitto.org Адреса MQTT-брокера, до якого ми хочемо підключитись.
— 1883: Порт, який використовується для MQTT-повідомлень.
— 60: Тайм-аут у секундах

Mqttc.subscribe

— #: символ підстановки, який вказує на те, що ми підписалися на всі теми брокера.
— 0: запитаний рівень якості обслуговування (Quality of Service, QoS).

3. Запустіть скрипт:

python sub.py

Якщо мережеве з'єднання і програма працює правильно, від MQTT-брокера
test.mosquitto.org
почнуть надходити повідомлення. Їх вміст нас зараз не цікавить. Якщо нічого не приходить, перевірте як слід підключення до інтернету і відредаговані рядка скрипта
sub.py
.

4. Для зупинки скрипта скористайтесь комбінацією
клавіш Ctrl-C
на клавіатурі.

Налаштування MQTT-брокера та передплати
У попередньому розділі ми встановили на комп'ютері Paho і протестували його роботу. Тепер розглянемо особливості MQTT-брокерів. Наша мета – працює брокер, який може приймати повідомлення від видавців і відправляти їх передплатникам. Існує кілька варіантів організації взаємодії з брокером, всі вони підходять для того, щоб відтворити те, про що ми розповімо нижче.

  • Вже налаштований брокер, розташований в локальній мережі або інтернеті (в хмарі). Такий підхід дозволить використовувати існуючий брокер. Цей брокер повинен бути готовий до прийому і відправлення повідомлень. При цьому у вас повинна бути можливість створювати на ньому потрібні теми, якщо такі поки що не створені.

  • Новий брокер в локальній мережі, створений з використанням Paho. Цей брокер буде працювати на комп'ютері. При цьому, чи буде це той же комп'ютер, який приймає повідомлення від шлюз, або іншій, особливої ролі не грає. Для створення брокера можна скористатися відповідними бібліотеками Paho для Python.

  • Новий брокер в локальній мережі, створений з використанням Mosquitto. Такий брокер теж буде працювати на комп'ютері, але для його створення потрібно буде скористатися Mosquitto.
Використання існуючого брокера, підключеного до локальної мережі
Краще всього, якщо у вас вже є MQTT-брокер, готовий до роботи з додатком. Він повинен розташовуватися в обраній мережі, повинен бути готовий відправляти і приймати повідомлення для програми, у вас повинна бути можливість його налаштовувати. Якщо готовий до роботи брокер у вас вже є, можете відразу переходити до розділу цього матеріалу, присвяченому налаштуванні шлюзу.

Якщо брокер ви поки що не налаштували, існує кілька способів обзавестися простим MQTT-брокером для тестування програми. Зараз ми їх розглянемо. Зверніть увагу на те, що тут ми не торкаємося питань налаштування серверів або мереж. Крім того, з наведених нижче варіантів роботи з існуючими брокерами або способів налаштування нових, вам знадобиться лише один. Тому, вибравши його і налаштувавши систему, так само можете переходити до розділу про налаштування шлюзу.

Paho: һабота з існуючим брокером, доступним через інтернет
В інтернеті можна знайти кілька MQTT-брокерів, які підійдуть для тестування. Тут ми скористаємося брокером, доступним за адресою http://test.mosquitto.org/. Ми вже розповідали про нього, тестуючи правильність роботи системи, не звертаючи уваги ні на теми, ні на повідомлення. Зараз використовуємо його для більш осмисленої роботи і з тим, і з іншим.

Процедура взаємодії з цим брокером вам вже знайома, по розділу «Тестування Paho». Однак тут ми, замість підписки на всі теми командою
mqttc.subscribe("#", 0)
, підпишемося на конкретну тему командою
mqttc.subscribe("mytopic", 0)
. Тут
mytopic
– це назва MQTT-теми. Брокер автоматично створить таку тему, якщо вона ще не існує.

Тепер, якщо шлюз (або будь-який інший комп'ютер) відправить брокеру повідомлення з темою
mytopic
, брокер перешле це повідомлення у вікно терміналу, в якому працює скрипт
sub.py
.

Установка MQTT-брокера в локальній мережі з використанням Paho
Скористайтеся цим методом, якщо хочете, щоб ваш комп'ютер грав роль MQTT-брокера, розміщеного в локальній мережі. Тут нам знадобляться встановлені раніше Python-бібліотеки Paho. Процедура налаштування, в цілому, аналогічна до вже розглянутої. Однак, потрібно звернути увагу на те, що комп'ютер і шлюз повинні бути в одній і тій же локальній мережі, і на те, що початок взаємодії з брокером (в скрипті
sub.py
) виглядає так:

mqttc.connect("localhost", 1883, 60) 
mqttc.subscribe("mytopic", 0)

Тобто, ми підключаємося не до сервера в інтернеті, а до локального хоста, до мережного інтерфейсу «внутрішньої петлі» комп'ютера. Зазвичай localhost використовується як псевдонім для IP-адреси 127.0.0.1.

Якщо підписатись на тему
mytopic
, звернувшись до локального хоста, автоматично буде запущено локальний MQTT-брокер і на ньому буде створена така тема. Якщо тепер шлюз опублікує повідомлення з темою
mytopic
, звернувшись до комп'ютера за його IP-адресою, це повідомлення буде відправлено термінал Linux, в якому виконується скрипт
sub.py
, який оформив передплату на цю тему.

Установка MQTT-брокера в локальній мережі з використанням Mosquitto
Цей метод, знову, передбачає використання комп'ютера розробника в якості брокера, розміщеного в локальній мережі. Але на цей раз ми будемо користуватися Mosquitto.

Подробиці про Mosquitto можна дізнатися тут. Крім того, конструкція виду
<mosquitto_command> --help
дозволяє отримувати довідку по командам цього пакету. Для того, щоб запустити процес MQTT-брокера на комп'ютері, виконайте наступні кроки.

1. Відкрийте нове вікно терміналу Linux.
Брокер буде виконуватися в цьому вікні, при цьому на тому ж самому комп'ютері можна отримувати MQTT-повідомлення, тільки вони будуть приходити в інше вікно терміналу.

2. Встановіть Mosquitto, якщо ви ще цього не зробили.

sudo apt-get install mosquitto

3. Створіть тему і підпишіться на неї з допомогою команди
mosquitto_sub
.

mosquitto_sub -d -h localhost -t mytopic

Розглянемо цю команду:

d: включення виведення налагоджувальних повідомлень.
-h localhost: зазвичай – синонім для IP-адреси 127.0.0.1.
-t mytopic: назва MQTT-теми. Якщо вона не існує, брокер створить її автоматично.

4. Перевірте, чи підключений комп'ютер до тієї ж локальної мережі, до якої підключений шлюз.
Локальний MQTT-брокер запуститься автоматично після оформлення підписки на якусь тему. Шлюз, звернувшись до брокеру за IP-адресою комп'ютера, зможе публікувати повідомлення з цієї теми, які потраплять в термінал Linux, в якому виповнюється
mosquitto_sub
.

Налаштування шлюзу
Займемося налаштуванням шлюзу. Вона включає в себе два основні кроки:

  • Установка на шлюз MQTT-клієнта, написаного на Python.

  • Підключення шлюзу до тестового MQTT-брокеру для перевірки наявності мережного з'єднання та правильності роботи скрипта.
Попередні вимоги
  • У цьому прикладі використовується шлюз, який працює під управлінням Wind River Linux 7 з Wind River Intelligent Device Platform XT 3.1. Якщо на вашому шлюзі використовується інша ОС, процес його налаштування може відрізнятися від того, який наведено тут.

  • Операційна система шлюзу повинна бути зібрана з використанням параметра --
    withtemplate=feature/mqtt
    в налаштуваннях. Подробиці дивіться тут.

  • Шлюз повинен бути підключений до тієї ж самої мережі, що і MQTT-брокер, за умови, що брокер розміщений у локальній мережі.

  • Якщо ви користуєтеся MQTT-брокером, який розміщений в інтернеті, і застосовуєте файрвол, він не повинен блокувати порти 1883, 8883, 8884, і 8885.
Установка Paho на шлюз
Установка Paho на шлюз виконується так само, як і установка на комп'ютер. Потрібно завантажити архів зі свіжою версією Paho, розпакувати його і виконати команду
python setup.py install
.

Перевірка роботи c MQTT-брокером, розміщеним в інтернеті
Процедура перевірки працездатності ПЗ, встановленого на шлюзі, і мережевого з'єднання, повторює процедуру перевірки комп'ютера.

Відправка і отримання MQTT-повідомлень
Тепер, коли у нас є готовий до роботи MQTT-брокер, налаштовані комп'ютер і шлюз, все готове до того, щоб створити скрипт на Python, який буде займатися публікацією повідомлень.

Тут ми скористаємося зразками коду з постачання Paho для створення скрипту, який можна буде модифікувати пізніше у відповідності з потребами конкретного проекту. Скрипт можна створити і безпосередньо на шлюзі, і на комп'ютері. Якщо скрипт створений на комп'ютері, його треба буде скопіювати на шлюз і запустити там.

Безпека
Враховуйте наступні міркування при створенні та запуску Python-скриптів.

  • Якщо ви користуєтеся вбудованим інтерпретатором Python, IMA-безпека не завадить, дозволяючи інтерпретатору виконувати нові скрипти.

  • Якщо ви вбудованим інтерпретатором Python не користуєтеся, і, при цьому, включена IMA-безпека, кожен скрипт, перед запуском, необхідно підписати.

  • Якщо на шлюзі включена система McAffee Embedded Control, скрипт треба додати в білий список (Whitelist).
У прикладі, наведеному нижче, ми виходимо з того, що ні IMA, ні білі списки на шлюзі не включені.

Створення і запуск скрипта на Python для публікації MQTT-повідомлень
1. Перейдіть в теку
examples
, містить зразки коду для Paho:

cd org.eclipse.paho.mqtt.python-1.1/examples

2. Скопіюйте та перейменуйте скрипт
pub-single.py
:

cp pub-single.py my-pub.py

3. Відредагуйте файл
my-pub.py
, змінивши його останній рядок таким чином, щоб повідомлення відправлялося існуючого MQTT-брокеру і при його відправці використовувалася тема, яка була задана тоді, коли ми займалися налаштуванням комп'ютера на прийом MQTT-повідомлень (ми назвали тему «mytopic»):

publish.single("mytopic","Привіт", hostname="<broker_location>")

Розглянемо пристрій цієї команди:

— "mytopic": назва теми, існуючої на брокері.
— "Привіт": зміст повідомлення
— "<broker_location>": адреса MQTT-брокера.

Якщо в якості брокера використовується комп'ютер, сюди потрібно підставити його IP-адресу в локальній мережі. Наприклад, щось на зразок 192.168.1.5. Якщо брокер знаходиться у інтернеті, то тут має бути або його IP-адресу або доменне ім'я сервера. Наприклад,
test.mosquitto.org
.

4. Якщо підготовкою скрипта
my-pub.py
ви займалися на комп'ютері, скопіюйте його на шлюз.

5. Запустіть
my-pub.py
на шлюзі для передачі з нього повідомлення заданому MQTT — брокеру з темою
mytopic
:

python my-pub.py

Прийом MQTT-повідомлень на комп'ютері
Після того, як шлюз опублікує повідомлення з якоюсь темою, а брокер отримає повідомлення, він відправить повідомлення всім MQTT-клієнтам, які підписані на тему.

Для публікації, враховуючи налаштування нашого скрипта, достатньо виконати на шлюзі команду
python my-pub.py
. При її виконанні повідомлення «Hello» буде відправлено брокеру, а з нього потрапить комп'ютер. На комп'ютері ж, враховуючи те, що на ньому відкрито вікно терміналу, що чекає повідомлень від MQTT-брокера, буде прийнято повідомлення такого змісту:

mytopic 0 Hello

Розглянемо його структуру:

mytopic: назву теми.
0: якість обслуговування
Hello: повідомлення

Підсумки та ідеї
Тільки що ви, використовуючи мову програмування Python, відправили MQTT-повідомлення «Hello» з темою «mytopic» MQTT-брокеру, розташованому в локальній мережі, а потім прийняли це повідомлення на комп'ютері, який підписаний на цю тему. Що далі? Ось кілька ідей, які стосуються розвитку приклад з цього матеріалу. Сподіваємося, вони дозволять вам розширити використання системи обміну MQTT-повідомлення в ваших проектах.

  • Якщо в системі є датчики, шлюз може зчитувати їх показання та публікувати у вигляді MQTT-повідомлень.

  • MQTT-повідомлення добре підходять для передачі певних відомостей, призначених для зберігання в хмарі або локальній базі даних. Якщо цей сценарій відповідає системі, над якою ви працюєте, розгляньте його.

  • Збільшити корисну навантаження, яку несуть повідомлення, можливо за рахунок використання більш складної структури повідомлень і тем.

  • Поекспериментуйте з функціями Paho, які дозволяють відправляти кілька повідомлень однією командою.

  • Підвищіть безпеку системи обміну MQTT-повідомленнями за рахунок шифрування, аутентифікації клієнтів, використання білих списків або інших засобів.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.