Технологии интеграции Devices в Internet на основе встроенной платформы


WoT-приложения

Технологии интеграции Smart Devices на встроенной платформе в Internet на основе WoT-приложений, которые помещены на HTTP-серверы

Автор: Владимир Ткаченко

Источник: Обучение в интернет

Данная статья посвящена методике создания WoT-приложений для "умных" устройств, которые могут на основе шаблона интеграции Direct Connectivity напрямую подключаться к Internet. Шаблон интеграции Direct Connectivity предназначен для интеграции Smart Devices or Objects в Internet на основе встроенной или собственной платформы. Реализация WoT-приложения на основе собственной платформы может быть осуществлена на основе веб-сервера, помещенного на контроллере встроенного в Things или на контроллере, к портам GPIO которого подключены Things.

WoT-приложения для Smart Devices, помещенные на веб-серверы, могут быть снабжены как пользовательскими интерфейсами для взаимодействия пользователей с Things через веб-браузеры, так и интерфейсами прикладного программирования Web Thing REST API или Web Thing WebSocket API для обмена данными с другими устройствами. В качестве контроллера применим одноплатный компьютер «Raspberry Pi 3 Model B» на основе ОС Debian Linux version 4.19.59-v7. В «Raspberry Pi 3 Model B» встроена поддержка Wi-Fi, Bluetoth 4.1 и обеспечен доступ к портам GPIO (интерфейсу ввода/вывода) для прямого подключения к устройствам (например, к датчикам температуры, перемещения и т.д.).

В качестве хранилища для хранения данных и программ применим карту памяти MicroSD kingston 16 GB (Class 10). Следует отметить, что карту micro SD необходимо отформатировать как FAT32. Официальной операционной системой для всех моделей Raspberry Pi является Raspbian (дистрибутив Debian Linux).

Установка ОС на Raspberry Pi 3

Выполним установку Raspbian с помощью установщика NOOBS операционной системы для Raspberry Pi 3, который содержит Raspbian. Для этого надо загрузить с сайта архивный файл NOOBS на ПК. Затем разархивировать содержимое архива NOOBS в отдельную директорию на ПК и скопировать содержимое в корневую директорию карты MicroSD, подключенной через кардридер к ПК. После этого надо извлечь MicroSD из кардридера и вставить ее в разъем на панели "Raspberry Pi 3 Model B". После подключения к одноплатному компьютеру Raspberry Pi монитора, манипулятора "мышь", клавиатуры и блока питания должна загрузиться NOOBS.

Из появившейся заставки со списком надо выбрать "Raspbian" и нажать "Install". Компьютер Raspberry Pi загружается с графическим интерфейсом пользователя, но его можно отключить и настроить компьютер так, чтобы он загружался с терминалом "LXTerminal" (c интерфейсом командной строки). Кроме того, на Raspberry Pi с графическим интерфейсом пользователя можно открыть LXTerminal из панели задач, щелкнув на пиктограмме LXTerminal.

Компьютер на базе контроллера Raspberry Pi 3 Model B
Рисунок 1. Компьютер на базе контроллера Raspberry Pi 3 Model B

Установка Node.js на компьютер Raspberry Pi.

Для реализации веб-сервера и WoT-приложений для Smart Devices применим программную платформу Node.js (v10.16.0) для работы с JavaScript и модуль Express.js (4.17.1) — фреймворк для Node.js. Node.js подходит для реализации различных серверов (Web, CoAP, WebSocket, MQTT и т.д.) и для построения масштабируемых Web приложений.

Прежде чем устанавливать платформу Node.js на контроллер, необходимо определить версию архитектуры ядра процессора на Raspberry Pi. Для проверки версии архитектуры процессора можно использовать команды: uname -m или cat /proc/cpuinfo, которые необходимо ввести в LXTerminal. Результатом проверки версии модели процессора на "Raspberry Pi 3 Model B" является: ARMv7 Processor rev 4 (v7l). На сайте (nodejs.org/en/download/) для версии "ARMv7" рекомендована версия платформы node-v10.16.0.

Node.js можно установить из репозиториев nodesource.com или nodejs.org, содержащих последние версии Node.js. Для установленной на "Raspberry Pi 3 Model B" операционной системы Debian Linux version 4.19.59 можно загрузить данные из командной строки для версии ARMv7:
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
установить Node.js:
sudo apt-get install -y nodejs
и проверить версию:
node –v
v10.16.0.

Следует отметить, что для скачивания файлов можно использовать консольную утилиту wget, например, из репозитория NodeSource:
wget -qO- https://deb.nodesource.com/setup_10.x | sudo -E bash -
или из репозитория nodejs.org:
wget https://nodejs.org/dist/v10.16.0/node-v10.16.0-linux-armv7l.tar.gz с последующим разархивированием и установкой в файловую систему.

Создание WoT-приложения

Создадим WoT-приложение (Web Thing) с интерфейсом пользователя и программным интерфейсом Web Thing REST API для доступа и управления как с браузера, так и со сторонних WoT-приложений. Создаваемое WoT-приложение предназначено для Smart Objects, т.е. для приводов или датчиков (actuators or sensors). В качестве actuator применим светодиод (имитирующий привод), а в качестве sensors используем датчики движения (PIR), температуры и влажности (DH22).

Следует отметить, что доступ к ресурсам WoT-приложений можно осуществлять через протоколы: HTTP, CoAP, WebSocket, REST/HTTP, MQTT. Протокол HTTP может быть использован для доступа через интерфейс пользователя с помощью браузеров к WoT-приложениям, помещенным на HTTP-серверах. Протоколы CoAP, WebSocket, REST/HTTP могут быть использованы для доступа через API одних WoT-приложений к другим WoT-приложениям, помещенным на серверах CoAP, WebSocket, HTTP соответственно.

Для отладки доступа к WoT-приложениям по протоколам CoAP и WebSocket можно использовать браузер Firefox с плагином Copper (Copper (Cu) CoAP Firefox plugin) и с расширением Fenjin Wang соответственно. Доступ по протоколу MQTT к WoT-приложениям с установленными на них MQTT-клиентами осуществляется через серверы-брокеры (например, mqtt.org) с помощью клиентских приложений (MQTT-клиентов), установленных на ПК или смартфонах.

Разработку начнем с создания WoT-приложения для привода (светодиода) с интерфейсом пользователя, помещенного на HTTP-сервере. Для этого с помощью файлового менеджера в директории "pi" создадим директорию wot-led и каркас WoT-приложения в составе двух директорий: public, в которой будут находиться все статические файлы; views, в которой будут храниться шаблоны, и двух файлов: package.json - для хранения всей информации о приложении; server.js - для различных серверов и серверного WoT-приложения.

С помощью терминала pi@raspberrypi: ~$ перейдем из корневой директории "pi" в созданную директорию wot-led:
cd wot-led.

Далее в директории pi@raspberrypi: ~/wot-led $ выполним команду для формирования файла package.json:
npm init
Данная команда запустит опросник командной строки, который завершится созданием или изменением файла package.json, для этого можно заполнять предложенные варианты или не заполнять, а нажимать Enter.

Затем установим фреймворк express, выполнив команду:
npm install express –save
В результате будет установлена библиотека express (в нашем случае версия v.4.17.1), название которой сохранится в файле package.json, а содержимое библиотеки будет установлено в созданную директорию node_modules в папке wot-led.

Затем установим библиотеку для работы с GPIO на Raspberry Pi, библиотеку PATH для указания каталогов исполняемых программ и шаблонизатор, который будет передавать данные в шаблон. Выбираем шаблон с расширением .ejs, в этом шаблоне можно выводить html код сайта Smart Devices с внедренными скриптами, стилями и изображениями.

  • npm install rpi-gpio –save
  • npm install path –save
  • npm install ejs –save
Структура WoT-приложения
Рисунок 2. Структура WoT-приложения

К портам GPIO подключим actuator, в качестве которого применим светодиод LED, а также sensors движения (PIR), температуры и влажности (DH22). Выводной светодиод (5мм, цвет красный, номинальный ток: 20 мА) длиной ножкой подключаем к порту GPIO 4 (контакту 7) и короткой ножкой светодиода через ограничительный резистор (330 Ом) к порту GND. Следует отметить, что для красных светодиодов допустимая величина напряжения может быть в пределах от 1,8 до 2,4В. Напряжение между контактами или пинами GPIO (ввод/вывод) и GND составляет 3,3В.

Инфракрасный датчик движения PIR имеет три вывода, которые подключены к цифровому входу/выходу GPIO18 (pin 12), pin2 (+5В) и заземлению (GND). Датчик температуры и влажности (DH22) имеет четыре контакта, которые подключены следующим образом: четвертый контакт DH22 к контакту GND Pi; третий контакт - не подключен; второй контакт DH22 к GPIO12 (pin 32) Pi; первый контакт DH22 к 3,3В Pi; между первым и вторым контактами DH22 - резистор 4,7KОм. Следует отметить, что WoT-приложения для датчиков PIR и DH22 в данной статье не рассматриваются.

Raspberry Pi 3 Model B и датчики
Рисунок 3. «Raspberry Pi 3 Model B» и датчики

Cоздание серверной части WoT-приложения server.js с применением фреймворка express

Разработку файла серверного WoT-приложения server.js или приложения express начнем с загрузки фреймворка express с помощью функции require(). Это WoT-приложение помещено на HTTP-сервер, завернутый в структуру библиотеки express. Далее создаем объект приложения express с именем app. Для управления светодиодом (режимом чтение/запись) загружаем библиотеку "rpi-gpio" и библиотеку path для указания абсолютного пути к каталогу для предоставления файлов.

Далее настраиваем контакт 7 на режим записи DIR_OUT. Затем определяем тип шаблонизатора с расширением .ejs. Вызываем функцию промежуточной обработки (промежуточное ПО или middleware) express.static для маршрута по умолчанию. Определяем обработчики для маршрутов на GET и POST HTPP-запросы. Запускаем HTTP-сервер, а для WoT-приложения назначаем порт: 8585. Все, серверное WoT-приложение server.js готово к работе. Код серверного WoT-приложения server.js имеет вид:

// Директива use strict.
'use strict';
// Подключаем веб-фреймворк express.
const express = require('express'); 
// Создаем объект приложения.
const app = express();
// Подключаем библиотеку управления светодиодом.
const gpio = require('rpi-gpio');
// Подключаем библиотеку path.
const path = require('path');
// Настраиваем контакт 7  на режим записи DIR_OUT (пин 7, соответствующий GPIO4).
gpio.setup(7, gpio.DIR_OUT);
// Определяем механизм визуализации: шаблонизатор с расширением .ejs. 
app.set('view engine', 'ejs');
// Вызываем функцию промежуточной обработки express.static для маршрута по умолчанию.
app.use(express.static(path.join(__dirname, 'public')));
// На метод GET  HTTP-запроса к приложению  определяем обработчик для маршрута "/".
app.get('/', function(req, res){ 
// Определяем ответ серверной части для клиентской части приложения Node.js  методом res.render().
            res.render('index',{position:'Press button LED-On!'});
});
// На метод POST-запроса к приложению по маршруту led-on, WoT-приложение отвечает: включить светодиод. 
app.post('/led-on', function(req, res){
gpio.write(7, true, function(err) {
        if (err) throw err;
		console.log('pin 7: true');
            return res.render('index', {position: 'On'});
    });
});
// На метод POST-запроса к приложению по маршруту led-off, WoT-приложение отвечает: выключить светодиод. 
app.post('/led-off', function(req, res){
gpio.write(7, false, function(err) {
        if (err) throw err;
		console.log('pin 7: false');
            return res.render('index',{position: 'Off'});
    });
});
// Старт HTTP-сервера!
app.listen(8585, function () {
  console.log('WoT-приложение прослушивает порт: 8585')
})				

Создание клиентской части WoT-приложения

Создаем клиентскую часть WoT-приложения или файл графического интерфейса пользователя index.ejs на основе языка разметки html5, языка таблицы стилей CSS3, css-фреймворка для Bootstrap Buttons. Bootstrap предоставляет разные стили кнопок, которые применены в приложении. Для применения Bootstrap Buttons необходимо прописать между тегами <head></head> в веб-странице index.ejs подключение необходимых файлов из cdn-хранилища Bootstrap.

Кроме того, для кнопки LED-On применим class="btn btn-danger", а для кнопки LED-Off применим class="btn btn-primary". Файл index.ejs поместим в директорию views, а файлы style.css и less.png поместим в директорию public. Код графического интерфейса пользователя index.ejs имеет вид:

<!DOCTYPE html>
 <html lang="en">
 <head>
   <meta charset="utf-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <title>LED application </title>
   <link rel="stylesheet" href="public/style.css">
   <!-- Bootstrap CSS -->
   <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
  integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
 </head>
 <body>
 <h1>Smart Devices в Internet </h1>
 <div id="wrapper">
	 <div id="content">
	 <div class="center">
	 <img src="public/less.png" alt="LED" width="120" height="120"> <br>
	 <form action="/led-on" method="post">
	 <button type="submit" class="btn btn-danger">LED-On </button>
	 <button type="submit" formaction="/led-off" class="btn btn-primary">LED-Off </button>
	 </form>
	 <p>Position:  <%=position%> </p>
	 </div>
 </div>
 </div>
 </body>
 </html>	

Файл style.css

Код файла имеет вид:

@charset "utf-8"; 
body{font-size:100%; font-family:Arial, Helvetica, Sans-serif, Verdana;}
h1{font-size:120%; line-height:1.2em; font-weight:bold; color:#662b2b; text-align:center}
.center{display:block; margin:0 auto; position:relative; text-align:center}
/* ID селектор */
#wrapper {
width: 400px;
margin: 0 auto;
height: 100%;
position: relative;
}
#content{
background-color:#EDDFAD;
margin:0px; 
height: 100%;
}				

Терминал или командная строка

Чтобы протестировать сервер необходимо запустить WoT-приложение через терминал. Для этого необходимо перейти в директорию wot-led, где находится WoT-приложение и запустить server.js, выполнив команду: node server.js. В этом случае в терминале появится запись "WoT-приложение прослушивает порт: 8585". Скриншот терминала представлен на рисунке 4.

Скриншот терминала c WoT-приложением
Рисунок 4. Скриншот терминала c WoT-приложением

Графический интерфейс пользователя или веб-страница index.html

После запуска приложения через терминал можно получить доступ к ресурсам в браузере по адресам: localhost:8585; raspberrypi:8585 или по IP адресу 192.168.1.129:8585, который назначен wireless router LinksysWRT160N моей локальной сети. Доступ к светодиоду по IP адресу может быть выполнен как с браузера ОС Raspbian на мониторе, подключенном к Raspberry pi 3, так и с браузеров настольного ПК, ноутбука, смартфона и т.д.

Скриншоты графического интерфейса пользователя или веб-страницы index.html, представлены на рис. 5, 6, которые содержат кнопки для включения и выключения светодиода LED-On/LED-Off, а также строку состояние (Position) светодиодов, в которой могут отображаться записи: "Press button LED-On!", On или Off. При запуске в терминале server.js в браузере отображается "Press button LED-On!", при этом светодиод выключен. При нажатии в браузере кнопки LED-On включается светодиод и отображается значение "On", а в командной строке появится запись "pin 7: true". При нажатии в браузере кнопки LED-Off выключается светодиод и отображается значение "Off", а в командной строке появится запись "pin 7: false" и т.д.

Графический интерфейс пользователя: led-on-off Графический интерфейс пользователя: led-on
Рисунки 5, 6. Скриншоты графического интерфейса пользователя

Следует отметить, что в данной статье рассмотрены технологии интеграции Smart Devices на встроенной платформе (т.е. актуатора, в качестве которого применен светодиод LED, снабженный микроконтроллером "Raspberry Pi 3 Model B" с устройством связи) в Internet на основе WoT-приложения (созданного на JavaScript в среде Node.js), которое помещено на HTTP-сервер. Созданное WoT-приложение имеет графический интерфейс и программный интерфейс Web Thing REST API, доступ к которым возможен по протоколу HTTP с браузера и REST/HTTP с другого WoT-приложения соответственно.

Продолжение следует.