Mysql и ethernet shield

davidka-oganesy...
Offline
Зарегистрирован: 10.02.2017

Всем добрый вечер!

Столкнулся с проблемой,которую не могу решить(Казалось бы, бери и клей)

Имеется сайт,у которого тумблеры работают на базе данных mysqli. Т.е они принимают значения от БД, а также они могут и изменять эти значия в БД.

Вопрос в том,как мне передать эти самые "значения" в мой ethernet shield? Знаю что он может отправлять Get и Post запросы, но не могу применить это таким образом, чтобы постоянно запрашивать данные из бд и вносить в ethernet.

Идея была в том, чтобы в php  из БД постоянно запрашивать параметры значений и отправлять их в ethernet shield. Может кто нибудь подскажет,как именно мне реализовать данную идею? 

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

davidka-oganesyan@mail.ru пишет:
чтобы в php  из БД постоянно запрашивать параметры значений и отправлять их в ethernet shield. Может кто нибудь подскажет,как именно мне реализовать данную идею?

Никак. Нельзя передавать данные по инициативе сервера. Наоборот, можно - клиент может постоянно запрашивать эти данные у сервера, а уж сервер (на php или ещё на чём) будет обрабатывать эти запросы и возвращать клиенту значения.

Т.е. Ваш шилд может слать скажем раз в полсекунды или даже чаще запросы серверу, а тот пусть отвечает.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

И еще - Ethernet Shield сам по себе не умеет отправлять ни GET, ни POST.

davidka-oganesy...
Offline
Зарегистрирован: 10.02.2017

Вообщем так, мой шилд работает в режиме клиента.От этого буду как то топтать

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Правильно.

davidka-oganesy...
Offline
Зарегистрирован: 10.02.2017

Немного недопонимаю,помогите пожалуйста. Как мне ответить моему шилду (Т.е POST или GET запросу) ?

Вот пришел запрос (нужных переменных) серверу ==> сервер запрос принял => затем сервак в бд покопался, записал значения из БД в переменные - а ответ то в виде этих переменных как дать? 

Если можно, есть какой нибудь простенький пример этого?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

В виде переменных - никак. В любом случае отдаёте текстом или бинарным форматом. Клиент сделал print() /к примеру GET /record?id=1234/, потом read(), пока avialable(). А как интерпретировать то, что прочитали - ваше личное дело.

davidka-oganesy...
Offline
Зарегистрирован: 10.02.2017
Я настырный и все-таки доведу это дело до конца
Все ли я правильно делаю со стороны сервера?
Не получает данные...
Насчет подключения и выборки данных БД, а также часть с "echo" - РАБОТАЕТ ТОЧНО
Что то не то делаю с http запросом....
Может, выясним в чем дело?
 
Вот серверный код:
 
<?php
 
if(isset($_GET['led1']))
{
$n1=mysqli_connect("mysql*****.ru","g123*****b","6******f","g88888b");
$queryled=mysqli_query($n1, "select * from choice where id='1'");
$queryled2=mysqli_fetch_array($queryled);
echo $queryled2;
 
} elseif(isset($_GET['window']))
{
 
$n1=mysqli_connect("mysql*****.ru","g123*****b","6******f","g88888b");
$querywindow=mysqli_query($n1, "select * from choice where id='2'");
$querywindow2=mysqli_fetch_array($querywindow);
echo $querywindow2;
 
}
?>
 
Код от ардуинки кину чуть позже, прошу написать,все ли так с серверной частью?
 
 
 
davidka-oganesy...
Offline
Зарегистрирован: 10.02.2017
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 
  xxxx, xxxx, xxxx, xxxx, xxxx, xxxx };
char server[] = "www.spasibo.svyaz56.ru/David/xxxx/but/arduino.php";   
IPAddress ip(192, 168, 1, 64);
EthernetClient client;
void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  // Дадим время шилду на инициализацию
  delay(1000);
  Serial.println("connecting...");
  if (client.connect(server, 80)) {
    Serial.println("---------------");
    // Создаем HTTP-запрос
    client.println("GET /David/xxxx/but/arduino.php?led1 HTTP/1.1");
    client.println("Host: www.spasibo.svyaz56.ru");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
  } 
  else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}
void loop() {
  // Если есть доступные биты, читаем их и выводим на экран
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  // Если соединение прервано, отключаем клиент
  if (!client.connected()) {
    Serial.println();
    Serial.println("---------------");
    Serial.println("disconnecting");
    client.stop();
    // Останавливаем выполнение программы
    while (true);
  }
}
b707
Offline
Зарегистрирован: 26.05.2017

davidka-oganesyan@mail.ru пишет:

Все ли я правильно делаю со стороны сервера?
 
Конечно нет. Вы всего лишь извлекаете данные из БД - а это полдела.Их еще надо правильно отослать. Почитайте, что должна содержать типичная HTTP-сессия
В ответе от сервера должно содержаться куча информации - статус, дата, служебные заголовки - и только потом, собственно, данные. А вы отсылаете только "голую" цифру из базы данных...
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Ну отсылает то он правильно, в начале php кода только добавить doctype html

Вопрос в том сможет ли ТС распарсить корректно ответ.

Я обычно возвращаемый текст обрамляю в некую последовательность символов  например ~\

Ниже пример, в 60 строке написать возвращаемое значение 

 

<?php include_once $_SERVER['DOCUMENT_ROOT'] . '/includes/helpers.inc.php'; ?>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title> Add data to DB </title>
</head>
<body>

<?php 

function tempToFloat($arg)
{
	if ($arg >= 2000)
	{
		$res = ($arg-2000);
		$res = ($res / 10);
		$res = (0-$res);
	} else
	{
		$res = ($arg / 10);
	}
	return $res;
}

if ((isset($_GET['id']))  and (isset($_GET['rs'])) and (isset($_GET['t0'])))
{
	try
	{
		if (isset($_GET['t2'])) 
		{
			$sql = 'INSERT INTO `thermometers` (`i_id`, `c_strelay`, `f_t1`, `f_t2`, `f_t3`) VALUES (:p1, :p2, :p3, :p4, :p5)';
		} else if (isset($_GET['t1']))
		{
			$sql = 'INSERT INTO `thermometers` (`i_id`, `c_strelay`, `f_t1`, `f_t2`) VALUES (:p1, :p2, :p3, :p4)';
		} else 
		{
			$sql = 'INSERT INTO `thermometers` (`i_id`, `c_strelay`, `f_t1`) VALUES (:p1, :p2, :p3)';
		}
		$s = $pdo->prepare($sql);
		$s->bindValue(':p1', $_GET['id']);
		$s->bindValue(':p2', $_GET['rs']);
		$s->bindValue(':p3', tempToFloat($_GET['t0']));
		if (isset($_GET['t1']))
		{
			$s->bindValue(':p4', tempToFloat($_GET['t1']));
		}
		if (isset($_GET['t2']))
		{
			$s->bindValue(':p5', tempToFloat($_GET['t2']));
		}
		$s->execute();
	}
	catch (PDOException $e)
	{
		$error = 'Error ' . $e->getMessage();
		include $_SERVER['DOCUMENT_ROOT'] . '/includes/error.html.php';
		exit();
	}
	echo "OK";
	exit();
}
?>

</body>

</html>

 

davidka-oganesy...
Offline
Зарегистрирован: 10.02.2017

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

<!DOCTYPE html>
 
<html>
<head>
<meta charset="utf-8" />
<title> Add data to DB </title>
</head>
<body>
 
<?php
 
if(isset($_GET['led1']))
{
$n1=mysqli_connect("m***********.ru","*********","*********","**********");
$queryled=mysqli_query($n1, "select * from choice where id='1'");
$queryled2=mysqli_fetch_array($queryled);
if($queryled2['choice']=="off")
{
echo "offled";
}
if($queryled2['choice']=="on")
{
echo "onled";
}
 
} elseif(isset($_GET['window']))
{
$n1=mysqli_connect("m***********.ru","*********","*********","**********");
$querywindow=mysqli_query($n1, "select * from choice where id='2'");
$querywindow2=mysqli_fetch_array($querywindow);
if($querywindow2['choice']=="off")
{
echo "offwin";
}
if($querywindow2['choice']=="on")
{
echo "onwin";
}
}
?>
</body>
</html>
 

 

davidka-oganesy...
Offline
Зарегистрирован: 10.02.2017
Скорее всего косяк в коде ардуино, а именно в формировании запроса. Или директорию неправильно прописываю или формирую неправильно. А может и то и то другое
 
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 
   xxxx, xxxx, xxxx, xxxx, xxxx, xxxx };
char server[] = "www.spasibo.svyaz56.ru/David/****/but/arduino.php";   
IPAddress ip(192, 168, 1, 64);
EthernetClient client;
void setup() {
 
  // Дадим время шилду на инициализацию
  
}
void loop() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
 delay(1000);
  Serial.println("connecting...");
  if (client.connect(server, 80)) {
    Serial.println("---------------");
    // Создаем HTTP-запрос
    client.println("GET /arduino.php?led1 HTTP/1.1");
    client.println("Host: www.spasibo.svyaz56.ru/David/****/but");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
     if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  } 
  else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
 
  
 
  
  // Если есть доступные биты, читаем их и выводим на экран
 
  // Если соединение прервано, отключаем клиент
 
}
 
 
 
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

1 идёте в apache/log и там смотрите ошибку на запрос если вдруг серверу что то не нравится
2 ручками в браузере запрос get сформируйте корректный и сравните с тем что формируется в скетче

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andycat,

если Вы будете продолжать отвечать ТС, он никогда не научится вставлять скетч. Закон рынка - нет спроса - нет предложения.

davidka-oganesy...
Offline
Зарегистрирован: 10.02.2017
 
 
Спасибо всем за наводки!
Благодаря одному из форуму и ваших наводок - получилось получить ответ, правда, корявеньким форматом.
 
код приложен снизу:
#include <SPI.h>
#include <Ethernet.h>
int ledRed = 3; // светодиод подключен к 3 аналоговому входу
int prom;
int stepRed = 0;
// Введите MAC-адрес и IP-адрес вашего контроллера
// IP-адрес должен соответствовать вашей локальной сети
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,123); //<<< IP-АДРЕС ВАШЕГО АРДУИНО ВВОДИТЬ СЮДА!!!
 
// инициализации экземпляра библиотеки:
EthernetClient client;
 
// URL сервера, которому будем отправлять запросы
char serverName[] = "spasibo.svyaz56.ru"; //<<< Адрес сайта вводить сюда!!!(адрес не рабочий)
 
 
 
void setup() {
 
pinMode(ledRed, OUTPUT);
digitalWrite(ledRed, LOW);
 
// инициализация последовательного порта:
Serial.begin(9600);
 
// попытка подключения с DHCP:
if (!Ethernet.begin(mac)) {
 
// если DHCP-сервер отсутствует в сети,
// подключаемся с заданным нами IP-адресом:
Ethernet.begin(mac, ip);
}
// подключаемся к Сайту:
connectToServer();
}
 
void loop()
{
if (client.connected()) {
 
if (client.available()) {
 
// считываем полученные байты:
char inChar = client.read();
Serial.println(inChar);
/* показывает в окне Монитора порта полученные символы
если цикл находит нужный символ($), он записывает в переменную prom единицу
*/
 
if (inChar == '$'){
 
prom = 1;
}
 
/* Тут мы проверяем что идет после символа $, если ноль то закрываем соединение,
присваиваем переменной prom ноль и снова вызываем сервер
*/
if (prom == 1 && inChar == '0'){
 
Serial.println("CLOSED"); //Вы водит сообщение CLOSED в мониторе порта
client.stop();
prom = 0;
connectToServer();
}
/* Если после символа $, идет единица,
(это то чего мы ждали, значит кто-то на сайте нажал кнопку),
то выполняем цикл при котором светодиод плавно загорается,
горит две секунды и потом плавно тухнет. После этого закрываем соединение,
присваиваем переменной prom ноль и снова вызываем сервер
*/
 
if (prom == 1 && inChar == '1'){
 
Serial.println("OPEN");
//Вы водит сообщение OPEN в мониторе
 
while(stepRed < 256 ) {//while - запускает цикл который плавно увеличивает яркость светодиода
 
analogWrite(ledRed, stepRed);
stepRed++;
delay(5);
}
delay(2000);
 
while(stepRed > -1 ) {
 
analogWrite(ledRed, stepRed);
stepRed--;
delay(5);
}
client.stop();
prom = 0;
connectToServer();
}
}
}
}
 
// функция подключения к нашему серверу :
void connectToServer() {
 
Serial.println("connecting to server...");
if (client.connect(serverName, 80)) {
 
Serial.println("making HTTP request...");
Serial.println("GOOD");
// Создаем GET HTTP-запрос к Сайту:
client.println("GET /David/****/but/arduino.php?led1 HTTP/1.1"); //<<< Сюда вводим свой GET запрос!!! этот адрес не рабочий
client.println("HOST: spasibo.svyaz56.ru"); //<<< Адрес сайта вводить сюда!!! этот адрес не рабочий
client.println();
}
 
}
 

 

 

У меня возник следующие вопросы:

Как мне получить ответ в читаемом виде?

Как я могу из тега <body> взять мою переменную?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

davidka-oganesyan@mail.ru пишет:

 
У меня возник следующие вопросы:

Как мне получить ответ в читаемом виде?

Для начала следует разместить код в читаемом виде.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Ндя....

1) Всё можно. 

Немного мемуаров: в сумме у меня неделя ушла на написание вего этого с прямыми руками. Багаж знаний: минимум: язык ардуино(и С++), PHP, SQL. Желательно HTML, CSS, JS, BASH. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

dmitron1036 пишет:

у меня неделя ушла на написание вего этого ... Багаж знаний: минимум: язык ардуино(и С++)

Судя по этому замечанию и потому, что ты всё же что-то написал, можно сделать вывод, что написать можно и вовсе без багажа знаний :)