Конструкция выходного дня. Часть 3 - Файловая система

Черновая версия, возможны ошибки и опечатки))

01.

 

 

Lighhtpd

Файловую систему создадим используя  Buildroot. В этом случае она получается компактнее и может быть размещена в микросхеме NAND Flash модуля. В случае если это не является обязательным, можно собрать Debian и разместить его на SD карте. Для отображения информации и графиков нам понадобится web server. Мы будем использовать lighttpd входящий в состав пакетов Buildroot. Устанавливаем соответствующую галочку и собираем файловую систему. Для настройки lighttpd используется файл /etc/lighttpd/lighttpd.conf. Старые версии Buildroot его не генерируют, поэтому создадим вручную:

mkdir /etc/lighttpd 
vi /etc/lighhtpd/lighttpd.conf

Содержимое файла lighttpd.conf:

server.document-root = "/var/www/servers/www.imx287.org/pages/"
server.port = 80

mimetype.assign = (
 ".html" => "text/html",
 ".txt" => "text/plain",
 ".jpg" => "image/jpeg",
 ".png" => "image/png"
)

static-file.exclude-extensions = ( ".fcgi", ".php", ".rb", "~", ".inc" )
index-file.names = ( "index.html" )

Чтобы запустить web server выполняем:

lighttpd -D -f /etc/lighttpd/lighttpd.conf

Чтобы lighttpd запускался при старте системы, создадим сервис S51lighttpd

vi /etc/init.d/S51lighttpd

Содержимое файла S51lighttpd

#!/bin/sh
#
# Starts lighttpd.
#

start() {
echo  "Starting lighttpd: "
start-stop-daemon -S -q -p /var/run/lighttpd.pid --exec /usr/sbin/lighttpd -- -f /etc/lighttpd/lighttpd.conf
echo "OK"
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?

Параметр server.document-root в файле lighttpd.conf указывает путь, где должны лежать web страницы  (/var/www/servers/www.imx287.org/pages/). Пока там ничего нет, поэтому отображать нечего. Сначала создадим необходимые папки:

mkdir /var/www/servers
mkdir /var/www/servers/www.imx287.org
mkdir /var/www/servers/www.imx287.org/pages

Затем создадим простейшую web страницу:

cd /var/www/servers/www.imx287.org/pages
vi index.html

Содержимое страницы:

<html><body><h1>It works!</h1>

<p>This is the default web page for this server.</p>

<p>The web server software is running but no content has been added, yet.</p>

</body></html>

Проверим, перегружаем плату, в логе должно появиться сообщение о старте lighttpd. В браузере зайдем по IP адресу назначенному плате, должна отобразиться наша тестовая страница:

 

RRDtool

Для хранения данных и создания графиков будем использовать rrdtool. Данные из Википедии:

RRDtool — набор утилит для работы с RRD (Round-robin Databaseкольцевая база данных). Созданы Тоби Отикером (Tobias Oetiker) для хранения, обработки и визуализации динамических (изменяющихся во времени) последовательностей данных, таких как сетевой трафик, температура, загрузка процессора и так далее.[1] Все данные хранятся в кольцевой базе, размер которой остаётся неизменным. RRDtool включают в себя возможность графического отображения хранимой информации. Данный набор утилит распространяется под лицензией GNU GPL.

Пересобираем buildroot включив rrdtool. Для начала следует создать базу данных в которой будет храниться информация о температуре и влажности. Базу данных разместим там же где лежат страницы web сервера

rrdtool create /var/www/servers/www.imx287.org/pages/db.rrd --step=300 DS:temperature:GAUGE:600:U:U DS:humidity:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:30 RRA:AVERAGE:0.5:2:30 RRA:AVERAGE:0.5:10:144

Занесение данных в базу данных выполняется так:

rrdtool update /var/www/servers/www.imx287.org/pages/db.rrd `date +"%s"`:$TEMPERATURE:$HUMIDITY

Создание картинки с графиком температуры:

rrdtool graph $DEST_DIR/temp.png DEF:temperature=$DEST_DIR/db.rrd:temperature:AVERAGE LINE1:temperature#FF0000 --width 800

Соответственно картинка с графиком влажности:

rrdtool graph $DEST_DIR/humidity.png DEF:humidity=$DEST_DIR/db.rrd:humidity:AVERAGE LINE1:humidity#FF0000 --width 800

Оформим все это в виде скрипта sensor.sh, который будет считывать информацию с датчика, заносить в базу и строить графики:

vi /home/sensor.sh

Содержимое скрипта

#!/bin/sh
DEST_DIR=/var/www/servers/www.imx287.org/pages
mkdir -p $DEST_DIR

TEMP_FILE=/sys/class/hwmon/hwmon0/device/temp1_input
TEMPERATURE=-1
[ -f  $TEMP_FILE ] && TEMPERATURE=`expr \`cat $TEMP_FILE\` / 1000`

TEMP_FILE=/sys/class/hwmon/hwmon0/device/humidity1_input
HUMIDITY=-1
[ -f  $TEMP_FILE ] && HUMIDITY=`expr \`cat $TEMP_FILE\` / 1000`

echo $TEMPERATURE
echo $HUMIDITY

rrdtool update /var/www/servers/www.imx287.org/pages/db.rrd `date +"%s"`:$TEMPERATURE:$HUMIDITY
rrdtool graph $DEST_DIR/temp.png DEF:temperature=$DEST_DIR/db.rrd:temperature:AVERAGE LINE1:temperature#FF0000 --width 800
rrdtool graph $DEST_DIR/humidity.png  DEF:humidity=$DEST_DIR/db.rrd:humidity:AVERAGE LINE1:humidity#FF0000 --width 800

ESP:wq - выход из редактора vi
chmod +x /home/sensor.sh

В результате, в /var/www/servers/www.imx287.org/pages/ будет лежать две сгенерированные картинки temp.png и humidity.png которые можно отобразить на web странице. Модифицированный файл index.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>Temperature and Humidity</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<meta http-equiv="content-style-type" content="text/css">

<meta http-equiv="refresh" content="600">

</head>

<body>

<h2 align=center>Temperature Graph</h2>

<table align=center border=0 cellspacing=0 cellpadding=5>

<tr><td><img src="/temp.png"   alt="graph1"></td></tr>

</table>

<h2 align=center>Humidity Graph</h2>

<table align=center border=0 cellspacing=0 cellpadding=5>

<tr><td><img src="/humidity.png"  alt="graph2"></td></tr>

</table>

</body>

</html>

Для периодического запуска скрипта поместим его в cron:

mkdir /var/spool/cron/
mkdir /var/spool/cron/crontabs/
crontab -e
*/5 * * * * /home/sensor.sh

Скрипт будет запускаться каждые 5 минут и обновлять картинки с графиками.

Через некоторое время, после накопления результатов, графики примут нормальный вид: картинка обновленных графиков.