Data visualization
9 December 2014

Как сделать Online-логгирование с нуля

Описанное ниже — это конструкция выходного дня. От идеи до реализации была затрачена пара вечеров. В описании представлен необходимый минимум для реализации системы сбора информации, с доступом к последней в режиме Online.
image

Уже в процессе написания данной заметки, появилась статья: Зимовка кактусов с онлайн контролем температуры. В начале испугался, что опередили, однако, хоть решаемая задача в обоих случаях и близка, реализация кардинально отличается.
Архитектура получившейся системы представлена на диаграмме:
image
Как можно видеть, клиентская часть полностью реализована в микроконтроллере. Система легко масштабируется и настраивается под любые нужды.

Устройство


В качестве основы клиента взята плата Keil MCB2300, долго лежавшая без дела. Плата построена на микроконтроллере LPC2368, он довольно старый (в настоящий момент вместо него разумнее использовать LPC1768), однако напичкан всем необходимым. На плате присутствует Ethernet-интерфейс, который и является в данном случае «окном в мир». В качестве источника данных взят давно знакомый мне BMP085, подключаемый по интерфейсу I2C.
image
Софт для тестирования сервера и проверки работы HTTP-запросов писался в рамках Win32-приложения:
image
В дальнейшем эта же логика перешла внутрь микроконтроллера. В настоящий момент запрос адресуется конкретному IP-адресу, но лучше использовать DNS-клиент, т.к. теоретически хостинг-оператор может переносить сайт внутри своего пространства адресов. Так же можно добавить NTP-клиент, чтобы отправлять серверу данные сразу с меткой времени.
Данный проект — первая моя проба работы с TCP/IP протоколом на микроконтроллере. В основу взят пример EasyWeb, который предлагается для многих плат с Ethernet в качестве стартового. Основной цикл программы получился кривым, однако, причесывать его не хочется, т.к. необходимый функционал уже реализован, зато хочется попробовать перенести это приложение на стек uIP, потому что по внутренней структуре он мне нравится больше.
Главный цикл работы программы:
  1. Читаем данные с датчика.
  2. Открываем соединение.
  3. Отправляет HTTP GET-запрос к серверу.
  4. Если прошло 10 секунд, а протокол общения с сервером не прошел, разрываем соединение по таймауту.
  5. Ждем 1-5 минут. Это ожидание задает интервал сохранения данных.
А вот и внешний вид всего устройства:


Сервер


Серверная часть развернулась на обычном хостинге. Главное требование к нему: поддержка PHP. Данные сохраняются в виде CSV-файлов. Скрипты максимально простые, функционал разделен на 2 файла:
  • add.php — скрипт добавления данных в лог-файл. Получает параметр file с именем файла на запись и параметр data с данным на запись. Первым столбцом скрипт добавляет метку времени. Так же есть функция clear, позволяющая очистить лог-файл.
  • get.php — отображение данных из лог-файла. Получает единственный параметр file с именем файла.

Все данные на сервер передаются в рамках GET-запросов:
GET http://server/add.php?file=temp&data=23.4;99809 HTTP/1.0\r\n\r\n

А вот содержимое CSV файла:
1418069433;23.4;99809
1418069443;23.4;99811
1418069453;23.4;99818
1418069464;23.4;99801

Каждая строчка содержит метку времени, температуру и давление в Паскалях.

Графический вывод


Чтобы все выглядело красиво, на сервере можно организовать и иные формы отображения данных. В качестве библиотеки диаграмм/графиков попробовал использовать Highcharts. С ним можно сделать вот такое оформление:
image
Это не живой график, это скриншот его вида. В живом виде график можно посмотреть по ссылкам: Температура и Давление.
UPD: Совместил оба графика на одной странице: Температура/Давление.

Файлы


Ссылки


+9
15.3k 155
Comments 36