Web-клиент на Arduino. Часть 2 (PHP)

В первой части рассмотрен вариант построения web-клиента на платформе Arduino. В итоге, устройство формирует GET запрос к сайту с параметрами, в которых передается текущее состояние системы. В этой части рассмотрим php-файлы, обрабатывающие этот запрос и обеспечивающие взаимодействие с «клиентом-человеком» (а заодно уж и ведение некоей базы данных о состоянии системы в различные периоды времени).

Итак: наше устройство формирует GET запросы к указанному в тексте скетча сайту, странице avr.php. В запросе передаются три переменные с значениями состояния выводов 7 (ниже обозначено X) и 9 (Y) arduino и температуры с датчика (Z):

«GET /avr.php?in1=X&out1=Y&temp1=Z»

Файл avr.php представляет собой небольшую программку:

<?php
 	$TheFile = "data.txt";  //имя файла с базой данных
	$WhoWrite = "dev";      //запись инициируется устройством
	$Date = date("Y-m-d H:i:s");   
//считываем дату и время с сервера
 	$Open = fopen ($TheFile, "r"); //открываем файл для чтения
 	if ($Open) {
 		$Data = file ($TheFile);   //читаем данные из файла
		if (count($Data) > 0) {
 		  for ($n = 0; $n < count($Data); $n++) {
 			$GetLine = explode("\t", $Data[$n]);
 		  }
 		  fclose ($Open);
                  //находим последнюю запись "от пользователя"
		  $IsFind = FALSE;
 		  for ($n = 0; $n < count($Data); $n++) {
			$m = count($Data) - $n - 1;
 			$GetLine = explode("\t", $Data[$m]);
 			if ($GetLine[1] == "hum")
			{ $IsFind = TRUE;
			break;  }
 		  }
		  if ($IsFind) { 
//отсылаем данные о состоянии выхода (out), установенного на сайте
		print ("$Date\t$GetLine[0]\tout1=$GetLine[3]<BR>\n");  //передаем состояние вых линии
		    }  
                  else
		    {print ("$Date\tData from human is not in $TheFile!<BR>\n"); }
	        } 
                else {print ("$Date\tNo data in $TheFile!<BR>\n");} 
// данных в файле нет
	}
 	else {
 		print ("$Date\Unable to read from $TheFile!<BR>\n");
 	}
	//проверим наличие требуемых параметров  in1, out1, temp1  в запросе GET
        if (isset($_GET["in1"]) & isset($_GET["out1"]) & isset($_GET["temp1"]))  {
            //если праметры есть, то
            $in1 = $_GET["in1"];
            $out1 = $_GET["out1"];
            $temp1 = $_GET["temp1"];
            //проверим не совпадают  ли новые данные с прежними, полученными от устройства
            $IsWrite = TRUE;   //изначально считаем: надо писать!
	    if (count($Data) > 0) {     //если файл пуст - пишем
		$IsFind = FALSE;
 		for ($n = 0; $n < count($Data); $n++) { 
//ищем предыдущую запись от устройства
			$m = count($Data) - $n - 1;
 			$GetLine = explode("\t", $Data[$m]);
 			if ($GetLine[1] = "dev")
			{$IsFind = TRUE;    //нашли!
			break;	}
 		}
		if ($IsFind) {  //сверим старые и новые данные
		  $temp_new = round($temp1);       
//температура округленная новая
		  $temp_old = round($GetLine[4]);  
//температура округленная старая
         if (($GetLine[2] == $in1) & ($GetLine[3] == $out1) & ($temp_new == $temp_old)) {
                      $IsWrite = FALSE;
		  }
		}
            }
            if ($IsWrite)  {
                //открываем файл для записи в него
 	        $Open = fopen ($TheFile, "a");
                //добавляем новую запись (если получится)
 	        if ($Open) { 		  fwrite ($Open, "$Date\t$WhoWrite\t$in1\t$out1\t$temp1\n");
 		  fclose ($Open);   //ОК - запись прошла
		  print ("$Date\tOK. Data write to $TheFile!<BR>\n");  }
 	        else { //ошибка - не открылся файл на запись
		  print ("$Date\tUnable to write to $TheFile!<BR>\n"); }
            }	
            else  {
     print ("$Date\tData is equal. Not to write to $TheFile!<BR>\n");}
            }		
            else   {//если нет параметров - отсылаем прошлые данные
                print ("$Date\tData in GET is not found!<BR>\n");
            }  //ошибка - данные в запросе не найдены

?>

По тексту масса комментариев, так что — разобраться можно. Вкратце, при работе скрипта происходит следующее:
— открывается файл базы данных «data.txt», в котором сохраняются все поступающие с клиента данные;
— в файле находим последнюю запись, которая сделана с сайта (т.е. не по запросу с ардуино): признак такой записи — «hum» во второй колонке («GetLine[1]»);
— данные о состоянии вывода pin 9 (колонка 4 — «GetLine[3]») отсылаются в ответе на запрос в переменной out1;
— если в запросе были приняты данные, они сверяются с последней записью из базы данных и, при отличии от них, записываются в базу.

Файл form.php — также небольшая программка. Он предназначен для просмотра данных из базы и записи изменений в нее. Скрипт отрабатывает следующие функции:
— отображение последних десяти записей из базы данных;
— запись в базу данных строки с состоянием pin 9 (колонка 3), которое бы мы хотели видеть на плате Arduino;
— форма для ввода данных о состоянии выхода.
Выполняемая функция скрипта определяется наличием переменных в строке запуска файла:
— out=0/1 — функция записи в базу;
— psw=123 — включение режима ввода данных;
— без параметров, скрипт просто отображает данные из базы.wc_wop wc_psw wc_subm

Если обращаться к странице form.php web-сервера без параметров, то картинка будет как слева. Здесь можно просмотреть последние записи из базы данных.
Если обращаться к странице form.php web-сервера с параметром psw=123 (123 — это «как бы» пароль), то картинка будет как в центре. Здесь можно просмотреть последние записи из базы данных и управлять цифровой линией: выставить нужное состояние и нажать кнопку «Send». По нажатию кнопки «Cut» программа перезапускается с параметром cut=Cut. При таком запуске файл data.txt сокращается до 400 байт — остаются последние записи из файла. Таким образом можно сократить размер файла.
Если обращаться к странице form.php web-сервера с параметром out=0|1, то картинка будет как справа. Такой запрос происходит по нажатию кнопки «Send» в предыдущем экране. Здесь можно просмотреть последние записи из базы данных и увидеть сверху результат нами сформированной записи.

Файл data.txt — собственно база данных в текстовом формате. Каждая запись — это строка с пятью значениями: дата/время записи, признак «кем сделана запись» (dev/hum), pin 7, pin 9, температура. При создании такого файла на сервере обязательно надо дать права на запись в файл всем клиентам (0666 в свойствах файла).

PS (2015) Конечно, хостинг, где размещаются описанные выше файлы, должен обеспечивать работу PHP. Я «тренировался» на бесплатном hostinger.ru — до событий на Украине он работал с бесплатными российскими аккаунтами «вполне себе прилично», но… В-общем, латыши сейчас почти прикрыли халяву — дольше месяца бесплатно продержаться скорей всего не получится.

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

Ваш e-mail не будет опубликован.

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".