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

Статья размещена на Habrababr-е: http://habrahabr.ru/post/245411/. Теперь можно поместить ее и на сайт.

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

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

Вся архитектура получившейся системы представлена на диаграмме:

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

Устройство

В качестве основы клиента взята плата Keil MCB2300, долго лежавшая без дела. Плата построена на микроконтроллере LPC2368, он довольно старый (в настоящий момент вместо него разумнее использовать LPC1768), однако, напичканный всем необходимым. Так же на плате присутствует Ethernet-интерфейс. В качестве источника данных взят давно знакомый мне BMP085, подключаемый по интерфейсу I2C.

Софт для тестирования сервера и проверки работы HTTP-запросов писался в рамках Win32-приложения:

В дальнейшем эта же логика переносилась внутрь микроконтроллера. В настоящий момент запрос адресуется конкретному IP-адресу, в дальнейшем требуется добавить DNS-клиент, т.к. теоретически хостинг-оператор может переносить сайт внутри своего пространства адресов. Так же можно добавить NTP-клиент, чтобы отправлять серверу данные сразу с меткой времени.

Данный проект - первая проба работы с TCP/IP протоколом на микроконтроллере. В основу взят пример EasyWeb, который предлагается для многих плат с Ethernet в качестве стартового. Основной цикл программы получился кривым, однако, причесывать его не хочется, т.к. необходимый функционал уже реализован, зато хочется попробовать перенести это приложение на стек uIP, потому что по внутренней структуре он мне нравится больше.

Главный цикл работы программы:

  1. Читаем данные с датчика.
  2. Открываем соединение.
  3. Отправляет HTTP GET-запрос к серверу.
  4. Если прошло 10 секунд, а протокол общения с сервером не прошел, разрываем соединение по таймауту.
  5. Ждем 1-5 минут. Это ожидание задает интервал сохранения данных.

А вот и внешний вид всего устройства:

С 2015.03.15 произошла смена аппаратной платформы. Она с одной стороны упрощена, с другой сделана более гибкой. В основе новой аппаратной платформы контроллер LPC1343, а для связи с интернетом используется модуль WiFi ESP8266.

Сервер

Серверная часть развернулась на обычном хостинге. Главное требование к нему: поддержка PHP. Данные сохраняются в виде CSV-файлов. Скрипты максимально простые, функционал разделен на 2 файла:

Все данные на сервер передаются в рамках 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

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

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

Чтобы все выглядело красиво, на сервере можно организовать и иные формы отображения данных. В качестве библиотеки диаграмм/графиков попробовал использовать Hightcharts. С ним можно сделать вот такое оформление:

Вариант с обоими графиками на одной странице: Температура/Давление.

Файлы

Ссылки

Original: http://igorkov.org/http,
Author: igorkov