Не выполняется GET, POST запросы на локальном сервере

Sherzod
Offline
Зарегистрирован: 17.04.2016

Вот обычный скетч:

#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
 
//Константы
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
 
EthernetClient client;
 
//Переменные
unsigned long int timeConn = millis();      // Частота отправки данных о t/h на сервер
float h;                                    // Значение температуры
float t;                                    // Значение влажности
char server[] = "localhost";
 
/*--------------------------------------------------------------
 Необходимые настройки
 --------------------------------------------------------------*/
void setup()
{
  //Старт
  Serial.begin(9600);
  Ethernet.begin(mac);
  dht.begin();
}
/*--------------------------------------------------------------
 Основное тело программы
 --------------------------------------------------------------*/
void loop()
{
  h = dht.readHumidity();
  t = dht.readTemperature();
  if (millis() - timeConn > 2000) {
    sendData(t,h);
    timeConn = millis();
    Serial.println("CONNECT SERVER: Send temp/hum");
  }
}
/*--------------------------------------------------------------
 Функция отправляет данные о температуре и влажности на 
 WEB сервер.
 --------------------------------------------------------------*/
void sendData(float t, float h) {
  client.connect(server, 80);
  client.print( "GET /add.php?");
  client.print("t=");
  client.print(t);
  client.print("&");
  client.print("h=");
  client.print(h);
  client.println(" HTTP/1.1");
  client.print( "Host: " );
  client.println(server);
  client.println( "Connection: close" );
  client.println();
  client.println();
  client.stop();
  client.flush();
/* Для тестирование текст запроса вывел в сериал порт */
  Serial.print( "GET /add.php?");
  Serial.print("t=");
  Serial.print(t);
  Serial.print("&");
  Serial.print("h=");
  Serial.print(h);
  Serial.println(" HTTP/1.1");
  Serial.print( "Host: " );
  Serial.println(server);
  Serial.println( "Connection: close" );
}

В мониторе порта текст запроса выводится нормально: 

GET /add.php?t=25.10&h=53.30 HTTP/1.1
Host: localhost
Connection: close
 
Но данные не добавляются в базу, то есть GET запрос не поступает к серверу. Если в браузере набрать:
http://localhost/add.php?t=25.10&h=53.30 - то данные добавляются в базу, то есть файл add.php работает как надо.
 
Сервер как вы поняли локальный. Может быть езернет шилд не умеет отправлять GET запросы локальному серверу, а работает только с сервером с которым можно соединится только через интернет? Если так, то можно ли как то обойти или может есть решение чтобы ардуино с езернет шилдом работал с локальным сервером?
 
Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Так дуина сама к себе обращается. У тебя только клиент поднят, а где сервер?

EthernetClient client;
EthernetServer server(80);

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

localhost - это альяс имени сервера, поднятого на локальной железке. Т.е. вы обращаетесь не к компьютеру, а к себе. Для того, чтобы всё заработало - надо вместо localhost подставить IP-адрес компьютера, на котором поднят веб-сервер, и всё должно быть нормально.

Sherzod
Offline
Зарегистрирован: 17.04.2016

Andy пишет:

Так дуина сама к себе обращается. У тебя только клиент поднят, а где сервер?

EthernetClient client;
EthernetServer server(80);

Сервер то на локалной машине поднят или надо и в ардуине поднимать?

DIYMan пишет:

localhost - это альяс имени сервера, поднятого на локальной железке. Т.е. вы обращаетесь не к компьютеру, а к себе. Для того, чтобы всё заработало - надо вместо localhost подставить IP-адрес компьютера, на котором поднят веб-сервер, и всё должно быть нормально.

Если поставить ip 127.0.0.1 то все равно не заработал. Создал хост например mysite.ru, перевел туда add.php. Изменил localhost на mysite.ru, но все равно не заработал. Может ip надо какой нибудь 192.168.1.10 прописать и изменить на этот айпи?

Sherzod
Offline
Зарегистрирован: 17.04.2016

Заработал! Как и писал создал другой хост, на который можно зайти по айпи 192.168.1.10. Сервер указал этот айпи.

P.S. По идеи должен был заработать и с mysite.ru , оказывается тут я сам накосячил в настройках и mysite.ru тоже открывал файлы localhost'a.

papakaplo
Offline
Зарегистрирован: 18.04.2016

Sherzod пишет:

Заработал! Как и писал создал другой хост, на который можно зайти по айпи 192.168.1.10. Сервер указал этот айпи.

P.S. По идеи должен был заработать и с mysite.ru , оказывается тут я сам накосячил в настройках и mysite.ru тоже открывал файлы localhost'a.

Здравствуйте, а можете выложить полный рабочий код скетча и ПХП код, тот что на локальном сервере. А то уже 2 дня мучаюсь с записью в БД. Я так понимаю вы через денвер работаете?

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Вспомнилось...:

- кУлЦхАкЕр: дайте какой-нить айпишник ломануть
- на 127.0.0.1

кУлЦхАкЕр ротерял связб сервером...

Sherzod
Offline
Зарегистрирован: 17.04.2016

papakaplo пишет:

Здравствуйте, а можете выложить полный рабочий код скетча и ПХП код, тот что на локальном сервере. А то уже 2 дня мучаюсь с записью в БД. Я так понимаю вы через денвер работаете?

Нет, не денвер. Веб сервер apache поднят на debian 8.2. Но никаких проблем с денвером не должно быть. Просто создаете сайт на денвере например mysite.ru, и в скетче который указан в первой сообщении надо изменить

char server[] = "localhost";

на

char server[] = "mysite.ru";

Содержимое файлы add.php:

<?php
define(DB_HOST, "localhost");
define(DB_NAME, "db_name"); //название базы
define(DB_USER, "username"); //имя пользователя базы
define(DB_PASS, "pass"); //пароль пользователя базы
 
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS);
if(!$link) die ("Невозможно подключиться к базе данных!");
mysql_select_db(DB_NAME);
 
$temp=$_GET["t"];
$hum=$_GET["h"];
 
$query = "INSERT INTO `temp_room1` (`time`, `temp`, `hum`) 
VALUES ('".time()."', '".$temp."','".$hum."')";
/* 
temp_room1 - название таблицы в базе
time, temp, hum - поля в таблице
*/
   
if(!mysql_query($query))
    echo "ошибка при записи в БД!";
mysql_close($link);
?>
papakaplo
Offline
Зарегистрирован: 18.04.2016

Sherzod пишет:

Нет, не денвер. Веб сервер apache поднят на debian 8.2. Но никаких проблем с денвером не должно быть. Просто создаете сайт на денвере например mysite.ru, и в скетче который указан в первой сообщении надо изменить

char server[] = "localhost";

на

char server[] = "mysite.ru";

Содержимое файлы add.php:

<?php
define(DB_HOST, "localhost");
define(DB_NAME, "db_name"); //название базы
define(DB_USER, "username"); //имя пользователя базы
define(DB_PASS, "pass"); //пароль пользователя базы
 
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS);
if(!$link) die ("Невозможно подключиться к базе данных!");
mysql_select_db(DB_NAME);
 
$temp=$_GET["t"];
$hum=$_GET["h"];
 
$query = "INSERT INTO `temp_room1` (`time`, `temp`, `hum`) 
VALUES ('".time()."', '".$temp."','".$hum."')";
/* 
temp_room1 - название таблицы в базе
time, temp, hum - поля в таблице
*/
   
if(!mysql_query($query))
    echo "ошибка при записи в БД!";
mysql_close($link);
?>

Ваш код я переделал под себя. Я имею датчик температуры ds18b20, хочу брать с него температуру и заносить в БД mysql посредством денвер.

библиотеку использую UIPEthernet.h, модуль использую ENC28j60 

Вот код


#include <UIPEthernet.h> 
#include <OneWire.h> 
OneWire ds(3); 

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес 

EthernetClient client; 

//Переменные 
unsigned long int timeConn = millis(); // Частота отправки данных о t на сервер 
float t; // Значение температуры
char server[] = "192.168.1.47"; 

/*------------------------------------------------------------— 
Необходимые настройки 
—------------------------------------------------------------*/ 
void setup() 
{ 
//Старт 
Serial.begin(9600); 
Ethernet.begin(mac); 


} 
/*------------------------------------------------------------— 
Основное тело программы 
—------------------------------------------------------------*/ 
void loop() 
{ 

if (millis() - timeConn > 2000) { 
////////////значения температуры//////////////// 
byte data[2]; 
ds.reset(); 
ds.write(0xCC); 
ds.write(0x44); 
delay(750); 
ds.reset(); 
ds.write(0xCC); 
ds.write(0xBE); 
data[0] = ds.read(); 
data[1] = ds.read(); 
int t = (data[1]« 8)+data[0]; 
t = t»4; 
////////////температура//////////////// 

sendData(t); 
timeConn = millis(); 
Serial.println("CONNECT SERVER: Send temp/hum"); 
} 
} 
/*------------------------------------------------------------— 
Функция отправляет данные о температуре на 
WEB сервер. 
—------------------------------------------------------------*/ 
void sendData(float t) { 
client.connect(server, 80); 
client.print( "GET /index.php?"); 
client.print("t="); 
client.print(t); 
client.println(" HTTP/1.1"); 
client.print( "Host: " ); 
client.println(server); 
client.println( "Connection: close" ); 
client.println(); 
client.println(); 
client.stop(); 
client.flush(); 
/* Для тестирование текст запроса вывел в сериал порт */ 
Serial.print( "GET /index.php?"); 
Serial.print("t="); 
Serial.print(t); 
Serial.println(" HTTP/1.1"); 
Serial.print( "Host: " ); 
Serial.println(server); 
Serial.println( "Connection: close" ); 
}

Монитор порта показывает

GET /index.php?t=27.00 HTTP/1.1 
Host: 192.168.1.47 
Connection: close 
CONNECT SERVER: Send temp/hum

т.е. всё как надо.

На стороне компьютера (ip 192.168.1.47) установлен денвер, там в папке сайта test4.ru в самой дериктории, в файле .htaccess прописал

## Z:\home\test4.ru\www\.htaccess 
## 192.168.1.47 
# dnwr_ip 192.168.1.47

т.е. при вводе в браузере 192.168.1.47 запускается index.php в корне папки test4.ru, в самом index.php  прописал для начала код без передачи его БД, хотябы чтобы увидеть передаются ли значения температуры, но так ничего и не увидел. Куда копать дальше?

<? 
$t=$_GET["t"];
echo $t;
?>

или все таки надо прописывать код вставки в БД? Сам же браузер я так понимаю дожен быть постоянно включен и октрыта страница 

 
 
Sherzod
Offline
Зарегистрирован: 17.04.2016

papakaplo, если наберете в браузере например: http://192.168.1.47/index.php?t=25.60 что выводится?

Если 25.60 значит все работает и можете вставлять код добавление в базу. Если пусто, то не лучше ли изменить 192.168.1.47 на test4.ru

И еще один момент. Если хотите получать температуру в целых числах, то на 11-строке скетча float тоже желательно изменить на int. Если же хотите получать в дробных числах (точнее), 11-строку не меняете но на 43-строке int надо поменять на float и в базе тип поля temp тоже надо изменить с int на float.

P.S. Для DS18B20 у меня был более компактный код/скетч. Вдобавок можно сразу получать данные с двух и более датчиков. Скину вечером когда буду дома.

papakaplo
Offline
Зарегистрирован: 18.04.2016

Sherzod пишет:

papakaplo, если наберете в браузере например: http://192.168.1.47/index.php?t=25.60 что выводится?

Если 25.60 значит все работает и можете вставлять код добавление в базу. Если пусто, то не лучше ли изменить 192.168.1.47 на test4.ru

И еще один момент. Если хотите получать температуру в целых числах, то на 11-строке скетча float тоже желательно изменить на int. Если же хотите получать в дробных числах (точнее), 11-строку не меняете но на 43-строке int надо поменять на float и в базе тип поля temp тоже надо изменить с int на float.

P.S. Для DS18B20 у меня был более компактный код/скетч. Вдобавок можно сразу получать данные с двух и более датчиков. Скину вечером когда буду дома.

Да оно выведется, это я понимаю,  ведь если я вставлю в браузере http://192.168.1.47/index.php?t=25.60, то выведется значение 25.60 которую я сам же и ввел и которой равна переменная t. А как мне вывести то, что измеряет сам датчик, ведь он сам не ввставит эту строчку в браузер и не запишется значение в базу,  ведь нужен POST запрос с самой страницы (допустим кнопка).  

Да тут и так все по минимуму взято для этого датчика. Пока в наличии только один. Интересно было б взгялнуть на ваш пример. А с переменной я в курсе, до неё ещё дойдут руки, это не суть) суть автоматически добавлять в базу значение этой переменной))

Sherzod
Offline
Зарегистрирован: 17.04.2016

Поставьте условие if(client.connect(server, 80)){}, чтобы узнать есть ли коннект с сервером:

void sendData(float t) { 

...
...
/* Для тестирование текст запроса вывел в сериал порт */ 
if(client.connect(server, 80)){ 
Serial.print( "GET /index.php?"); 
Serial.print("t="); 
Serial.print(t); 
Serial.println(" HTTP/1.1"); 
Serial.print( "Host: " ); 
Serial.println(server); 
Serial.println( "Connection: close" ); 
}
}

 

papakaplo
Offline
Зарегистрирован: 18.04.2016
Сделал проверку по подключению
if(client.connect(server, 80)){
    Serial.print( "GET /index.php?");
  Serial.print("t=");
  Serial.print(t);
  Serial.println(" HTTP/1.1");
  Serial.print( "Host: " );
  Serial.println(server);
  Serial.println( "Connection: close" );}
    else {
    Serial.println( "Connection: false" );}
 
}

ком порт выдает 

GET /index.php?t=29.00 HTTP/1.1
Host: 192.168.1.52
Connection: close
CONNECT SERVER: Send temp/hum
Следовательно связь есть, да ещё и мигает TX на ардуине, и мигает оранжевый на модуле enc28j60
Думается мне надо на стороне сервера искать причину
Какой адрес страницы у вас введен?
 
<?php
define(DB_HOST, "localhost");
define(DB_NAME, "arduino"); //название базы
define(DB_USER, "papakaplo"); //имя пользователя базы
define(DB_PASS, "123"); //пароль пользователя базы
 
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS);
if(!$link) die ("Невозможно подключиться к базе данных!");
mysql_select_db(DB_NAME);
 
$temp=$_GET["t"];

 
$query = "INSERT INTO `sensor_data` (`date_time`, `sensor_temp`) 
VALUES ('".time()."', '".$temp."')";
/* 
temp_room1 - название таблицы в базе
time, temp, hum - поля в таблице
*/
   mysql_query($query) or die (mysql_error());

mysql_close($link);
?>

В базе данной при обновлении страиницы в поле sensor_temp появляются 0.000 

Не вижу у вас самого запроса в пхп на ардуино, в моём понимании сервер делает запрос к клиенту и получает данные, и так циклично

papakaplo
Offline
Зарегистрирован: 18.04.2016

Кароч все само заработало, перезагрузил дуино, и в БД значения пошли писаться. Спасибо Шерзод!

papakaplo
Offline
Зарегистрирован: 18.04.2016

Заменив int на float компилятор  стал ругаться на строку t = t»4;

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

papakaplo пишет:

Заменив int на float компилятор  стал ругаться на строку t = t»4;

И правильно сделал.

А что, собсnвенно, Вы хотели добиться от t = t»4; ?

Sherzod
Offline
Зарегистрирован: 17.04.2016

papakaplo пишет:

Не вижу у вас самого запроса в пхп на ардуино, в моём понимании сервер делает запрос к клиенту и получает данные, и так циклично

Наоборот. Клиент (в нашем случае - ардуино) делает запрос, а сервер обрабатывает и отвечает клиенту.

papakaplo пишет:

Заменив int на float компилятор  стал ругаться на строку t = t»4;

Честно говоря, я не силен в синтаксисе языка для ардуино. Думаю лучше убрать эту строчку. А вообще ниже я приведу скетч, который обещал

papakaplo пишет:

Кароч все само заработало, перезагрузил дуино, и в БД значения пошли писаться. Спасибо Шерзод!

Всегда пожалуйста :)

Скетч №1 - Для определение уникального адреса датчика DS18B20

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 10 //датчик подключен к 10-пину Ардуино
#define TEMPERATURE_PRECISION 9

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();

  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");

  // assign address manually.  the addresses below will beed to be changed
  // to valid device addresses on your bus.  device address can be retrieved
  // by using either oneWire.search(deviceAddress) or individually via
  // sensors.getAddress(deviceAddress, index)
  //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
  //outsideThermometer   = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };

  // search for devices on the bus and assign based on an index.  ideally,
  // you would do this to initially discover addresses on the bus and then 
  // use those addresses and manually assign them (see above) once you know 
  // the devices on your bus (and assuming they don't change).
  // 
  // method 1: by index
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); 
  if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1"); 

  // method 2: search()
  // search() looks for the next device. Returns 1 if a new address has been
  // returned. A zero might mean that the bus is shorted, there are no devices, 
  // or you have already retrieved all of them.  It might be a good idea to 
  // check the CRC to make sure you didn't get garbage.  The order is 
  // deterministic. You will always get the same devices in the same order
  //
  // Must be called before search()
  //oneWire.reset_search();
  // assigns the first address found to insideThermometer
  //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");
  // assigns the seconds address found to outsideThermometer
  //if (!oneWire.search(outsideThermometer)) Serial.println("Unable to find address for outsideThermometer");

  // show the addresses we found on the bus
  Serial.print("Device 0 Address: ");
  printAddress(insideThermometer);
  Serial.println();

  Serial.print("Device 1 Address: ");
  printAddress(outsideThermometer);
  Serial.println();

  // set the resolution to 9 bit
  sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);

  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC); 
  Serial.println();

  Serial.print("Device 1 Resolution: ");
  Serial.print(sensors.getResolution(outsideThermometer), DEC); 
  Serial.println();
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
}

// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
  Serial.print("Resolution: ");
  Serial.print(sensors.getResolution(deviceAddress));
  Serial.println();    
}

// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
  Serial.print("Device Address: ");
  printAddress(deviceAddress);
  Serial.print(" ");
  printTemperature(deviceAddress);
  Serial.println();
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();
  Serial.println("DONE");

  // print the device information
  printData(insideThermometer);
  printData(outsideThermometer);
}

Загрузите скетч и смотрите монитор порта. Сколько у вас датчиков подключено столько и появится со своими уникальными адресами. Скопируйте адреса куда нибудь в текстовой файл. Дальше в скетча №2 замените эти адреса в HEX формате. Если например адрес датчика 2866AD03000080B4, то перед каждым 2 символа добавляете "0x" и получится 0x28, 0x66, 0xAD, 0x03, 0x00, 0x00, 0x80, 0xB4

Скетч №2 - Получаем показание датчиков DS18B20

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 10

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

DeviceAddress Thermometer1 = { 
  0x28, 0x66, 0xAD, 0x03, 0x00, 0x00, 0x80, 0xB4 };  //адрес датчика DS18B20 2866AD03000080B4
DeviceAddress Thermometer2 = { 
  0x28, 0xD5, 0xA8, 0x03, 0x00, 0x00, 0x80, 0x38 };  //28D5A80300008038

void setup() {

  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
  sensors.setResolution(Thermometer2, 10);

  Serial.begin(9600);
}

void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop() {

  sensors.requestTemperatures();
  Serial.print("Sensor1  ");
  printTemperature(Thermometer1);

  Serial.print("Sensor2  ");
  printTemperature(Thermometer2);
}

P.S. Возможно вам потребуется скачать библиотеку DallasTemperature. Если не найдете могу вам на почту отправить. Сюда вроде загрузить не получится.

papakaplo
Offline
Зарегистрирован: 18.04.2016

Спасибо Sherzod, библиотека да далас установлена, кстати про адресацию датчиков в другой ветке вопрос задавал, а вы тут ответили без вопроса :) , домой приеду окончательно код выложу рабочего решения: скетч, код php, и бд.

Ещё возник вопрос, вроде все работает добавляется, но в какой-то момент показания перестают добавляться в БД, и дуина молчит, как будто засыпает. Мб необходимо её дёргать в течении каждого цикла?

papakaplo
Offline
Зарегистрирован: 18.04.2016

Рабочий код для связки ардуино + enc28j60 + виртуальный сервер денвер

Скетч

#include <UIPEthernet.h>
#include <OneWire.h>
OneWire ds(3);                              //Датчик подключен к 3 пину

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
 
EthernetClient client;
 
//Переменные
unsigned long int timeConn = millis();      // Частота отправки данных о температуре на сервер
float t;                                    // Значение влажности
char server[] = "192.168.1.39";             // Адрес сервера т.е. компа
 
/*--------------------------------------------------------------
 Необходимые настройки
 --------------------------------------------------------------*/
void setup()
{
  //Старт
  Serial.begin(9600);
  Ethernet.begin(mac);
}
/*--------------------------------------------------------------
 Основное тело программы
 --------------------------------------------------------------*/
void loop()
{
  if (millis() - timeConn > 2000) {
        ////////////температура////////////////
 byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float t; 
  if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      
      type_s = 1;
      break;
    case 0x28:
      
      type_s = 0;
      break;
    case 0x22:
     
      type_s = 0;
      break;
    default:
     
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // начало коммуникации 
  delay(1000);
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // читаем значение


  for ( i = 0; i < 9; i++) {           // смотрим 9 байтов
    data[i] = ds.read();
    
  }
  

  // Преобразуем получненный данные в температуру
  // Используем int16_t тип, т.к. он равен 16 битам
  // даже при компиляции под 32-х битный процессор
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;
    else if (cfg == 0x20) raw = raw & ~3;
    else if (cfg == 0x40) raw = raw & ~1;
  }
  t = (float)raw / 16.0;
////////////температура////////////////
if(client.connect(server, 80)){
    sendData(t);}
    else {
    client.println( "Connection: false" );}
    timeConn = millis();
    Serial.println("CONNECT SERVER: Send temp");
  }
}
/*--------------------------------------------------------------
 Функция отправляет данные о температуре и влажности на 
 WEB сервер.
 --------------------------------------------------------------*/
void sendData(float t) {
  client.connect(server, 80);
  client.print( "GET /index.php?");
  client.print("t=");
  client.print(t);
  client.println(" HTTP/1.1");
  client.print( "Host: " );
  client.println(server);
  client.println( "Connection: close" );
  client.println();
  client.println();
  client.stop();
  client.flush();
/* Для тестирование текст запроса вывел в сериал порт */
if(client.connect(server, 80)){
  Serial.print( "GET /index.php?");
  Serial.print("t=");
  Serial.print(t);
  Serial.println(" HTTP/1.1");
  Serial.print( "Host: " );
  Serial.println(server);
  Serial.println( "Connection: close" );}
    else {
  Serial.println( "Connection: false" );}
 
}

 Настройки сервера в файлике .httaccess

## Z:\home\test4.ru\www\.htaccess
## 192.168.1.39
# dnwr_ip 192.168.1.39

Обработчик index.php

<?php
define(DB_HOST, "localhost");
define(DB_NAME, "arduino"); //название базы
define(DB_USER, "papakaplo"); //имя пользователя базы
define(DB_PASS, "123"); //пароль пользователя базы
 
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS);
if(!$link) die ("Невозможно подключиться к базе данных!");
mysql_select_db(DB_NAME);
 
$temp=$_GET["t"];

 
$query = "INSERT INTO `sensor_data` (`date_time`, `sensor_temp`) 
VALUES ('".date('Y-m-j H:i:s')."', '".$temp."')";

   mysql_query($query) or die (mysql_error());

mysql_close($link);
?>

Код для создания БД

CREATE TABLE IF NOT EXISTS `sensor_data` (
  `date_time` datetime NOT NULL,
  `sensor_temp` float(9,2) NOT NULL DEFAULT '0.000'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

zalias7
Offline
Зарегистрирован: 18.03.2015

Ребята вы с такими пхп скриптами не забываите о безопасности, посмотрите например "SQL injection" , а то злые хакеры не дремлют :)

papakaplo
Offline
Зарегистрирован: 18.04.2016

zalias7 пишет:

Ребята вы с такими пхп скриптами не забываите о безопасности, посмотрите например "SQL injection" , а то злые хакеры не дремлют :)

Понавешать защит и проверок не долго. Просто все внутри домашней сети вертится. Да и особо ценной информации это не представляет. 

ivanknol
Offline
Зарегистрирован: 18.05.2018

Привет всем! Уже третий день медитирую над вышеизложенным. Шлю с Arduino значения 6 дальномеров на локальный сервер.

Имею следующую головную боль - значения не добавляются в базу данных.

При вводе в адресной строке "http://192.168.1.5/index.php?v1=1&v2=2&v3=3&v4=4&v5=5&v6=6;" и нажатии Enter в базе данных появлется новая строка с соответствующими значениями.

В мониторе COM-порта вижу:

"Connected" и "GET /index.php?v1=1&v2=2&v3=3&v4=4&v5=5&v6=6 HTTP/1.1"

Код index.php:

<?php
$dbhost = '127.0.0.1';
$dbuser = 'root';
$dbpass = '';
$dbname = 'stend';
$client_ip = $_SERVER['REMOTE_ADDR'];
$v1 = $_GET["v1"];
$v2 = $_GET["v2"];
$v3 = $_GET["v3"];
$v4 = $_GET["v4"];
$v5 = $_GET["v5"];
$v6 = $_GET["v6"];

$connect = mysql_connect($dbhost, $dbuser, $dbpass);

if(! $connect )
{
  die('Could not connect: ' . mysql_error());
}

mysql_select_db ($dbname, $connect);

$sql = "INSERT INTO value_sensor VALUES (NOW(), '$v1', '$v2', '$v3', '$v4', '$v5', '$v6', '$client_ip')";

if(!mysql_query($sql))
{echo '<p><b>Data upload error!</b></p>';}
else
{echo '<p><b>OK</b></p>';}
mysql_close($connect);
?>

 

 

Скетч:

#include <NewPing.h>
#include <Ethernet.h>
#include <SPI.h>

#define PIN_PING1 2
#define PIN_PING2 3
#define PIN_PING3 4
#define PIN_PING4 5
#define PIN_PING5 6
#define PIN_PING6 7

#define MAX_DISTANCE 200

# define Trig_1 2
# define Trig_2 3
# define Trig_3 4
# define Trig_4 5
# define Trig_5 6
# define Trig_6 7

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4C, 0xFB };
IPAddress ip(192, 168, 1, 4);

char server[] = "192.168.1.5";
//String server[] = "stend.ru";
//server[] = "stend";

EthernetClient client;

NewPing sonar1(PIN_PING1, PIN_PING1, MAX_DISTANCE);
NewPing sonar2(PIN_PING2, PIN_PING2, MAX_DISTANCE);
NewPing sonar3(PIN_PING3, PIN_PING3, MAX_DISTANCE);
NewPing sonar4(PIN_PING4, PIN_PING4, MAX_DISTANCE);
NewPing sonar5(PIN_PING5, PIN_PING5, MAX_DISTANCE);
NewPing sonar6(PIN_PING6, PIN_PING6, MAX_DISTANCE);

void setup()
{
  Ethernet.begin(mac,ip);

  Serial.begin(9600);

  pinMode(Trig_1, OUTPUT);
  pinMode(Trig_2, OUTPUT);
  pinMode(Trig_3, OUTPUT);
  pinMode(Trig_4, OUTPUT);
  pinMode(Trig_5, OUTPUT);
  pinMode(Trig_6, OUTPUT);  
}

void loop()
{
  int distanceSm1 = sonar1.ping();
  int v1 = distanceSm1/ US_ROUNDTRIP_CM;
  delay(50);

  int distanceSm2 = sonar2.ping();
  int v2 = distanceSm2 / US_ROUNDTRIP_CM;
  delay(50);

  int distanceSm3 = sonar3.ping();
  int v3 = distanceSm3 / US_ROUNDTRIP_CM;
  delay(50);

  int distanceSm4 = sonar4.ping();
  int v4 = distanceSm4 / US_ROUNDTRIP_CM;
  delay(50);

  int distanceSm5 = sonar5.ping();
  int v5 = distanceSm5 / US_ROUNDTRIP_CM;
  delay(50);

  int distanceSm6 = sonar6.ping();
  int v6 = distanceSm6 / US_ROUNDTRIP_CM;
  delay(50);
    
String msg = "GET /index.php?v1="+ String(v1) + "&v2="+String(v2) + "&v3="+String(v3) + "&v4="+String(v4) + "&v5="+String(v5) + "&v6="+String(v6)+" HTTP/1.1";

Serial.println(msg);

if (client.connect(server, 80)) {
client.connect(server, 80);
Serial.println("Connected");
client.println(msg);  
}
else {
Serial.println("No connect");  
}

delay (2000);

client.stop();
 
delay (5000);
  }

Т.е. данные ушли, но не дошли.

Вопрос. Где же они? Помогите, пожалуйста, разобраться.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Чтот я не заметил где в вашем скетче вы передаете ВЕРНЫЙ http запрос.

 

В частности нет обязательных строк client.println();client.println();