Описанное ниже — это конструкция выходного дня. От идеи до реализации была затрачена пара вечеров. В описании представлен необходимый минимум для реализации системы сбора информации, с доступом к последней в режиме Online.
Уже в процессе написания данной заметки, появилась статья: Зимовка кактусов с онлайн контролем температуры. В начале испугался, что опередили, однако, хоть решаемая задача в обоих случаях и близка, реализация кардинально отличается.
Архитектура получившейся системы представлена на диаграмме:
Как можно видеть, клиентская часть полностью реализована в микроконтроллере. Система легко масштабируется и настраивается под любые нужды.
Устройство
В качестве основы клиента взята плата Keil MCB2300, долго лежавшая без дела. Плата построена на микроконтроллере LPC2368, он довольно старый (в настоящий момент вместо него разумнее использовать LPC1768), однако напичкан всем необходимым. На плате присутствует Ethernet-интерфейс, который и является в данном случае «окном в мир». В качестве источника данных взят давно знакомый мне BMP085, подключаемый по интерфейсу I2C.
Софт для тестирования сервера и проверки работы HTTP-запросов писался в рамках Win32-приложения:
В дальнейшем эта же логика перешла внутрь микроконтроллера. В настоящий момент запрос адресуется конкретному IP-адресу, но лучше использовать DNS-клиент, т.к. теоретически хостинг-оператор может переносить сайт внутри своего пространства адресов. Так же можно добавить NTP-клиент, чтобы отправлять серверу данные сразу с меткой времени.
Данный проект — первая моя проба работы с TCP/IP протоколом на микроконтроллере. В основу взят пример EasyWeb, который предлагается для многих плат с Ethernet в качестве стартового. Основной цикл программы получился кривым, однако, причесывать его не хочется, т.к. необходимый функционал уже реализован, зато хочется попробовать перенести это приложение на стек uIP, потому что по внутренней структуре он мне нравится больше.
Главный цикл работы программы:
- Читаем данные с датчика.
- Открываем соединение.
- Отправляет HTTP GET-запрос к серверу.
- Если прошло 10 секунд, а протокол общения с сервером не прошел, разрываем соединение по таймауту.
- Ждем 1-5 минут. Это ожидание задает интервал сохранения данных.
А вот и внешний вид всего устройства:
Сервер
Серверная часть развернулась на обычном
- add.php — скрипт добавления данных в лог-файл. Получает параметр file с именем файла на запись и параметр data с данным на запись. Первым столбцом скрипт добавляет метку времени. Так же есть функция clear, позволяющая очистить лог-файл.
- get.php — отображение данных из лог-файла. Получает единственный параметр file с именем файла.
Все данные на сервер передаются в рамках GET-запросов:
GET http://server/add.php?file=temp&data=23.4;99809 HTTP/1.0rnrn
А вот содержимое CSV файла:
1418069433;23.4;99809 1418069443;23.4;99811 1418069453;23.4;99818 1418069464;23.4;99801
Каждая строчка содержит метку времени, температуру и давление в Паскалях.
Графический вывод
Чтобы все выглядело красиво, на сервере можно организовать и иные формы отображения данных. В качестве библиотеки диаграмм/графиков попробовал использовать Hightcharts. С ним можно сделать вот такое оформление:
Это не живой график, это скриншот его вида. В живом виде график можно посмотреть по ссылкам: Температура и Давление.
Файлы
Ссылки
- Генерация HTTP запросов — Антон Калмыков (Antonio)
- DNS Query Code in C with winsock
- RFC958 — Описание NTP-протокола
- RFC826 — Описание ARP-протокола
- Библиотека Highcharts для построения диаграмм
Автор: nehyrb