Эта статья может помочь участникам конкурса SAP Кодер 2017 решить одну из задач
Интернет вещей – захватывающая тема, которая уже завтра изменит мир. Существующие IoT-платформы позволяют протестировать технологию, чем мы и займемся.
Перед вами пошаговый пример создания и настройки системы сбора данных с устройств на базе Arduino и ее подключение к SAP Cloud Platform.
![](https://habrastorage.org/getpro/habr/post_images/9f3/1f8/3f8/9f31f83f875cf13ed4ef727a8c5b60e6.jpg)
IoT – самая перспективная тема ближайшего десятилетия. Важнейшим катализатором Интернета вещей стало драматическое падение цен на миниатюрные сенсоры, микроконтроллеры, RFID-датчики и микросхемы памяти. Их можно ставить сотнями, тысячами. Например, на нефтяной платформе установлено около 30000 датчиков. Но лишь 1% информации, снимаемой с них, реально используется для управления платформой и обнаружения нештатных ситуаций. Инфраструктура есть, а вот IoT-приложений не хватает.
По прогнозам аналитиков, мировой рынок IoT дорастет к 2025 году до 10 триллионов долларов, и большую часть пирога – 69% – отъест промышленный сегмент. Все крупные IT-разработчики срочно строят свои платформы для развертывания IoT. Сегодня мы поработаем с одной из них – нашей облачной платформой разработки SAP Cloud Platform. В нее включен набор инструментов и сервисов, позволяющих очень быстро из готовых блоков и шаблонов создать свой собственный проект Интернета вещей.
SAP Cloud Platform поддерживает технологию OpenStack, что делает ее независимой от инфраструктуры оборудования. При разработке приложений можно пользоваться различными технологиями по работе с данными – как обычными реляционными СУБД, так и СУБД с поколоночным хранением в оперативной памяти (SAP HANA), а также механизмами работы с неструктурированными «большими» данными HADOOP. Из языков программирования поддерживаются Java, Java Script, XS JS, так что начать кодить будет несложно. Но основная ценность платформы заключается в наборе готовых бизнес-сервисов, позволяющих существенно сократить время разработки приложений.
В данной статье речь пойдет о базовых функциях сервиса Интернета вещей, которые позволяют собирать данные с оборудования и датчиков. Дальнейшее освоение линейки SAP IoT позволит вам воспользоваться готовыми библиотеками для работы с широким спектром оборудования и шаблонами для разработки типовых приложений IoT, например, создавать приложения для мониторинга работы станка и прогнозирования нештатных ситуаций.
Практически все технологии SAP являются доступными для изучения. Чтобы познакомиться с платформой, достаточно лишь зарегистрироваться на сайте hcp.sap.com и получить тестовый аккаунт. Также можно попробовать свои силы в создании on-prem приложений на базе HANA Express, которую вы сможете развернуть на своем персональном компьютере.
Но хватит лирики, давайте создадим свое первое IoT-решение на базе платформы SAP Cloud Platform. Например, разработаем вариант, когда данные о температуре и уровне освещенности собираются контроллером на Arduino. Затем они передаются в «облако» SAP, в котором можно будет увидеть информацию в виде таблицы и графика.
Шаг 1. Регистрируемся в облачном сервисе SAP Cloud Platform
Для того, чтобы зарегистрироваться в SAP Cloud Platform, нужно пройти по ссылке:
https://hcp.sap.com. Бесплатная регистрация позволит в демонстрационном режиме использовать все возможности платформы SAP.
![image](https://habrastorage.org/files/2d9/fad/c60/2d9fadc60d044fe4a9570e1c22111821.png)
Нажмите кнопку Try for Free, затем Try Now.
![](https://habrastorage.org/files/ce5/39c/2a3/ce539c2a3cb84f24b627a550a39e4eec.png)
Нажмите кнопку «Регистрация» и введите свои регистрационные данные.
![](https://habrastorage.org/getpro/habr/post_images/390/b67/458/390b67458d446693a43e26cdb72a7ca0.png)
По указанному электронному адресу должно прийти письмо с подтверждением регистрации. Для завершения процесса необходимо активировать аккаунт нажатием на ссылку в письме.
![](https://habrastorage.org/files/1ed/a4e/a4d/1eda4ea4d94646d1922809efc11654b5.png)
Все готово к использованию платформы SAP Cloud Platform! Давайте зайдем в панель управления и создадим свое первое IoT-приложение. Нажмите Log On.
Шаг 2. Создаем базу данных и раздаем права
![](https://habrastorage.org/files/417/ed8/ca9/417ed8ca993240d69ae82d8f5f9c180b.png)
Вы попадаете в «пульт управления» ваших разработок на SAP.
![](https://habrastorage.org/getpro/habr/post_images/265/416/c52/265416c528269a12dc351d0a7529d28c.png)
Он позволяет увидеть все разработанные приложения, получить доступ к базе данных, запустить разработку или активировать сервисы.
В принципе, сервис IoT сможет автоматически создать необходимую структуру таблиц и инстанс базы данных. Но для того, чтобы понять, как он работает, и полностью управлять базой данных, мы создадим собственный инстанс HANA. Так называемый HANA MDC — Multitenant Database Containers.
Именно в этой системе будут храниться наши данные. Для этого мы идем на закладку Persistence -> Database&Schemas и нажимаем кнопку New.
![](https://habrastorage.org/files/209/3c8/ec7/2093c8ec74ca4c3c8ecc1f94dc52b3e7.png)
После этого задаем любое название для инстанса HANA. Название должно быть написано маленькими латинскими буквами без использования специальных символов. В качестве Database System выбираем HANA MDC и задаем пароль для пользователя SYSTEM.
![](https://habrastorage.org/getpro/habr/post_images/afc/a9d/b49/afca9db49b5c28204b561e98844c9fd2.png)
В облачной среде создается инстанс базы данных, с которой мы и будем работать. Обратите внимание, что на это у нас ушло всего лишь несколько минут. В этом заключается огромное преимущество облачных технологий. Обычно для того, чтобы установить на сервер базу данных и правильным образом ее настроить, администратору может потребоваться несколько дней. А здесь – одно нажатие и готово!
Когда инстанс будет готов, желтый значок CREATING сменится на зеленый CREATED, и мы сможем управлять структурой базы.
![](https://habrastorage.org/files/db8/542/01e/db854201efe14788ba32fc70c3ca9ff5.png)
Воспользуемся web-инструментами управления структурой БД. В дальнейшем, в дополнение к встроенным средствам работы с базой данных, вы можете настроить среду Eclipse, как это рассказано в статье «Создание HANA-приложения с использованием среды разработки Eclipse».
Сначала нажимаем на строку SAP HANA Cockpit. Система выдаст предупреждение об отсутствии прав.
![](https://habrastorage.org/getpro/habr/post_images/3b2/f9b/a0a/3b2f9ba0aa062a6aff4e68f0d972f33a.png)
Нажмите ОК, и вам автоматически выдадут права на работу с Cockpit.
![](https://habrastorage.org/getpro/habr/post_images/08e/d4a/14a/08ed4a14ae3d9a811b19c781a450d2a9.png)
В данном инструменте вы можете посмотреть и настроить множество параметров по работе с вашим инстансом HANA.
Для работы с SAP HANA Web-based Development Workbench вам потребуется добавить системному пользователю некоторые права. Нажмите на плитку «Manage Role and Users».
![](https://habrastorage.org/files/9f0/844/c2d/9f0844c2dd4b4a8bb4f5cd8d57ccf8a2.png)
Выберите пользователя SYSTEM и на вкладке Granted Roles нажмите «плюс». Конечно, для продуктивных систем вам необходимо будет создать нового пользователя и выдать ему требуемые права. Но сейчас мы делаем свое первое приложение и можем немного отступить от правил.
![](https://habrastorage.org/files/64c/e3e/735/64ce3e7353614383b35e4d319e7b7069.png)
Права, необходимые для работы средства администрирования, описаны здесь.
Выдайте следующие права вашему пользователю:
Роль |
Описание |
SAP HANA Web-based Development Workbench |
|
sap.hana.xs.ide.roles::EditorDeveloper or parent roles sap.hana.xs.ide.roles::Developer |
Use the Editor component of the SAP HANA Web-based Development Workbench. |
sap.hana.xs.debugger::Debugger |
Debug server-side JavaScript code |
SAP HANA XS Administration Tool |
|
sap.hana.xs.admin.roles::HTTPDestViewer |
View HTTP destinations. |
sap.hana.xs.admin.roles::HTTPDestAdministrator |
Full access to HTTP destination configurations (display and edit). |
sap.hana.xs.admin.roles::TrustStoreViewer |
Read-only access to the trust store, which contains the server's root certificate or the certificate of the certification authority that signed the server’s certificate. |
sap.hana.xs.admin.roles::TrustStoreAdministrator |
Full access to the SAP HANA XS application trust store to manage the certificates required to start SAP HANA XS applications. |
После добавления ролей нажмите кнопку «Сохранить». Вашему пользователю будут добавлены права, необходимые для работы. Теперь можно вернуться в начальный экран SAP Cloud Platform и выбрать строку SAP HANA Web-based Development Workbench.
![](https://habrastorage.org/files/526/324/907/5263249078354368b27dc26fd1eb3884.png)
Откроется страница с набором сервисов.
![](https://habrastorage.org/files/1b8/c45/574/1b8c45574c524540aa49a45078eb628c.png)
Нажав, например, плитку Catalog, вы сможете посмотреть структуру базы: таблицы, view, пакеты.
![](https://habrastorage.org/getpro/habr/post_images/4d6/265/2d5/4d62652d5083af1fde7a1fed3240c9ef.png)
С помощью данного инструмента мы сможем увидеть в дальнейшем, как данные с подключенных датчиков попадают в созданную IoT-сервисом специальную таблицу.
Шаг 3. Активируем и настраиваем сервис SAP Cloud Platform for IoT
Теперь наша только что созданная БД готова к приему данных. Перейдем на закладку Services и, прокрутив список услуг, которыми вы можете пользоваться, найдем сервис Internet of Things.
![](https://habrastorage.org/files/d52/adc/e1f/d52adce1fdbd471dba60aae7fb7ee762.png)
Как видите, он пока не работает. Давайте его активируем. Нажав на сервис, мы попадем в панель настройки, где должны нажать кнопку Enable для его запуска.
![](https://habrastorage.org/files/76f/d7d/726/76fd7d726c8a4fbf9ee3b77e90fcff99.png)
Через некоторое время вы увидите зеленую надпись Enabled. Это означает, что сервис готов к работе. Именно этот сервис займется сбором данных с датчиков и сохранением их в БД. Он позволит автоматизировать большую часть работы и сделать это максимально быстро и удобно для разработчика.
Давайте настроим сервис на прием данных с датчиков. Перейдя на закладку управления сервисом IoT, нажмите ссылку Go to Service.
![](https://habrastorage.org/files/565/d48/7bb/565d487bb23a424a9c9a9fa4cfcadad5.png)
Перед вами появится панель управления подключением внешних устройств и датчиков.
![](https://habrastorage.org/getpro/habr/post_images/b99/4cb/1b8/b994cb1b810621debed9c27130c73392.png)
Как вы видите, цифра 0 во всех разделах говорит нам о том, что никакие устройства к сервису пока не подключены. Что означают разделы?
Device Types – типы устройств. Это общее описание класса устройств. Например, «Метеостанция» или «Устройство управления линией покраски».
Message Type – типы сообщений или данные, которые может отдавать или принимать устройство. Например «Данные о погоде». При этом тип «Данные о погоде» может передавать температуру, влажность, уровень осадков, атмосферное давление и так далее.
Devices – конкретное устройство с определенным номером, которое мы будет подключать. Например «Метеостанция №1 ВДНХ», «Метеостанция №2 Воробьевы Горы».
Deploy Message – Кнопка запуска, при ее нажатии произойдет автоматическая настройка сервиса и активация работы.
Send and view messages – раздел, с помощью которого можно протестировать работу сервиса IoT. Мы сэмулируем работу датчиков (даже если у нас их нет), передадим сообщение в нужном формате и посмотрим уже переданные данные в табличном виде.
Давайте настроим наше устройство. Выбираем раздел Message Type и в нижнем левом углу появившейся формы нажимаем «плюс».
![](https://habrastorage.org/files/479/9b7/310/4799b7310bbc4a3ebc60f5b4b794177c.png)
Создадим тип сообщений TempLightHumidity для типа устройства Arduino c двусторонним направлением передачи данных Bidirectional. Удаляем поле timestamp, которое отображается по умолчанию, и создаем четыре собственных поля:
Temperature тип Integer
Light тип Integer
Humidity тип Integer
![](https://habrastorage.org/getpro/habr/post_images/533/815/f92/533815f92bf2161c8d3c9d6ed184ceb7.png)
Нажимаем кнопку Create. Теперь у нас созданы четыре поля, в которые мы сможем передать информацию с датчиков о температуре, влажности, уровне освещенности.
Возвращаемся на главный экран. Нам нужно создать тип устройства, который будет собирать данные. Нажмите Device Type и создайте тип Arduino с привязкой к типу сообщения TempLightHumidity.
![](https://habrastorage.org/files/1bb/5e3/c44/1bb5e3c44b0e49e293711b610e473e62.png)
Заключительный шаг – создание экземпляра устройства в разделе Devices
![](https://habrastorage.org/getpro/habr/post_images/0df/d62/739/0dfd62739d2a70d780a4f68bae1c5b5d.png)
Заполним название устройства – ArduinoForTraining и укажем данные, которые он будет передавать – Arduino.
После сохранения устройства система выдаст важную информацию – Token, который позднее потребуется для того, чтобы устройство смогло авторизоваться в системе SAP Cloud Platform. Запишите его.
![](https://habrastorage.org/getpro/habr/post_images/32d/8fc/faf/32d8fcfaf8d8fb0f3c0af3756a3f5a85.png)
Если вы забыли записать token, позднее можно будет сгенерировать новый, нажав на кнопку Generate Token.
Кроме Token нам потребуются еще два параметра: ID Message Type и ID экземпляра устройства. Первый параметр можно найти на закладке «Информация» в типе сообщений.
![](https://habrastorage.org/files/238/8da/492/2388da49273341f4baa0640989bf280c.png)
Второй параметр – на странице экземпляра устройства.
![](https://habrastorage.org/files/4f8/587/9e8/4f85879e847b4a3abd3f6151d55215c4.png)
В моем случае получились следующие параметры:
ID Message Type = 3531068190e9d68c4a0a
ID экземпляра устройства = 8a61bdd3-c50b-4585-a3f4-dba7f05af22e
Token = e0b0dc97cc4913311a17cfcdb3f9321e
Теперь все настройки сделаны.
![](https://habrastorage.org/getpro/habr/post_images/d83/2ba/02c/d832ba02cc764aae644f4e5bfad67176.png)
Можно запустить активацию настроек сервиса, перейдя в пункт Deploy Message.
Введите свои данные и пароль к системе SAP Cloud Platform и нажмите кнопку Deploy.
![](https://habrastorage.org/getpro/habr/post_images/0e8/dba/42b/0e8dba42b3b91f51428b46917e87d283.png)
Если все настроено правильно, вы получите сообщение об успешной активации.
![](https://habrastorage.org/getpro/habr/post_images/9b2/6ff/571/9b26ff5710592e5de0dba17f52992e91.png)
Вернемся в пульт управления SAP Cloud Platform и перейдем в раздел Java Application. Там вы увидите новое приложение iotmms.
![](https://habrastorage.org/getpro/habr/post_images/45d/af4/b35/45daf4b356ed9353b362fb4832e5b543.png)
Это специальное приложение, которое автоматически создается системой для сбора данных с датчиков по настройкам, которые вы только что задали. Пока статус у приложения «желтый» — требуется немного времени на его запуск. Через 1-2 минуты приложение полностью стартует, о чем просигнализирует зеленым цветом в столбце State.
![](https://habrastorage.org/getpro/habr/post_images/006/426/022/0064260227d0767d2339f9a41473438d.png)
Вы можете войти в приложение и посмотреть, как им можно управлять: останавливать, задавать права доступа, проверять его работу и тестировать производительность. Большинство настроек в нашем примере не потребуется. Выполним лишь одну – привяжем сервис к нашей базе данных. По умолчанию приложение записывает все данные в собственную схему БД.
Перейдем в раздел Configuration > Data Source Binding в левой инструментальной панели. Удалим привязку к данным, созданную по умолчанию, нажав кнопку Delete.
![](https://habrastorage.org/files/fe6/dfc/731/fe6dfc731fa14a08bb406c3472eccd1d.png)
Нажмем кнопку New Binding. Система сама предложит привязать сервис к нашей БД. Вам требуется лишь ввести данные для подключения: login – SYSTEM (или название своего пользователя, если вы сделали его ранее) и пароль. Далее сохраняем введенные параметры, нажав кнопку Save.
![](https://habrastorage.org/files/0d7/a08/243/0d7a082433684fed99dd1f0ac4fde4f9.png)
Схема, созданная по умолчанию, заменена на нашу собственную.
![](https://habrastorage.org/getpro/habr/post_images/27d/a50/fbb/27da50fbb5b52084cff14205615047b2.png)
Еще одной важной настройкой является выдача прав доступа к IoT-приложению. Нам необходимо разрешить нашему пользователю работать с созданной программой iotmms. Перейдем на закладку Security > Roles.
![](https://habrastorage.org/files/1ab/47b/877/1ab47b87705443ad8b16287db0e71e69.png)
Видно, что уже существует роль, которая позволяет работать с данной программой – IoT-MMS_User. Ее необходимо добавить нашему пользователю. Нажмите кнопку Assign в левой нижней таблице и введите User ID.
![](https://habrastorage.org/files/03c/76c/282/03c76c2828b34c189a27ec49130c06f6.png)
Имя пользователя вы можете найти в разделе Account в настройке SAP Cloud Platform или в адресной строке браузера.
![](https://habrastorage.org/getpro/habr/post_images/dc3/78a/9f4/dc378a9f432e10692e8ff999cd8eed28.png)
Для того, чтобы все наши настройки вступили в силу и заработала привязка к новой базе данных, вам необходимо перезапустить сервис iotmms. Для этого зайдите в настройки iotmms и нажмите «Stop», а после – «Start». Новые настройки вступят в силу, и данные будут записываться в нашу базу данных.
![](https://habrastorage.org/files/c15/12b/ab5/c1512bab54ca471787cf2ca9389f618d.png)
Возвращаемся в раздел Services. Здесь необходимо выбрать сервис Internet of Things и запустить настройку go to Service. Будем проверять его работу.
![](https://habrastorage.org/getpro/habr/post_images/a47/f7b/af8/a47f7baf868f27c71409091eef07be7a.png)
Шаг 4. Тестируем сервис IoT и передачу тестового сообщения в SAP Cloud Platform
Переходим в раздел Send Message.
![](https://habrastorage.org/getpro/habr/post_images/163/5cd/e3b/1635cde3b05b4a405266e171d829ad7b.png)
Здесь мы можем посмотреть переданные с устройства сообщения или протестировать передачу.
![](https://habrastorage.org/getpro/habr/post_images/695/c00/0d0/695c000d06fbb5286265bad9270b3130.png)
Зайдем в раздел Display stored message.
![](https://habrastorage.org/getpro/habr/post_images/e8a/760/2cb/e8a7602cbb1457c3a1b8d510cb85d2de.png)
Тут вы увидите две технические таблицы, по данным из которых всегда можно узнать состояние подключенных устройств: работает или нет, когда данные передавались последний раз и многое другое. Вы можете посмотреть, какие данные хранятся в этих таблицах, просто нажав на них.
![](https://habrastorage.org/getpro/habr/post_images/c64/0ef/6ab/c640ef6abbfa1b8879d20468c626c899.png)
Но таблицы с нашими данными о температуре, влажности, уровне света пока нет. Она будет создана автоматически, как только первые данные будут переданы с датчика в платформу SAP Cloud Platform.
Попробуем передать первое сообщение с устройства. Пока мы будем тестировать работу сервиса без физического подключения микроконтроллера. Сообщение передадим в виде HTTP запроса, который сформируем в панели управления. Но для начала вспомним сохраненные ранее параметры:
ID Message Type = 3531068190e9d68c4a0a
ID экземпляра устройства = 8a61bdd3-c50b-4585-a3f4-dba7f05af22e
Token = e0b0dc97cc4913311a17cfcdb3f9321e
Идем в раздел Send and receive massage through HTTP.
![](https://habrastorage.org/getpro/habr/post_images/d21/d7e/281/d21d7e281eccb63ef4a7eebec31fddf3.png)
Здесь есть специальный инструмент для эмуляции передачи сообщений с датчиков.
![](https://habrastorage.org/getpro/habr/post_images/b16/fb6/c02/b16fb6c025c52bfcdb854c81f9fe1bf5.png)
Он представляет из себя обыкновенный Rest API клиент для формирования HTTP-запроса к удаленной службе. Вы также можете воспользоваться любым другим удобным для вас инструментом. Вариант с Google Chrome расширением я покажу позднее.
Добавляем правильные идентификаторы наших устройств и чуть изменяем формат передаваемого сообщения, согласно нашей настройке.
![](https://habrastorage.org/files/c94/efc/72b/c94efc72b003406aa35bb6987fdd6a87.png)
В разделе HTTP endpoint нужно заменить обращение к устройству на наше собственное (сохраненное ранее) ID экземпляра устройства. Так система сможет понять, что сигнал идет именно от датчика с нужным номером.
iotmmsp1942514293trial.hanatrial.ondemand.com/com.sap.iotservices.mms/v1/api/http/data/8a61bdd3-c50b-4585-a3f4-dba7f05af22e
В разделе Message to Post нужно вставить наш Message ID и добавить поля:
{«mode»:«sync»,«messageType»:"3531068190e9d68c4a0a",«messages»:[{«Temperature»:17,«Light»:23, «Humidity» :65}]}
Красным шрифтом выделены параметры – ID сообщения и ID экземпляра устройства. Token нам пока не понадобится. Так как это внутреннее средство тестирования, то система игнорирует настройки безопасности. А вот если мы попробуем сделать это из стороннего приложения, система не разрешит заходить без token, т.е. без пароля.
Теперь все готово и можно нажать кнопку Post. Ваше первое сообщение было передано в SAP Cloud Platform! Вы сможете проверить это в разделе Reply from Service. Если что-то не так, здесь будет указан код ошибки, который вернул удаленный сервис IoT. По коду вы сможете понять, что случилось.
![](https://habrastorage.org/files/8c9/cc6/90c/8c9cc690c73346dbac37b5fe5981f1df.png)
Теперь вернитесь в раздел Send and view message и выберите Display Stored Messages.
![](https://habrastorage.org/files/0a1/c5e/736/0a1c5e736fa4401b94fdd686c175ea01.png)
Здесь вы увидите еще две таблицы, которые были созданы автоматически, как только мы передали данные в систему.
![](https://habrastorage.org/getpro/habr/post_images/f0c/175/80e/f0c17580e3e7bf0975dab12b39cac05e.png)
Посмотрите содержимое таблицы и убедитесь, что это именно те данные, которые вы передавали для теста.
![](https://habrastorage.org/getpro/habr/post_images/c3e/a13/42e/c3ea1342edd6dcb23a4e6cb46f955271.png)
Попробуйте поменять тестовые данные для температуры или уровня освещенности и передать данные еще раз. В своем примере мы несколько раз меняли параметр уровня освещенности.
![](https://habrastorage.org/getpro/habr/post_images/331/b0b/335/331b0b33502000acdaa49d47c06e171f.png)
Зайдя в таблицу, мы видим, что IoT-сервис готов принимать данные с датчиков.
![](https://habrastorage.org/getpro/habr/post_images/3d6/9ca/3e1/3d69ca3e1ff76ef63af8533c3b5da653.png)
Все ваши записи были сохранены автоматически. А выбрав значок показа данных в графическом виде и свой тип данных + экземпляр, вы увидите их в виде графика.
![](https://habrastorage.org/files/20c/464/2b5/20c4642b58b24453bd9d8e6511363195.png)
Шаг 5. Тестируем IoT-сервис с помощью расширения Advanced Rest Client в браузере Google Chrome
А теперь давайте протестируем наш сервис с учетом всех требований безопасности. Для этого нам потребуется браузер Google Chrome. Установите браузер. Запустите. В строке поиска введите advanced rest client.
![](https://habrastorage.org/getpro/habr/post_images/4e5/c54/6ef/4e5c546ef980c63073b37a23503d6c31.png)
Это специальное расширение браузера Google Chrome, которое предназначено для разработчиков. Оно помогает тестировать HTTP-запросы без необходимости разработки собственных программ.
Установите приложение (первая ссылка в результатах поиска), нажав кнопку Add to Chrome.
![](https://habrastorage.org/getpro/habr/post_images/31b/ebf/96a/31bebf96a37b12375dd9108b57a971a7.png)
![](https://habrastorage.org/getpro/habr/post_images/3cb/76b/c73/3cb76bc7352981b60662cb07f83dbb8d.png)
И запустите, нажав ARC в списке сервисов.
![](https://habrastorage.org/getpro/habr/post_images/949/96f/ff8/94996fff8018328191d2820788a70dc3.png)
Вам необходимо сконструировать вызов метода POST, задав необходимые параметры, как вы это уже делали, тестируя сервис средствами SAP Cloud Platform. Отличие заключается лишь в том, что необходимо позаботиться о передаче секретного кода token в заголовке POST-запроса.
В заголовке URL введите аналогичную строку с ID устройства:
iotmmsp1942514293trial.hanatrial.ondemand.com/com.sap.iotservices.mms/v1/api/http/data/8a61bdd3-c50b-4585-a3f4-dba7f05af22e
В теле сообщения передайте значение параметров:
{«mode»:«sync»,«messageType»:"3531068190e9d68c4a0a",«messages»:[{«Temperature»:17,«Light»:23, «Humidity» :65}]}
Заголовок Headers мы не заполняли, и он должен быть указанного формата:
Content-Type: application/json;charset=UTF-8
Authorization: Bearer e0b0dc97cc4913311a17cfcdb3f9321e
Где красным текстом отмечены параметры, которые нужно поменять (в том числе и token) на те, что мы записывали ранее. В итоге должна получиться следующая картина:
![](https://habrastorage.org/files/0d2/1db/1d7/0d21db1d7e5b4605ba1e5f5d43ec3a9e.png)
Нажав Send, вы увидите ответ от сервера и сможете посмотреть переданную запись.
![](https://habrastorage.org/getpro/habr/post_images/419/430/b5f/419430b5fcedae692bf4c17bd4e436e3.png)
Попробуйте провести эксперимент. Уберите строчку
Authorization: Bearer 58536ee037cf158db4992d5538b8d5b0
Сервер не пропускает такой запрос, отвечает ошибкой авторизации 401. Тем самым мы страхуемся от подключения несанкционированных устройств.
![](https://habrastorage.org/getpro/habr/post_images/36e/bf8/e39/36ebf8e3964d7ad84a835adef640246f.png)
Это лишь один из примеров, как работает система безопасности SAP Cloud Platform. В промышленных программах к безопасности относятся еще более серьезно и применяют различные методы (не только авторизация с помощью token) для защиты программ и промышленных систем.
Альтернатива: настраиваем работу IoT-сервиса по протоколу MQTT
Если вы внимательно изучили приложение для тестирования IoT-сервиса, то могли заметить еще один вариант работы с данными – через протокол MQTT.
![](https://habrastorage.org/files/370/8de/176/3708de1766a247abaedc1c41eeddfb20.png)
MQTT (Message Queuing Telemetry Transport) – это простой открытый протокол, разработанный специально для IoT и применяемый для обмена данными между устройствами. MQTT-сеть включает в себя MQTT-брокера, который служит посредником во взаимодействии MQTT-агентов – издателей и подписчиков. Издатели публикуют информацию, предназначенную для подписчиков.
![](https://habrastorage.org/getpro/habr/post_images/962/5f8/874/9625f8874c5f3f773b5cd16e8c71a7ff.png)
Брокер, издатель и подписчик в MQTT-сети
MQTT разработан в расчёте на маломощные встроенные устройства, поэтому вычислительные требования для его реализации минимальны. Протокол отличается высокой эффективностью даже на каналах с низкой пропускной способностью. В структуре передаваемых с его помощью данных очень мало служебной информации. По измерениям, сделанным в 3G-сетях, пропускная способность MQTT в 93 раза выше, чем протокола REST (Representational State Transfer), работающего поверх HTTP.
MQTT использует ограниченный набор команд, все они сводятся к взаимодействию с брокером и к работе с темами и сообщениями. Агенты подключаются к брокеру, а затем либо публикуют темы и сообщения в них, либо подписываются на темы и получают сообщения, в этих темах опубликованные. Завершив работу, агенты отключаются от брокера.
Подробнее о принципах работы протокола MQTT вы сможете прочитать в различных статьях в Интернете, в том числе и на Habrahabr. Например здесь.
Для того, чтобы начать работать с протоколом MQTT, нам необходимо выбрать брокера, через который будем обмениваться данными между устройствами и платформой SAP Cloud Platform. Существует множество бесплатных брокеров MQTT, также вы можете установить свой собственный брокер. В нашем случае воспользуемся MQTT-брокером test.mosca.io. Данный брокер настроен на порт 1883 и не требует имени пользователя или пароля для работы.
Давайте сконфигурируем наш IoT-сервис для работы с этим MQTT брокером.
![](https://habrastorage.org/files/2ff/912/c2c/2ff912c2cf7640f4863c56262e557f48.png)
Выберите пункт Configure the Message Management Service.
В разделе Data введите настройки вашего MQTT брокера:
tcp://test.mosca.io:1883
![](https://habrastorage.org/files/0cd/fb4/688/0cdfb4688c274c07bb6b0d99fd9c81cf.png)
Если ваш MQTT-брокер использует для авторизации имя и пароль, эти данные также требуется ввести в настройки сервиса. В нашем случае для пользователя и пароля введите: test\test
После сохранения данных перейдите в раздел Messaging through MQTT over TCP.
![](https://habrastorage.org/files/a4b/b14/3a7/a4bb143a70f04ac98b679123b517ffb2.png)
![](https://habrastorage.org/getpro/habr/post_images/c0a/00d/ac6/c0a00dac66d37382ac1b495cf567127b.png)
В раздел Device ID введите свои данные: 8a61bdd3-c50b-4585-a3f4-dba7f05af22e
В поле Message:
{«mode»:«sync»,«messageType»:"3531068190e9d68c4a0a",«messages»:[{«Temperature»:25,«Light»:23, «Humidity» :65}]}
И нажмите кнопку «Connect» для подключения к брокеру.
![](https://habrastorage.org/getpro/habr/post_images/07e/75d/00f/07e75d00f01db427060bff720250a452.png)
Попробуйте передать сообщение, нажав Send на форме.
![](https://habrastorage.org/files/3ac/afb/524/3acafb52493e495a9f8d52a41470a4c6.png)
Проконтролируйте, что ваше сообщение было передано в таблицу IoT через MQTT-брокер.
![](https://habrastorage.org/files/756/358/7e8/7563587e85e944fa80304bcd9601bb3b.png)
Вы можете попробовать передать сообщение в платформу SAP Cloud Platform через сторонний MQTT-клиент. Например, через MQTT FX.
Установите программу и настройте подключение к своему MQTT брокеру.
![](https://habrastorage.org/getpro/habr/post_images/258/9df/3b3/2589df3b34f282dff7fffc728866d59b.png)
Нажмите Connect и на закладке Subscribe подпишитесь на топик, который вы видели в настройке IoT-сервиса:
iot/data/iotmmsp1942514293trial/v1/8a61bdd3-c50b-4585-a3f4-dba7f05af22e
![](https://habrastorage.org/files/7f1/d29/33f/7f1d2933fd7d43f88d34eaf0ab36ffdb.png)
![](https://habrastorage.org/files/3df/a1f/26c/3dfa1f26cd7949f78e180e0704b75483.png)
На закладке Publish вы можете передавать сообщения с соответствующим топиком через брокер в настроенный сервис IoT.
![](https://habrastorage.org/files/ece/dc8/2e5/ecedc82e55bc4a7b9cfc208bccd3c445.png)
Попробуйте передать несколько значений и убедиться, что прием данных проходит успешно.
Шаг 6. Готовим «железо» на Arduino
В данном разделе мы подключим к платформе настоящий контроллер и датчики. В качестве управляющего устройства выступит микроконтроллер Arduino Yun. Arduino является очень удобной платформой быстрой разработки электронных устройств для новичков и профессионалов.
![](https://habrastorage.org/getpro/habr/post_images/647/71d/37f/64771d37f87c3600777c77d40bd6938f.png)
Arduino Yun удобен тем, что помимо основного микроконтроллера Atmel ATmega32U4 имеет дополнительный процессор Atheros AR9331, работающий под управлением Linux с беспроводным стеком OpenWrt. Для нашего проекта это подходящее устройство, так как несет «на борту» Linux и позволяет подключаться через HTTPS протокол к удаленным сервисам, в том числе и к SAP Cloud Platform.
Перед началом работы нам необходимо поставить среду разработки программ для Arduino, сделать первоначальную настройку микроконтроллера и подключить его к сети (проводной или WiFi).
В качестве датчиков и средств управления для нашего Arduino будем использовать:
1) Кнопку.
![](https://habrastorage.org/getpro/habr/post_images/b2c/ea0/ec1/b2cea0ec14bdcc25248b2a554a4a49c6.jpg)
2) Цифровой датчик температуры и влажности.
![](https://habrastorage.org/getpro/habr/post_images/3ff/010/520/3ff0105208ed5a63d89abe05b4ef2203.jpg)
3) Датчик освещенности.
![](https://habrastorage.org/getpro/habr/post_images/64a/bf0/a52/64abf0a52b5910e5ae2e8374cf7a8f6f.jpg)
4) Светодиод.
![](https://habrastorage.org/getpro/habr/post_images/84e/3ec/580/84e3ec580545200ae04991075dac30cb.jpg)
Вместо указанных датчиков вы можете использовать любые другие, внеся соответствующие изменения в управляющую программу.
Каждый датчик имеет три контакта – S, V, G.
Подключите датчики, согласно схеме.
Подключение кнопки:
8 контакт (V — питание, красный)
9 контакт (G — земля, черный)
10 контакт (S — сигнал, желтый)
Подключение светодиода:
11 контакт (V — питание, красный)
12 контакт (G — земля, черный)
13 контакт (S — сигнал, желтый)
Подключение фотодиода:
A0 контакт (S — сигнал, желтый)
A1 контакт (V — питание, красный)
A2 контакт (G — земля, черный)
Подключение датчика температуры:
A3 контакт (S — сигнал, желтый)
A4 контакт (V — питание, красный)
A5 контакт (G — земля, черный)
![](https://habrastorage.org/getpro/habr/post_images/095/6b2/e03/0956b2e03e9aea622b248ae7291f14cc.jpg)
![](https://habrastorage.org/getpro/habr/post_images/aa1/8fe/2de/aa18fe2deaa4ae4090a9cc533282ffc8.jpg)
Шаг 7. Организуем передачу данных с Arduino в облако через HTTP
Настроим передачу данных в платформу SAP Cloud Platform путем вызова POST запроса по протоколу HTTP. При нажатии на кнопку в систему SAP Cloud Platform должны будут передаваться данные по уровню освещенности, влажности и температуре.
Особенность работы данной программы заключается в том, что SAP Cloud Platform в триальной версии требует обязательной организации безопасного соединения по протоколу HTTPS, что невозможно сделать в обычных версиях Arduino. Поэтому нам приходится использовать версию Arduino Yun со встроенным Linux. Проще всего это сделать с помощью служебной программы CURL, что и реализовано в скрипте ниже.
Для отладки и проверки скрипта я рекомендую попробовать работу утилиты CURL, напрямую подключившись к Arduino Yun в терминальном режиме через Putty. Для этого вам потребуется скачать с сайта Putty.org утилиту, с помощью которой можно подключаться к микроконтроллеру. Или напрямую воспользоваться терминалом, если вы работаете в Linux среде.
![](https://habrastorage.org/getpro/habr/post_images/3d3/a32/6c6/3d3a326c6ca80f924c92f37fa721a94b.png)
Внесите IP-адрес в утилиту в поле Host Name or IP
![](https://habrastorage.org/getpro/habr/post_images/09c/362/d91/09c362d911be285a17dd90c09eb33b28.png)
Внесите IP-адрес в утилиту в поле Host Name or IP
Тип подключения SSH. Нажмите Open.
В терминальном режиме наберите имя пользователя root.
![](https://habrastorage.org/getpro/habr/post_images/947/f38/657/947f3865760a7b461600d7b812e8637c.png)
И пароль, который вы задавали в настройках соединения с Arduino.
Система подключена и готова выполнять команды.
![](https://habrastorage.org/getpro/habr/post_images/b68/b71/a6e/b68b71a6ee3dbea948c709ed4981ba46.png)
Адаптируйте команду curl, согласно вашим данным:
curl --header «Authorization: Bearer e0b0dc97cc4913311a17cfcdb3f9321e» --header «Content-Type:application/json;charset=UTF-8» -k -X POST iotmmsp1942514293trial.hanatrial.ondemand.com/com.sap.iotservices.mms/v1/api/http/data/8a61bdd3-c50b-4585-a3f4-dba7f05af22e --data ''{''mode'':''async'',''messageType'':''<font color = ''cc0000''>3531068190e9d68c4a0a'',''messages'':[{''Temperature'':23, ''Light'':21, ''Humidity'':65}]}''
Фрагменты, выделенные красным, надо изменить в соответствии с вашими параметрами. Скопируйте готовый текст. В терминале нажмите правую кнопку мыши. Текст скопируется.
Нажмите Enter.
![](https://habrastorage.org/getpro/habr/post_images/50a/bc5/642/50abc5642717e8e6920cd951ec452d29.png)
Если все параметры указаны верно и настройки Arduino Yun выполнены корректно, то сервер SAP Cloud Platform вернет подтверждение о сохранении записи сервисом IoT: 1 message received from device.
#include <TroykaDHT11.h>
#include <Process.h>
// Инициализация переменных
DHT11 dht(A3);
int check;
int Light_v;
int Temp_v;
int Humidity_v;
void setup() {
Bridge.begin();
Serial.begin(9600);
dht.begin();
//Инициализация кнопки
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, INPUT);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
//Инициализация светодиода
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
//Инициализация фотодиода
pinMode(A0, INPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(A1, HIGH);
digitalWrite(A2, LOW);
//Инициализация датчика температуры
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
digitalWrite(A4, HIGH);
digitalWrite(A5, LOW);
}
void pushToCloud(int Temperature_value, int Light_value, int Humidity_value)
{
//Передача данных в SAP Cloud Platform с помощью встроенной в Linux служебной программы curl
Process p;
p.begin("curl");
p.addParameter("-k");
p.addParameter("-f");
p.addParameter("-H");
p.addParameter("Authorization: Bearer e0b0dc97cc4913311a17cfcdb3f9321e");
p.addParameter("-H");
p.addParameter("Content-Type: application/json;charset=UTF-8");
//p.addParameter("-X");
p.addParameter("POST");
p.addParameter("<a href="https://iotmmsp1941889917trial.hanatrial.ondemand.com/com.sap.iotservices.mms/v1/api/http/data/a0e2ed53-f5a4-4aa8-bdac-379b9c2c197e">https://iotmmsp1942514293trial.hanatrial.ondemand.com/com.sap.iotservices.mms/v1/api/http/data/8a61bdd3-c50b-4585-a3f4-dba7f05af22e </a> ");
p.addParameter("--data");
String str;
str = "{\"mode\":\"async\",\"messageType\":\"<b>3531068190e9d68c4a0a</b>\",\"messages\":[{\"Temperature\":" + String(Temperature_value) + ",\"Light\":" + String(Light_value) + ",\"Humidity\":" + String(Humidity_value) + "}]}";
p.addParameter(str);
p.run();
//Вывод результата работы утилиты curl в серийный порт
Serial.println(str);
Serial.print("Exit: ");
Serial.println(p.exitValue());
}
void loop() {
// Считываем данные с цифрового датчика температуры и влажности
check = dht.read();
// Если кнопка нажата, зажигаем светодиод
digitalWrite(13, digitalRead(10));
//Считываем уровень света
if (digitalRead(10)) {
Light_v = analogRead(0);
Serial.print("Light = ");
Serial.println(Light_v);
//Считываем уровень температуры
Temp_v = dht.getTemperatureC();
Serial.print("Temperature = ");
Serial.print(Temp_v);
Serial.println("C \t");
//Считываем уровень влажности
Humidity_v = dht.getHumidity();
Serial.print("Humidity = ");
Serial.print(Humidity_v);
Serial.println("%");
Serial.println("");
//Передача данных в SAP Cloud Platform
pushToCloud(Temp_v, Light_v, Humidity_v);
delay(100);
}
}
Обратите внимание, что для работы датчика температуры вам потребуется готовая библиотека TroykaDHT11.h, которую нужно подключить к среде разработки программ Arduino IDE.
Библиотеку вы можете найти в Интернете по адресу https://github.com/amperka/TroykaDHT11.
Скачайте и подключите библиотеку.
![](https://habrastorage.org/getpro/habr/post_images/56b/d7c/f28/56bd7cf282e495556ca64029b85c7f12.png)
Запустив скетч и вызвав монитор, вы увидите, как, нажимая на кнопку, вы передаете данные по температуре, влажности, освещенности в SAP Cloud Platform.
![](https://habrastorage.org/getpro/habr/post_images/5fb/c7b/ed4/5fbc7bed4d8512aae32aa2346f728742.png)
Работу программы вы сможете увидеть, вызвав данные для просмотра непосредственно в таблицах IoT.
Альтернатива: организуем передачу данных с Arduino в облако через MQTT
#include <TroykaDHT11.h>
#include <Process.h>
#include <Bridge.h>
#include <BridgeClient.h>
#include <SPI.h>
#include <PubSubClient.h>
// Инициализация переменных
DHT11 dht(A3);
int check;
int Light_v;
int Temp_v;
int Humidity_v;
char message_buff[200];
void callback(char* topic, byte* payload, unsigned int length) {
// Обработка входящих сообщений
}
// Инициализация MQTT-клиента
BridgeClient ethClient;
PubSubClient client("test.mosca.io", 1883, callback, ethClient);
void setup() {
Bridge.begin();
Serial.begin(9600);
dht.begin();
//Подключаемся к MQTT серверу
if (client.connect("arduinoClient", "test", "test"))
//при необходимости ввести имя пользователя и пароль
{
client.subscribe("iot/data/iotmmsp1942514293trial/v1/8a61bdd3-c50b-4585-a3f4-dba7f05af22e");
}
//Инициализация кнопки
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, INPUT);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
//Инициализация светодиода
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
//Инициализация фотодиода
pinMode(A0, INPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(A1, HIGH);
digitalWrite(A2, LOW);
//Инициализация датчика температуры
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
digitalWrite(A4, HIGH);
digitalWrite(A5, LOW);
}
void pushToCloud(int Temperature_value, int Light_value, int Humidity_value)
{
//Передача данных в SAP Cloud Platform с помощью встроенной в Linux служебной программы curl
if (!client.connected())
{
client.connect("arduinoClient", "test", "test");
//при необходимости ввести имя пользователя и пароль
}
String str = "{\"mode\":\"async\",\"messageType\":\"d8bda569c1340f7ee7fb\",\"messages\":[{\"Temperature\":" + String(Temperature_value) + ",\"Light\":" + String(Light_value) + ",\"Humidity\":" + String(Humidity_value) + "}]}";
str.toCharArray(message_buff, str.length()+1);
client.publish("iot/data/iotmmsp1942514293trial/v1/8a61bdd3-c50b-4585-a3f4-dba7f05af22e", message_buff);
}
void loop() {
// Считываем данные с цифрового датчика температуры и влажности
check = dht.read();
// Если кнопка нажата, зажигаем светодиод
digitalWrite(13, digitalRead(10));
//Считываем уровень света
if (digitalRead(10)) {
Light_v = analogRead(0);
Serial.print("Light = ");
Serial.println(Light_v);
//Считываем уровень температуры
Temp_v = dht.getTemperatureC();
Serial.print("Temperature = ");
Serial.print(Temp_v);
Serial.println("C \t");
//Считываем уровень влажности
Humidity_v = dht.getHumidity();
Serial.print("Humidity = ");
Serial.print(Humidity_v);
Serial.println("%");
Serial.println("");
//Передача данных в SAP Cloud Platform
client.loop();
pushToCloud(Temp_v, Light_v, Humidity_v);
delay(100);
}
}
Данный скетч для своей работы требует установки библиотеки PubSubClient, которую можно найти здесь.
Если вы планируете использовать версию Arduino, отличную от Yun, необходимо внести небольшие изменения в программу для работы с Ethernet Shield. Например, вместо библиотеки BridgeClient требуется использовать EthernetClient. Примеры подобных программ легко найти в Интернете.
В данной статье мы рассмотрели первые шаги по работе с платформой SAP Cloud Platform и сбору данных с нетипового устройства/оборудования. Создание законченного IoT-приложения на основе собранных данных будет темой следующей статьи. Stay with us!
Кстати, регистрация участников конкурса SAP Кодер 2017 продолжается
А здесь вы можете узнать о SAP Cloud Platform больше и ознакомиться с дополнительными материалами.
Комментарии (9)
Igor_34_rus
17.04.2017 17:24Застрял на добавлении ролей.
Выдаёт ошибки:
11:39:41 (Security Editor) Changing 'SYSTEM' user failed:
404 — Could not grant role 'sap.hana.xs.ide.roles::EditorDeveloper' since you insufficient privilege on 'GRANT_ACTIVATED_ROLE' object
11:41:39 (Security Editor) Changing 'CRAWLER2' user failed:
404 — Could not grant role 'sap.hana.xs.admin.roles::HTTPDestViewer' since you insufficient privilege on 'GRANT_ACTIVATED_ROLE' object
как заполучить «privilege»?SAP
17.04.2017 21:23Попробуйте сделать следующее:
1. Пересоздать базу данных HANA MDC (trial) через Persistence -> Database&Schemas -> New
2. После создания базы данных перейти в SAP HANA Web-based Development Workbench и далее Security
3. Для пользователя SYSTEM добавить необходимые роли и после сохранить изменения через кнопку Save
Alexandr1bu
18.04.2017 22:21Заработало! Видимо вы специально оставили ошибки на внимательность? В примере для curl допишите https:// перед адресом а то работать не будет. В месте где проверка срипта все должно быть введен с дюймовыми скобками "" с канцелярскими работать не будет!
Alexandr1bu
19.04.2017 08:26Спасибо за статью, прикоснутся к сапу были интересно… будет еще статья как настроить красивые графики?, как их смотреть с iOS — Android устройств? Сейчас все выглядит скупо и не информативно, так и задумывалось?
DenisSavkin
24.04.2017 12:48Александр, спасибо за комментарии! «Ошибки на внимательность» поправим. Мысль оставить ошибки интересная, но мы так не задумывали :). График в данном демо — это очень простой механизм визуализации IoT данных с датчиков штатными средствами самой платформы SCP. Конечно, есть более интересные возможности по визуализации. В том числе и для мобильных приложений. В данном примере мы совсем не касались вопроса создания клиентских приложений на базе технологии SAP FIORI. Это тема для отдельной статьи. Заявка принята — обязательно напишем статью и пример для того, чтобы показать как создавать пользовательские приложения!
Alexandr1bu
Делаю максимально по инструкции в Services>IOT>Go to services>Send and view messages… получаю blanj page с текстом Access to the requested resource is forbidden (HTTP 403). — что может быть?
И как я понел делать базу плохая идея, из-за того что trial она будет каждые 12 часов останавливаться и её надо вручную запускать или платить, а в iotmms уже есть база и не похоже что она остановится (обратного отсчета нет)
Очень хочется настроить и посмотреть как выглядят собранные данные, графики красивости есть?
SAP
Если мы правильно поняли, то, возможно, ошибка возникает из-за того, что у пользователя нет роли IoT-MMS-User.
![image](https://habrastorage.org/files/da1/c0d/22a/da1c0d22a33c4d93a6f40ca9093de689.png)
Чтобы добавить роль, нужно зайти в настройки программы iotmms (через Applications -> Java Applications -> iotmms).
Там нужно зайти в раздел Security -> Roles. Далее — выбрать роль IoT-MMS-User и назначить ее пользователю через кнопку Assign.
Alexandr1bu
Спасибо! Моя ошибка, из статьи понял что надо вводить ID как в URL и вводил с trial на конце, а надо без него! Продолжаю, очень интересно