Здравствуйте читатели! В предыдущей статье я рассказывал немного про железную часть проекта охранной системы и про систему на Python, которая работает с этим железом. В этой статье я продолжаю рассказ про серверную часть.
Охранная система будет располагаться за пределами действия wi-fi, и у нее будет только мобильный интернет с небольшой скоростью, поэтому я решил, что обмен данными нужно сделать как можно менее затратным. В данном случае самое простое решение, это использование цифровых кодов. Т.е. мы отправляем на сервер 1 и он понимает, что сработал датчик движение, 2 — датчик дыма и т.д., для каждого события свой код. В свою очередь сервер расшифровывает коды и отправляет то, что считает нужным, в виде push-уведомления в iOS приложение, уже в виде текста. При этом каждое событие записывается как в лог на стороне RPi, так и в лог сервера, этот лог так же можно посмотреть в приложении. Кстати, вся работа с сервером в Python осуществляется с помощью Requests.
Сервер написан на PHP, так же там присутствует MySQL, в ней хранится лог и текущие настройки, т.е. всего две таблицы, вот одна из них:
Все запросы принимаются с помощью обычного POST, и отдаются в JSON. Выглядит это примерно так:
print json_encode(getRequest($_POST));
Для работы серверу нужно не так много методов:
- Получать сообщение от RPi
- Отдавать лог
- Устанавливать настройки
- Отдавать настройки
Теперь по поводу настроек, я долго думал как мне реализовать управление охранной системой из приложения, и пришел к выводу, что мне вполне подойдет способ, когда настройки хранятся на сервере, и охранная система с периодичностью в минуту их обновляет. Т.е. если я хочу выключить сигнализацию, в самом плохом случае она выключится через минуту. При этом она оповестит меня о том, что выключилась, поэтому неприятного сюрприза не будет.
Так же сервер следит за тем, чтобы RPi каждую минуту сообщал, что он в сети и с ним ничего не случилось. Если этого не происходит в течение 5 минут, то сервер начинает бить тревогу. Сделана эта проверка с помощью cron'а
*/5 * * * * php /aliceserver/checkAlice.php
Он каждые 5 минут запускает простенький скриптик проверки
include_once $dir . 'defines.php';
include_once $dir . 'db.php';
$db = new DataBase;
$db->connect();
$query = "SELECT alice, UNIX_TIMESTAMP(online) online FROM " . SQLTableStatus;
$result = $db->query($query);
$alice_is_on = $result[0]['alice'];
$online = (time() - $result[0]['online'] < 5*60);
if ($alice_is_on and !$online) {
include_once $dir . 'send_push.php';
$text = "Alice offline!";
$query = "INSERT INTO `" . SQLTableLog . "` (text, sender) VALUES ('$text', 1)";
$db->query($query);
send_push_message($text, AppToken, 'alice_offline.caf', $dir);
}
$db->disconnect();
Отправка push-уведомлей реализована с помощью ApnsPHP. Те из вас, кто хоть раз сталкивался с отправкой push-уведомлений на сервера Apple, наверняка знакомы с этим замечательным open-sourse решением. Для тех, кто не знает что это, могу только сказать, что на текущий момент это одна из лучших оберток, которая позволяет легко отправлять уведомления, при этом для ее настройки нужно минимум времени и усилий.
На этом рассказ про серверную часть подходит к концу, в следующий раз я расскажу как делалось iOS приложение. Всем спасибо за внимание, по возможности отвечу на все вопросы по железу и софту в комментариях.
Автор: iBlacksus