[Перевод] Шлюзы Intel для интернета вещей: отправка сообщений MQTT-брокеру с использованием Python
Сегодня настроим шлюз для интернета вещей на отправку сообщений MQTT-брокеру (серверу) с использованием Python-скрипта. Сообщения будет принимать компьютер, подписанный на соответствующую тему на брокере. После оформления подписки, сообщения, опубликованные с этой темой, будут поступать на компьютер. В процессе изучения этого материала вы выполните следующие шаги:
- Установка на компьютер 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: hабота с существующим брокером, доступным через интернет
В интернете можно найти несколько 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 можно узнать здесь. Кроме того, конструкция вида
позволяет получать справку по командам этого пакета. Для того, чтобы запустить процесс 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","Hello", hostname="")
Рассмотрим устройство этой команды:
— "mytopic": название темы, существующей на брокере.
— "Hello": содержание сообщения
— "": адрес 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-сообщениями за счёт шифрования, аутентификации клиентов, использования белых списков или других средств.