Здравствуйте Хабражители! В предыдущей статье я рассказывал немного про железную часть проекта охранной системы и про систему на Python, которая работает с этим железом. В этой статье я продолжаю рассказ про серверную часть.

image

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

Комментарии (4)


  1. Akuma
    14.09.2017 15:47

    Не думали испльзовать веб-сокеты или просто держать tcp соединение?
    Оборвалось — ждем переподключения. Если его нет — бьем тревогу.
    Плюсом будет моментальное «общение» сервера и RPi.

    Поидее, с учетом отсутствия HTTP заголовков, трафика будет даже меньше.


    1. iBlacksus Автор
      14.09.2017 16:01

      Честно говоря пошел путем наименьшего сопротивления, использовал стек технологий, с которыми уже имел большой опыт. С веб-сокеты в частности не работал, но идея интересная


      1. FirsofMaxim
        14.09.2017 16:33

        Посмотрите презентацию по разработке службы такси (с 30го слайда актуальное) www.slideshare.net/profyclub_ru/gps-maddevs


  1. mike_y_k
    15.09.2017 01:24

    Вариант TCP соединения самый малозатратный. А ping с нужным интервалом формально все решает, плюс анализ времени ответа для размышлений об обстановке с сигналом в месте установки.