Запись нажатия кнопки raspberry pi в базу mysql

Мультипереключатель мы уже подсоединяли к raspberry pi 2, сделали так, чтобы он включал светодиод, а теперь разберёмся как заносить данные о нажатии кнопки в базу mysql. Статья про мультипереключатель и светодиод здесь, а про установку web сервера тут. Инструкция далее довольно объёмная и будет строиться на базе двух публикаций, указанных выше. Для не терпеливых увидеть результат можно на изображении в конце статьи.
Во время установки web сервера, мы устанавливали в том числе и mysql. Будем думать, что он уже стоит и следующим шагом подключаемся к mysql. Для этого в консоле raspbian выполняем:
sudo mysql -u root -p
Enter password: вводим пароль, который мы указали при установке mysql. Для примера возьмём пароль «raspberry0» без ковычек.
и попадаем в:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 47 Server version: 5.5.43-0+deb7u1 (Debian)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql>
Это MySQL monitor, где мы можем управлять базами данных.

Сначала создаём пустую базу led_db:
mysql> CREATE DATABASE led_db CHARACTER SET utf8 COLLATE utf8_unicode_ci;
«mysql>» писать не надо, я просто таким образом указываю, что работаем мы в MySQL monitor, а не в bash.
При создании базы мы сразу указали кодировку для неё и представление.
Не забываем в конце ставить символ точки с запятой ; иначе mysql решит, что ввод команды мы ещё не завершили.

Создаём пользователя с именем pi и паролем raspberry0(такой пароль мы решили использовать выше в статье), который будет иметь полные права на базу led_db :
mysql> GRANT ALL PRIVILEGES ON led_db.* TO pi@localhost IDENTIFIED BY 'raspberry0';
mysql> GRANT ALL PRIVILEGES ON led_db.* TO 'pi'@'%' IDENTIFIED BY 'raspberry0';
mysql> FLUSH PRIVILEGES;

Вторая строка нужна для того, чтобы пользователь мог подключаться к базе данных с помощью клиента, расположенного на любом другом ПК, не только на локальном.
Так же для возможности удалённого подключения должна быть закомментирована строка «bind-address = 127.0.0.1» в файле /etc/mysql/my.cnf. Если она не закомментирована, то сделаем это после чего перезапустим mysql командой sudo service mysql restart

Чтобы и root мог удалённо подключаться с паролем raspberry0, надо выполнить:
mysql> GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'raspberry0';
mysql> FLUSH PRIVILEGES;
mysql> exit;

Итак у нас есть mysql база led_db и пользователь pi с паролем raspberry0 . Теперь надо создать таблицы в базе.
Подключаемся теперь уже под пользователем pi:
sudo mysql -u pi -p
Enter password: вводим пароль пользователя pi, пароль raspberry0

Смотрим какие у нас базы:
mysql> SHOW DATABASES;

Увидим:
+———————+
| Database |
+———————+
| information_schema |
| led_db |
+———————+
2 rows in set (0.00 sec)

НО баз на самом деле больше, мы видим только те, которые доступны пользователю pi. Нас интересует только база led_db , поэтому сделаем базу led_db текущей:
mysql> USE led_db;
Database changed

Таблиц в базе пока нет:
mysql> SHOW TABLES;
Empty set (0.00 sec)

Создаём таблицу под названием multiperekluchatel (можете придумывать имена базы и таблиц самостоятельно):
mysql> CREATE TABLE multiperekluchatel (pcname VARCHAR(30), datetime DATETIME, other VARCHAR(50));
Query OK, 0 rows affected (0.03 sec)

Так мы создали таблицу multiperekluchatel со следующими полями:

  • pcname (длинна 30) — туда будем заносить имя ПК, на котором сработала кнопка, к которому подключена эта кнопка
  • datetime (значение будет датой) — туда вносим время нажатия кнопки
  • other — (длина 50 символов) — туда вносим пояснения, что это была за кнопка, за что она отвечает, любую полезную информацию.

DATETIME — тип данных (дата+время вплоть до секунд) в столбце datetime

Смотрим теперь таблицы:
mysql> SHOW TABLES;
увидим:
+———————+
| Tables_in_led_db |
+———————+
| multiperekluchatel |
+———————+
1 row in set (0.00 sec)

Можно посмотреть и наши стрлбцы в таблице multiperekluchatel:
mysql> DESCRIBE multiperekluchatel;
+———-+————-+——+——+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———-+————-+——+——+———+——-+
| pcname | varchar(30) | YES | | NULL | |
| datetime | datetime | YES | | NULL | |
| other | varchar(50) | YES | | NULL | |
+———-+————-+——+——+———+——-+
3 rows in set (0.00 sec)

Заходим в phpmyadmin http://адрес-raspberry-pi/phpmyadmin/ (его мы тоже ставили при установке web сервера) в базу led_db и увидим надпись «Индекс не определен!»
Надо добавить ещё один столбец, который будет у нас индексом. Чтобы добавить в таблицу multiperekluchatel столбец последовательности id, который и будет у нас автоматически генерировать уникальное число для всех новых строк, надо выполнить:
mysql> ALTER TABLE multiperekluchatel ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id);
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
FIRST — значит, что мы ставим этот столбец первее уже имеющихся.
Если надо создать столбец после какого то столбца, например после поля pcname, то вместо FIRST надо писать AFTER pcname.

Теперь мы увидим другую картину:
mysql> DESCRIBE multiperekluchatel;
+———-+————-+——+——+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+———-+————-+——+——+———+—————-+
| id | int(11) | NO | PRI | NULL | auto_increment |
| pcname | varchar(30) | YES | | NULL | |
| datetime | datetime | YES | | NULL | |
| other | varchar(50) | YES | | NULL | |
+———-+————-+——+——+———+—————-+
4 rows in set (0.00 sec)

Табличка у нас готова, но как теперь вносить в неё данные?
Для добавления одиночных данных есть INSERT, для загрузки из файла — LOAD DATA. Нам нужен первый вариант, так как данные будут загружаться построчно при каждом нажатии кнопки. Добавляем данные в таблицу:
mysql> SET NAMES utf8 COLLATE utf8_unicode_ci;
mysql> INSERT INTO multiperekluchatel VALUES ('','raspi001', NOW(),'tuk-tuk');
Query OK, 1 row affected, 1 warning (0.01 sec)

Примечание.
Чтобы посмотреть данные в таблице, надо выбрать базу, посмотреть какие в ней есть таблицы и прочитать таблицу:
mysql> USE led_db;
mysql> SHOW TABLES;
mysql> select * from multiperekluchatel;

+—-+———-+———————+———+
| id | pcname | datetime | other |
+—-+———-+———————+———+
| 1 | raspi001 | 2015-07-09 14:48:00 | tuk-tuk |
+—-+———-+———————+———+
1 row in set (0.00 sec)
здесь:
led_db — имя базы
multiperekluchatel — имя таблицы

Вместо tuk-tuk можно писать русские буквы, это стало возможным когда мы указывали кодировку при создании базы, поэтому русские символы так же будут отображаться корректно:
mysql> SET NAMES utf8 COLLATE utf8_unicode_ci;
mysql> INSERT INTO multiperekluchatel VALUES ('','raspi001', NOW(),'русские буквы');
mysql> select * from multiperekluchatel;

+—-+———-+———————+—————————+
| id | pcname | datetime | other |
+—-+———-+———————+—————————+
| 1 | raspi001 | 2015-07-09 15:54:20 | русские буквы |
+—-+———-+———————+—————————+
1 row in set (0.00 sec)
Если бы кодировку мы не указали, то получили бы знаки вопросов ??? вместо русских букв.

Итак у нас есть:
0) пользователь pi
1) база led_db
2) таблица multiperekluchatel
3) мы можем заносить в таблицу данные

Теперь обьединим это с нашим мультипереключателем. Тут 2-а варианта, выбираем какой нравится больше.

1) Вынести выполнение процедуры добавления
данных в базу mysql в отдельный bash файл:

a) Создадим файл /script/gpio/mysql-add.sh с таким содержимым:

#! /bin/bash

mysql -D led_db -u pi -praspberry0  << EOF

USE led_db;
SET NAMES utf8 COLLATE utf8_unicode_ci;
INSERT INTO multiperekluchatel VALUES ('','raspi001', NOW(),'сработал мультипереключатель');

EOF

b) Это наш bash скрипт, который выполняет действия записи в базу. Между << EOF и EOF находится выполняемый в mysql код. Делаем файл исполняемым :
sudo chmod +x /script/gpio/mysql-add.sh

c) Теперь в файл /script/gpio/led.sh, отвечающий за моргание светодиода, дописываем перед строкой echo «0» > /sys/class/gpio/gpio2/value
нашу строку:
sudo /script/gpio/mysql-add.sh
запускающую bash скрипт, который в свою очередь добавляет информацию в базу:

d) Не забываем, что автозапуск /script/gpio/led.sh мы прописывали в файле /etc/rc.local перед строкой exit 0 добавляли:
sudo /script/gpio/led.sh &

2) Не использовать дополнительный bash скрипт

a) Уместить одну длинную строку сразу в файл /script/gpio/led.sh (без промежуточного), которая будет подключаться к базе и вносить данные. Строка будет выглядеть так:

mysql -D led_db -u pi -praspberry0 -e "SET NAMES utf8 COLLATE utf8_unicode_ci; INSERT INTO multiperekluchatel VALUES ('','raspi001', NOW(),'сработал мультипереключатель');

здесь:
led_db — имя БД
pi — имя пользователя БД с правами на запись
-praspberry0 — пароль пользователя pi. Пробела между -p и самим паролем быть НЕ должно!
-e — далее идут команды mysql
SET NAMES utf8 COLLATE utf8_unicode_ci — исправляем кодировку
multiperekluchatel — имя таблицы в базе led_db
‘ ‘ — порядковый номер, он же идентификатор
raspi001 — имя ПК к которому подключен мультипереключатель
NOW() — отвечает за дату + время
сработал мультипереключатель — просто пояснение.

b) Не забываем, что автозапуск /script/gpio/led.sh мы прописывали в файле /etc/rc.local перед строкой exit 0:
sudo /script/gpio/led.sh &

Далее если надо вносить данные на удалённый сервер, то в строку выше добавляем:
-h 10.36.1.7
где 10.36.1.7 -это адрес удалённого сервера с mysql

Далее, если скрипт уже был запущен, можно либо остановить выполнение led.sh:
sudo ps ax | grep led.sh
видим:
2996 ? S 0:00 sudo /script/gpio/led.sh
3000 ? S 4:27 /bin/bash /script/gpio/led.sh
27190 pts/0 S+ 0:00 grep --color=auto led.sh

останавливаем и запускаем его снова:
sudo killall -9 led.sh
sudo ps ax | grep led.sh
27483 pts/0 S+ 0:00 grep --color=auto led.sh

sudo /script/gpio/led.sh &

Либо просто перезагрузить raspberry pi 2 командой:
sudo reboot

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

Посмотреть, что команда выполнилась успешно и данные внесены можно так(выполняем в консоле, а не в mysql):
mysql -D led_db -u pi -praspberry0 -e "select * from multiperekluchatel";
после «-p» пробел не надо

Теперь нам надо вывести данные из таблицы в более удобную для просмотра форму, конечно же на веб-страничку.
В корне веб сайта /var/www/ создаём файл index.php(файл index.html нужно удалить) и вписываем туда:

<html>
<head>
<title>срабатывание мультипереключателя</title>
<metahttp-equiv="Refresh"content="<?=$delay?>"/>
</head>
<body>
<?php
header("Content-Type: text/html; charset=utf-8");
header('Refresh: 5; url=' .$_SERVER['PHP_SELF']);
?>

<?php
    // определяем начальные данные
    $db_host = 'localhost';
    $db_name = 'led_db';
    $db_username = 'pi';
    $db_password = 'raspberry0';
    $db_table_to_show = 'multiperekluchatel';

    // соединяемся с сервером базы данных
    $connect_to_db = mysql_connect($db_host, $db_username, $db_password)
    or die("Could not connect: " . mysql_error());

    // подключаемся к базе данных
    mysql_select_db($db_name, $connect_to_db)
    or die("Could not select DB: " . mysql_error());

	// исправляем проблему кодировки
	mysql_query('SET NAMES utf8');

    // выбираем все значения из таблицы multiperekluchatel
    $qr_result = mysql_query("select * from " . $db_table_to_show)
    or die(mysql_error());

    // выводим на страницу сайта заголовки HTML-таблицы
    echo '<tableborder="1">';
  echo '<thead>';
  echo '<tr>';
  echo '<th>id</th>';
  echo '<th>pcname</th>';
  echo '<th>datetime</th>';
  echo '<th>other</th>';
  echo '</tr>';
  echo '</thead>';
  echo '<tbody>';

   // выводим в HTML-таблицу данные из MySQL таблицы
  while($data = mysql_fetch_array($qr_result)){
    echo '<tr>';
    echo '<td>' . $data['id'] . '</td>';
    echo '<td>' . $data['pcname'] . '</td>';
    echo '<td>' . $data['datetime'] . '</td>';
    echo '<td>' . $data['other'] . '</td>';
    echo '</tr>';
  }

    echo '</tbody>';
  echo '</table>';

    // закрываем соединение с сервером  базы данных
    mysql_close($connect_to_db);
?>

</body>
</html>

Можно открывать в браузере http://10.36.1.17/ (адрес веб-сервера raspberry) и видеть данные из БД mysql.
Страничка будет каждые 5 секунд обновляться, так что если есть новые данные, они появятся на стриничке сами. И всё бы хорошо, но вот если срабатываний было 500 или несколько тысяч, отображать всё на экране не удобно, поэтому решил сократить вывод до 21 строк, то есть последние 21 срабатываний мультипереключателя. Для этого подправим /var/www/index.php.
Там достаточно только исправить строку:
$qr_result = mysql_query("select * from " . $db_table_to_show)
на строчку:
$qr_result = mysql_query('select * from multiperekluchatel ORDER BY datetime DESC LIMIT 21')
Теперь будет выводиться только 21 последняя строка.

Если хотите чтобы была полоса прокрутки (таблица будет меньше места занимать на странице), то в корне сайта должно быть 2-а файла. index.php с таким содержимым:

<html>
<head>
<title>срабатывание мультипереключателя</title>
<metahttp-equiv="Refresh"content="<?=$delay?>"/>
<linkrel="stylesheet"type="text/css"href="style.css">
</head>
<body>
<?php
header("Content-Type: text/html; charset=utf-8");
header('Refresh: 5; url=' .$_SERVER['PHP_SELF']);
?>

<divid="div1">
<?php
    // определяем начальные данные
    $db_host = 'localhost';
    $db_name = 'led_db';
    $db_username = 'pi';
    $db_password = 'raspberry0';
    $db_table_to_show = 'multiperekluchatel';

    // соединяемся с сервером базы данных
    $connect_to_db = mysql_connect($db_host, $db_username, $db_password)
    or die("Could not connect: " . mysql_error());

    // подключаемся к базе данных
    mysql_select_db($db_name, $connect_to_db)
    or die("Could not select DB: " . mysql_error());

	// исправляем проблему кодировки
	mysql_query('SET NAMES utf8 COLLATE utf8_unicode_ci');

       // выбираем все значения из таблицы
	$qr_result = mysql_query('select * from  multiperekluchatel ORDER BY datetime DESC LIMIT 21')
	or die(mysql_error());

  // выводим заголовки HTML-таблицы
  echo '<tableborder="1">';
  echo '<thead>';
  echo '<tr>';
  echo '<th> id </th>';
  echo '<th> имя ПК </th>';
  echo '<th> дата </th>';
  echo '<th> Примечание </th>';
  echo '</tr>';
  echo '</thead>';
  echo '<tbody>';

   // выводим в HTML-таблицу данные из MySQL-таблицы
  while($data = mysql_fetch_array($qr_result)){
    echo '<tr>';
    echo '<td>' . $data['id'] . '</td>';
    echo '<td>' . $data['pcname'] . '</td>';
    echo '<td>' . $data['datetime'] . '</td>';
    echo '<td>' . $data['other'] . '</td>';
    echo '</tr>';
  }

    echo '</tbody>';
  echo '</table>';
    // закрываем соединение с сервером  базы данных
    mysql_close($connect_to_db);
?>
</div>

</body>
</html>

и /var/www/style.css с таким содержимым:

#div1{
        height:200px;
        width:470px;
        border:1px solid black;
        overflow-y:auto;
        padding-right:5px;
}

Теперь на сайте будет страница с таблицей, да ещё и с полосой прокрутки.

команды, freebsd, убунту, настройка, установка, сервер, server, ubuntu, сервер

Данные из базы mysql о нажатии мультипереключателя на raspberry pi 2

Добавить комментарий