Создание веб-приложения для IoT. Урок 4.

В предыдущем уроке мы разработали интерфейс веб-приложения для интернета вещей (IoT).  Теперь Вы можете взаимодействовать с приложением, удалённо управлять устройствами, передающими данные на сервер, получать показания датчиков этих устройств. Но есть одно НО: к серверу ещё не подключено ни одно устройство. Именно взаимодействию передающего устройства с сервером и посвящён этот урок.

Напомним, что о том, как работает передающее устройство и как его собрать, мы рассказали в серии уроков «Мониторинг температуры через интернет с помощью GSM-модуля SIM900». Мы также подготовили набор-конструктор, содержащий компоненты и модули, необходимые для сборки устройства.

Если передающего устройства у Вас пока нет — это не значит, что Вы не сможете дальше работать над созданием веб-приложения. Имитировать работу устройства можно с помощью любого браузера. О том, как это сделать, читайте тут.

Взаимодействие устройства с сервером

Взаимодействие устройства с сервером построено на следующих принципах:

  • обмен данными всегда инициирует устройство, а не сервер. Такова клиент-серверная архитектура: сеанс обмена данными открывает клиент. Нам удобен этот вариант тем, что устройствам не нужны выделенные ip-адреса.
  • обмен данными происходит периодически. Устройство передаёт данные на сервер не только тогда, когда какие-то параметры изменились, а постоянно, с заданной периодичностью. Если показания датчиков не поменялось, устройство передаёт пустой запрос, служащий для контроля состояния связи. Наши устройства посылают запросы на сервер с такой частотой, с которой это возможно. Сразу за ответом сервера следует новый запрос. Конечно, это увеличивает размер трафика, зато если вдруг устройство перестанет выходить на связь(выйдет из строя, что-то случится с питанием и т.д.) мы сразу же узнаем об этом. Это важно на ответственных объектах, где потеря контроля над системой может привести к необратимым последствиям и реакция системы на команды пользователя должна быть достаточно быстрой (насколько позволяет мобильный интернет). Если для Вашей задачи быстродействие не критично, Вы можете уменьшить частоту запросов и сэкономить трафик.

 

3

 

Устройство посылает на сервер HTTP-запрос, в котором содержатся параметры системы. Например такой:

http://z925997t.beget.tech/device_status.php?ID=1&Term=176&Rele=0

Это GET-запрос, точнее его URL. Подробно об  этом, мы писали в этом уроке. Тут вкратце:

  • z925997t.beget.tech — сервер (точнее его доменное имя), которому адресован запрос
  • device_status.php — скрипт, который выполнится на сервере по этому запросу

После знака «?» идут передаваемые параметры:

  • ID=1 — это id устройства. В предыдущем уроке мы договорились, что у нас пока одно устройство. Но теоретически их может быть много и сервер будет отличать их по id.
  • Term=176 — температура 17,6 °С — показания датчика температуры умноженные на 10. Поскольку параметра в GET-запросе не могут быть дробными, а мы хотим передавать значение температуры с точностью до десятых, поэтому умножаем его на 10. Потом учтём это в приложении при выводе пользователю.
  • Rele=0 — состояние реле (о -выключено, 1 — включено)

В ответ на этот запрос сервер передаст нам строку:

«COMMAND 1 EOC»  или «COMMAND 0 EOC»

0 или 1 в этой строке — команда для реле (выключить или включить). Именно эта команда записывается в БД, когда пользователь нажимает в интерфейсе приложения кнопку «Включить реле» или «Выключить реле».

interfejs-veb-prilozheniya

Если температура и состояние реле не поменялось, устройство не будет передавать эти параметры, чтобы не плодить в БД сервера одинаковые значения и не увеличивать объём хранимых данных. В этом случае устройство отправит запрос только с одним параметром (id устройства):

http://z925997t.beget.tech/device_status.php?ID=1

Это будет означать: «Привет, сервер! У меня ничего не поменялось, но я всё ещё на связи, не волнуйся.»

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

Могли бы… но не можем, потому что у нас на сервере пока отсутствует скрипт «device_status.php», который должен обрабатывать запросы от устройства.

Давайте его создадим…

device_status.php

Заходим в каталог нашего веб-приложения и создаём новый файл «device_status.php».

1

Открываем этот файл и пишем в него код:

<?php
//Настройки подключения к БД
$db_host = ‘localhost’;
$db_user = ‘z925997t_db’; //имя пользователя совпадает с именем БД
$db_password = ‘password’; //пароль, указаный при создании БД
$database = ‘z925997t_db’; //имя БД, которое было указано при создании
mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($database) or die(«Cannot connect DB»);

if(isset($_GET[«ID»])){ //Если запрос от устройства содержит идентификатор
$query = «SELECT * FROM DEVICE_TABLE WHERE DEVICE_ID='».$_GET[‘ID’].»‘»;
$result = mysql_query($query);
if(mysql_num_rows($result) == 1){ //Если найдено устройство с таким ID в БД

if(isset($_GET[‘Rele’])) { //Если устройство передало новое состояние реле
//проверяем есть ли в БД предыдущее значение этого параметра
$query = «SELECT OUT_STATE FROM OUT_STATE_TABLE WHERE DEVICE_ID = ‘».$_GET[‘ID’].»‘»;
$result = mysql_query($query);
$date_today = date(«Y-m-d H:i:s»); //текущее время
if(mysql_num_rows($result) == 1){ //Если в таблице есть данные для этого устройства — обновляем
$query = «UPDATE OUT_STATE_TABLE SET OUT_STATE='».$_GET[‘Rele’].»‘, DATE_TIME=’$date_today’ WHERE DEVICE_ID = ‘».$_GET[‘ID’].»‘»;
$result = mysql_query($query);
} else { //Если данных для такого устройства нет — добавляем
$query = «INSERT OUT_STATE_TABLE SET DEVICE_ID='».$_GET[‘ID’].»‘, OUT_STATE='».$_GET[‘Rele’].»‘, DATE_TIME=’$date_today'»; //Записать данные
$result = mysql_query($query);
}
}

if(isset($_GET[‘Term’])) { //Если устройство передало новое значение температуры
//проверяем есть ли в БД предыдущее значение этого параметра
$query = «SELECT TEMPERATURE FROM TEMPERATURE_TABLE WHERE DEVICE_ID='».$_GET[‘ID’].»‘»;
$result = mysql_query($query);
$date_today = date(«Y-m-d H:i:s»); //текущее время
if(mysql_num_rows($result) == 1){ //Если в таблице есть данные для этого устройства — обновляем
$query = «UPDATE TEMPERATURE_TABLE SET TEMPERATURE='».$_GET[‘Term’].»‘, DATE_TIME=’$date_today’ WHERE DEVICE_ID = ‘».$_GET[‘ID’].»‘»;
$result = mysql_query($query);
} else { //Если данных для этого устройства нет — добавляем
$query = «INSERT TEMPERATURE_TABLE SET DEVICE_ID='».$_GET[‘ID’].»‘, TEMPERATURE='».$_GET[‘Term’].»‘, DATE_TIME=’$date_today'»; //Записать данные
$result = mysql_query($query);
}
}

//Достаём из БД текущую команду управления реле
$query = «SELECT COMMAND FROM COMMAND_TABLE WHERE DEVICE_ID = ‘».$_GET[‘ID’].»‘»;
$result = mysql_query($query);
if(mysql_num_rows($result) == 1){ //Если в таблице есть данные для этого устройства
$Arr = mysql_fetch_array($result);
$Command = $Arr[‘COMMAND’];
}

//Отвечаем на запрос текущей командой
if($Command != -1) //Есть данные для этого устройства
{
echo «COMMAND $Command EOC»;
}
else
{
echo «COMMAND ? EOC»;
}
}
}

?>

Скачать код скрипта

Сохраняем изменения.

Разбираемся с кодом скрипта

Наше устройство передаёт параметры, используя HTTP-запрос с методом GET. Поэтому все переданные значения оказываются в глобальном массиве $_GET[].

В начале скрипта производится подключение к БД.

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

Если получено новое значение температуры — обновляем его в БД или заносим туда, если там до этого не было данных о температуре от этого устройства.

То же самое проделываем, если получено новое состояние реле.

После этого скрипт ищет в БД текущее значение команды управления реле  и отправляет устройству в строке. Например:

COMMAND 1 EOC

Если команды в БД нет (пользователь ни разу не нажимал кнопки «Включить реле» или «Выключить реле», тогда скрипт ответит:

COMMAND ? EOC

Тестируем скрипт

Теперь можем протестировать взаимодействие устройства с сервером.

Открываем любой браузер и пишем запрос (не забудьте изменить доменное имя на своё) :

http://z925997t.beget.tech/device_status.php?ID=1&Term=176&Rele=0

Это имитация. Мы просто передали с помощью браузера такой же запрос, который на самом деле будет передавать устройство.

Теперь открываем страницу веб-приложения в браузере (или обновляем, если уже открыта)  и видим данные:

2

Можете понажимать на кнопки «включить» и «выключить» и убедиться что команда для реле меняется в ответ на новый запрос. Для этого снова введите в адресную строку «запрос от устройства».

Ну вот и всё! Теперь осталось научить Ваше устройство передавать такие запросы (наверное Вы уже сделали это).

Заключение

В этом уроке мы разобрались, как с сервером взаимодействует передающее устройство. В следующем мы научим наше приложение следить за состоянием связи с устройством и оповещать пользователя в случае её обрыва. Следите за выходом новых уроков на LAZY SMART.


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *