Эта статья может помочь участникам конкурса SAP Кодер 2017 решить одну из задач
Интернет вещей – захватывающая тема, которая уже завтра изменит мир. Существующие IoT-платформы позволяют протестировать технологию, чем мы и займемся.
Перед вами пошаговый пример создания и настройки системы сбора данных с устройств на базе Arduino и ее подключение к SAP Cloud Platform.

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.

Нажмите кнопку Try for Free, затем Try Now.

Нажмите кнопку «Регистрация» и введите свои регистрационные данные.

По указанному электронному адресу должно прийти письмо с подтверждением регистрации. Для завершения процесса необходимо активировать аккаунт нажатием на ссылку в письме.

Все готово к использованию платформы SAP Cloud Platform! Давайте зайдем в панель управления и создадим свое первое IoT-приложение. Нажмите Log On.
Шаг 2. Создаем базу данных и раздаем права

Вы попадаете в «пульт управления» ваших разработок на SAP.

Он позволяет увидеть все разработанные приложения, получить доступ к базе данных, запустить разработку или активировать сервисы.
В принципе, сервис IoT сможет автоматически создать необходимую структуру таблиц и инстанс базы данных. Но для того, чтобы понять, как он работает, и полностью управлять базой данных, мы создадим собственный инстанс HANA. Так называемый HANA MDC — Multitenant Database Containers.
Именно в этой системе будут храниться наши данные. Для этого мы идем на закладку Persistence -> Database&Schemas и нажимаем кнопку New.

После этого задаем любое название для инстанса HANA. Название должно быть написано маленькими латинскими буквами без использования специальных символов. В качестве Database System выбираем HANA MDC и задаем пароль для пользователя SYSTEM.

В облачной среде создается инстанс базы данных, с которой мы и будем работать. Обратите внимание, что на это у нас ушло всего лишь несколько минут. В этом заключается огромное преимущество облачных технологий. Обычно для того, чтобы установить на сервер базу данных и правильным образом ее настроить, администратору может потребоваться несколько дней. А здесь – одно нажатие и готово!
Когда инстанс будет готов, желтый значок CREATING сменится на зеленый CREATED, и мы сможем управлять структурой базы.

Воспользуемся web-инструментами управления структурой БД. В дальнейшем, в дополнение к встроенным средствам работы с базой данных, вы можете настроить среду Eclipse, как это рассказано в статье «Создание HANA-приложения с использованием среды разработки Eclipse».
Сначала нажимаем на строку SAP HANA Cockpit. Система выдаст предупреждение об отсутствии прав.

Нажмите ОК, и вам автоматически выдадут права на работу с Cockpit.

В данном инструменте вы можете посмотреть и настроить множество параметров по работе с вашим инстансом HANA.
Для работы с SAP HANA Web-based Development Workbench вам потребуется добавить системному пользователю некоторые права. Нажмите на плитку «Manage Role and Users».

Выберите пользователя SYSTEM и на вкладке Granted Roles нажмите «плюс». Конечно, для продуктивных систем вам необходимо будет создать нового пользователя и выдать ему требуемые права. Но сейчас мы делаем свое первое приложение и можем немного отступить от правил.

Права, необходимые для работы средства администрирования, описаны здесь.
Выдайте следующие права вашему пользователю:
Роль |
Описание |
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.

Откроется страница с набором сервисов.

Нажав, например, плитку Catalog, вы сможете посмотреть структуру базы: таблицы, view, пакеты.

С помощью данного инструмента мы сможем увидеть в дальнейшем, как данные с подключенных датчиков попадают в созданную IoT-сервисом специальную таблицу.
Шаг 3. Активируем и настраиваем сервис SAP Cloud Platform for IoT
Теперь наша только что созданная БД готова к приему данных. Перейдем на закладку Services и, прокрутив список услуг, которыми вы можете пользоваться, найдем сервис Internet of Things.

Как видите, он пока не работает. Давайте его активируем. Нажав на сервис, мы попадем в панель настройки, где должны нажать кнопку Enable для его запуска.

Через некоторое время вы увидите зеленую надпись Enabled. Это означает, что сервис готов к работе. Именно этот сервис займется сбором данных с датчиков и сохранением их в БД. Он позволит автоматизировать большую часть работы и сделать это максимально быстро и удобно для разработчика.
Давайте настроим сервис на прием данных с датчиков. Перейдя на закладку управления сервисом IoT, нажмите ссылку Go to Service.

Перед вами появится панель управления подключением внешних устройств и датчиков.

Как вы видите, цифра 0 во всех разделах говорит нам о том, что никакие устройства к сервису пока не подключены. Что означают разделы?
Device Types – типы устройств. Это общее описание класса устройств. Например, «Метеостанция» или «Устройство управления линией покраски».
Message Type – типы сообщений или данные, которые может отдавать или принимать устройство. Например «Данные о погоде». При этом тип «Данные о погоде» может передавать температуру, влажность, уровень осадков, атмосферное давление и так далее.
Devices – конкретное устройство с определенным номером, которое мы будет подключать. Например «Метеостанция №1 ВДНХ», «Метеостанция №2 Воробьевы Горы».
Deploy Message – Кнопка запуска, при ее нажатии произойдет автоматическая настройка сервиса и активация работы.
Send and view messages – раздел, с помощью которого можно протестировать работу сервиса IoT. Мы сэмулируем работу датчиков (даже если у нас их нет), передадим сообщение в нужном формате и посмотрим уже переданные данные в табличном виде.
Давайте настроим наше устройство. Выбираем раздел Message Type и в нижнем левом углу появившейся формы нажимаем «плюс».

Создадим тип сообщений TempLightHumidity для типа устройства Arduino c двусторонним направлением передачи данных Bidirectional. Удаляем поле timestamp, которое отображается по умолчанию, и создаем четыре собственных поля:
Temperature тип Integer
Light тип Integer
Humidity тип Integer

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

Заключительный шаг – создание экземпляра устройства в разделе Devices

Заполним название устройства – ArduinoForTraining и укажем данные, которые он будет передавать – Arduino.
После сохранения устройства система выдаст важную информацию – Token, который позднее потребуется для того, чтобы устройство смогло авторизоваться в системе SAP Cloud Platform. Запишите его.

Если вы забыли записать token, позднее можно будет сгенерировать новый, нажав на кнопку Generate Token.
Кроме Token нам потребуются еще два параметра: ID Message Type и ID экземпляра устройства. Первый параметр можно найти на закладке «Информация» в типе сообщений.

Второй параметр – на странице экземпляра устройства.

В моем случае получились следующие параметры:
ID Message Type = 3531068190e9d68c4a0a
ID экземпляра устройства = 8a61bdd3-c50b-4585-a3f4-dba7f05af22e
Token = e0b0dc97cc4913311a17cfcdb3f9321e
Теперь все настройки сделаны.

Можно запустить активацию настроек сервиса, перейдя в пункт Deploy Message.
Введите свои данные и пароль к системе SAP Cloud Platform и нажмите кнопку Deploy.

Если все настроено правильно, вы получите сообщение об успешной активации.

Вернемся в пульт управления SAP Cloud Platform и перейдем в раздел Java Application. Там вы увидите новое приложение iotmms.

Это специальное приложение, которое автоматически создается системой для сбора данных с датчиков по настройкам, которые вы только что задали. Пока статус у приложения «желтый» — требуется немного времени на его запуск. Через 1-2 минуты приложение полностью стартует, о чем просигнализирует зеленым цветом в столбце State.

Вы можете войти в приложение и посмотреть, как им можно управлять: останавливать, задавать права доступа, проверять его работу и тестировать производительность. Большинство настроек в нашем примере не потребуется. Выполним лишь одну – привяжем сервис к нашей базе данных. По умолчанию приложение записывает все данные в собственную схему БД.
Перейдем в раздел Configuration > Data Source Binding в левой инструментальной панели. Удалим привязку к данным, созданную по умолчанию, нажав кнопку Delete.

Нажмем кнопку New Binding. Система сама предложит привязать сервис к нашей БД. Вам требуется лишь ввести данные для подключения: login – SYSTEM (или название своего пользователя, если вы сделали его ранее) и пароль. Далее сохраняем введенные параметры, нажав кнопку Save.

Схема, созданная по умолчанию, заменена на нашу собственную.

Еще одной важной настройкой является выдача прав доступа к IoT-приложению. Нам необходимо разрешить нашему пользователю работать с созданной программой iotmms. Перейдем на закладку Security > Roles.

Видно, что уже существует роль, которая позволяет работать с данной программой – IoT-MMS_User. Ее необходимо добавить нашему пользователю. Нажмите кнопку Assign в левой нижней таблице и введите User ID.

Имя пользователя вы можете найти в разделе Account в настройке SAP Cloud Platform или в адресной строке браузера.

Для того, чтобы все наши настройки вступили в силу и заработала привязка к новой базе данных, вам необходимо перезапустить сервис iotmms. Для этого зайдите в настройки iotmms и нажмите «Stop», а после – «Start». Новые настройки вступят в силу, и данные будут записываться в нашу базу данных.

Возвращаемся в раздел Services. Здесь необходимо выбрать сервис Internet of Things и запустить настройку go to Service. Будем проверять его работу.

Шаг 4. Тестируем сервис IoT и передачу тестового сообщения в SAP Cloud Platform
Переходим в раздел Send Message.

Здесь мы можем посмотреть переданные с устройства сообщения или протестировать передачу.

Зайдем в раздел Display stored message.

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

Но таблицы с нашими данными о температуре, влажности, уровне света пока нет. Она будет создана автоматически, как только первые данные будут переданы с датчика в платформу SAP Cloud Platform.
Попробуем передать первое сообщение с устройства. Пока мы будем тестировать работу сервиса без физического подключения микроконтроллера. Сообщение передадим в виде HTTP запроса, который сформируем в панели управления. Но для начала вспомним сохраненные ранее параметры:
ID Message Type = 3531068190e9d68c4a0a
ID экземпляра устройства = 8a61bdd3-c50b-4585-a3f4-dba7f05af22e
Token = e0b0dc97cc4913311a17cfcdb3f9321e
Идем в раздел Send and receive massage through HTTP.

Здесь есть специальный инструмент для эмуляции передачи сообщений с датчиков.

Он представляет из себя обыкновенный Rest API клиент для формирования HTTP-запроса к удаленной службе. Вы также можете воспользоваться любым другим удобным для вас инструментом. Вариант с Google Chrome расширением я покажу позднее.
Добавляем правильные идентификаторы наших устройств и чуть изменяем формат передаваемого сообщения, согласно нашей настройке.

В разделе 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. По коду вы сможете понять, что случилось.

Теперь вернитесь в раздел Send and view message и выберите Display Stored Messages.

Здесь вы увидите еще две таблицы, которые были созданы автоматически, как только мы передали данные в систему.

Посмотрите содержимое таблицы и убедитесь, что это именно те данные, которые вы передавали для теста.

Попробуйте поменять тестовые данные для температуры или уровня освещенности и передать данные еще раз. В своем примере мы несколько раз меняли параметр уровня освещенности.

Зайдя в таблицу, мы видим, что IoT-сервис готов принимать данные с датчиков.

Все ваши записи были сохранены автоматически. А выбрав значок показа данных в графическом виде и свой тип данных + экземпляр, вы увидите их в виде графика.

Шаг 5. Тестируем IoT-сервис с помощью расширения Advanced Rest Client в браузере Google Chrome
А теперь давайте протестируем наш сервис с учетом всех требований безопасности. Для этого нам потребуется браузер Google Chrome. Установите браузер. Запустите. В строке поиска введите advanced rest client.

Это специальное расширение браузера Google Chrome, которое предназначено для разработчиков. Оно помогает тестировать HTTP-запросы без необходимости разработки собственных программ.
Установите приложение (первая ссылка в результатах поиска), нажав кнопку Add to Chrome.


И запустите, нажав ARC в списке сервисов.

Вам необходимо сконструировать вызов метода 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) на те, что мы записывали ранее. В итоге должна получиться следующая картина:

Нажав Send, вы увидите ответ от сервера и сможете посмотреть переданную запись.

Попробуйте провести эксперимент. Уберите строчку
Authorization: Bearer 58536ee037cf158db4992d5538b8d5b0
Сервер не пропускает такой запрос, отвечает ошибкой авторизации 401. Тем самым мы страхуемся от подключения несанкционированных устройств.

Это лишь один из примеров, как работает система безопасности SAP Cloud Platform. В промышленных программах к безопасности относятся еще более серьезно и применяют различные методы (не только авторизация с помощью token) для защиты программ и промышленных систем.
Альтернатива: настраиваем работу IoT-сервиса по протоколу MQTT
Если вы внимательно изучили приложение для тестирования IoT-сервиса, то могли заметить еще один вариант работы с данными – через протокол MQTT.

MQTT (Message Queuing Telemetry Transport) – это простой открытый протокол, разработанный специально для IoT и применяемый для обмена данными между устройствами. MQTT-сеть включает в себя MQTT-брокера, который служит посредником во взаимодействии MQTT-агентов – издателей и подписчиков. Издатели публикуют информацию, предназначенную для подписчиков.

Брокер, издатель и подписчик в 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 брокером.

Выберите пункт Configure the Message Management Service.
В разделе Data введите настройки вашего MQTT брокера:
tcp://test.mosca.io:1883

Если ваш MQTT-брокер использует для авторизации имя и пароль, эти данные также требуется ввести в настройки сервиса. В нашем случае для пользователя и пароля введите: test\test
После сохранения данных перейдите в раздел Messaging through MQTT over TCP.


В раздел Device ID введите свои данные: 8a61bdd3-c50b-4585-a3f4-dba7f05af22e
В поле Message:
{«mode»:«sync»,«messageType»:"3531068190e9d68c4a0a",«messages»:[{«Temperature»:25,«Light»:23, «Humidity» :65}]}
И нажмите кнопку «Connect» для подключения к брокеру.

Попробуйте передать сообщение, нажав Send на форме.

Проконтролируйте, что ваше сообщение было передано в таблицу IoT через MQTT-брокер.

Вы можете попробовать передать сообщение в платформу SAP Cloud Platform через сторонний MQTT-клиент. Например, через MQTT FX.
Установите программу и настройте подключение к своему MQTT брокеру.

Нажмите Connect и на закладке Subscribe подпишитесь на топик, который вы видели в настройке IoT-сервиса:
iot/data/iotmmsp1942514293trial/v1/8a61bdd3-c50b-4585-a3f4-dba7f05af22e


На закладке Publish вы можете передавать сообщения с соответствующим топиком через брокер в настроенный сервис IoT.

Попробуйте передать несколько значений и убедиться, что прием данных проходит успешно.
Шаг 6. Готовим «железо» на Arduino
В данном разделе мы подключим к платформе настоящий контроллер и датчики. В качестве управляющего устройства выступит микроконтроллер Arduino Yun. Arduino является очень удобной платформой быстрой разработки электронных устройств для новичков и профессионалов.

Arduino Yun удобен тем, что помимо основного микроконтроллера Atmel ATmega32U4 имеет дополнительный процессор Atheros AR9331, работающий под управлением Linux с беспроводным стеком OpenWrt. Для нашего проекта это подходящее устройство, так как несет «на борту» Linux и позволяет подключаться через HTTPS протокол к удаленным сервисам, в том числе и к SAP Cloud Platform.
Перед началом работы нам необходимо поставить среду разработки программ для Arduino, сделать первоначальную настройку микроконтроллера и подключить его к сети (проводной или WiFi).
В качестве датчиков и средств управления для нашего Arduino будем использовать:
1) Кнопку.

2) Цифровой датчик температуры и влажности.

3) Датчик освещенности.

4) Светодиод.

Вместо указанных датчиков вы можете использовать любые другие, внеся соответствующие изменения в управляющую программу.
Каждый датчик имеет три контакта – 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 — земля, черный)


Шаг 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 среде.

Внесите IP-адрес в утилиту в поле Host Name or IP

Внесите IP-адрес в утилиту в поле Host Name or IP
Тип подключения SSH. Нажмите Open.
В терминальном режиме наберите имя пользователя root.

И пароль, который вы задавали в настройках соединения с Arduino.
Система подключена и готова выполнять команды.

Адаптируйте команду 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.

Если все параметры указаны верно и настройки 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.
Скачайте и подключите библиотеку.

Запустив скетч и вызвав монитор, вы увидите, как, нажимая на кнопку, вы передаете данные по температуре, влажности, освещенности в SAP Cloud Platform.

Работу программы вы сможете увидеть, вызвав данные для просмотра непосредственно в таблицах 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.

Чтобы добавить роль, нужно зайти в настройки программы iotmms (через Applications -> Java Applications -> iotmms).
Там нужно зайти в раздел Security -> Roles. Далее — выбрать роль IoT-MMS-User и назначить ее пользователю через кнопку Assign.
Alexandr1bu
Спасибо! Моя ошибка, из статьи понял что надо вводить ID как в URL и вводил с trial на конце, а надо без него! Продолжаю, очень интересно