Создание веб-приложения для IoT. Урок 4.
В предыдущем уроке мы разработали интерфейс веб-приложения для интернета вещей (IoT). Теперь Вы можете взаимодействовать с приложением, удалённо управлять устройствами, передающими данные на сервер, получать показания датчиков этих устройств. Но есть одно НО: к серверу ещё не подключено ни одно устройство. Именно взаимодействию передающего устройства с сервером и посвящён этот урок.
Напомним, что о том, как работает передающее устройство и как его собрать, мы рассказали в серии уроков «Мониторинг температуры через интернет с помощью GSM-модуля SIM900». Мы также подготовили набор-конструктор, содержащий компоненты и модули, необходимые для сборки устройства.
Если передающего устройства у Вас пока нет — это не значит, что Вы не сможете дальше работать над созданием веб-приложения. Имитировать работу устройства можно с помощью любого браузера. О том, как это сделать, читайте тут.
Взаимодействие устройства с сервером
Взаимодействие устройства с сервером построено на следующих принципах:
- обмен данными всегда инициирует устройство, а не сервер. Такова клиент-серверная архитектура: сеанс обмена данными открывает клиент. Нам удобен этот вариант тем, что устройствам не нужны выделенные ip-адреса.
- обмен данными происходит периодически. Устройство передаёт данные на сервер не только тогда, когда какие-то параметры изменились, а постоянно, с заданной периодичностью. Если показания датчиков не поменялось, устройство передаёт пустой запрос, служащий для контроля состояния связи. Наши устройства посылают запросы на сервер с такой частотой, с которой это возможно. Сразу за ответом сервера следует новый запрос. Конечно, это увеличивает размер трафика, зато если вдруг устройство перестанет выходить на связь(выйдет из строя, что-то случится с питанием и т.д.) мы сразу же узнаем об этом. Это важно на ответственных объектах, где потеря контроля над системой может привести к необратимым последствиям и реакция системы на команды пользователя должна быть достаточно быстрой (насколько позволяет мобильный интернет). Если для Вашей задачи быстродействие не критично, Вы можете уменьшить частоту запросов и сэкономить трафик.
Устройство посылает на сервер 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 в этой строке — команда для реле (выключить или включить). Именно эта команда записывается в БД, когда пользователь нажимает в интерфейсе приложения кнопку «Включить реле» или «Выключить реле».
Если температура и состояние реле не поменялось, устройство не будет передавать эти параметры, чтобы не плодить в БД сервера одинаковые значения и не увеличивать объём хранимых данных. В этом случае устройство отправит запрос только с одним параметром (id устройства):
http://z925997t.beget.tech/device_status.php?ID=1
Это будет означать: «Привет, сервер! У меня ничего не поменялось, но я всё ещё на связи, не волнуйся.»
Таким образом, передавая запросы на сервер с помощью электронного устройства или какой-нибудь компьютерной программы, мы могли бы сообщать серверу данные датчиков и получать от него команды, а так же видеть эти параметры через интерфейс веб-приложения.
Могли бы… но не можем, потому что у нас на сервере пока отсутствует скрипт «device_status.php», который должен обрабатывать запросы от устройства.
Давайте его создадим…
device_status.php
Заходим в каталог нашего веб-приложения и создаём новый файл «device_status.php».
Открываем этот файл и пишем в него код:
<?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
Это имитация. Мы просто передали с помощью браузера такой же запрос, который на самом деле будет передавать устройство.
Теперь открываем страницу веб-приложения в браузере (или обновляем, если уже открыта) и видим данные:
Можете понажимать на кнопки «включить» и «выключить» и убедиться что команда для реле меняется в ответ на новый запрос. Для этого снова введите в адресную строку «запрос от устройства».
Ну вот и всё! Теперь осталось научить Ваше устройство передавать такие запросы (наверное Вы уже сделали это).
Заключение
В этом уроке мы разобрались, как с сервером взаимодействует передающее устройство. В следующем мы научим наше приложение следить за состоянием связи с устройством и оповещать пользователя в случае её обрыва. Следите за выходом новых уроков на LAZY SMART.




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