Связка Mega 2560+W5100+php+MySQL

AlexRyzh
Offline
Зарегистрирован: 11.11.2015

Здравствуйте. Была проблема с отправкой данных и наконец-то решилась. 

Создаю пост, т.к. изучая тему, натыкался на форумах на подобную проблему. Но ничего внятного там не находил. И вот решил создать пост конкретно решенной проблемы, дабы уменьшить страдания других ищущих. (хотя "страдания" без пользы не проходят, многое понимаешь, многому учишься...).

Я поставил себе задачу: данные с Мега2560 отправлять на сервер в базу данных. Что потом делать с этими данными!? Это уж как фантазия подскажит.

Я новичек в этом деле, поэтому несколько дней ущло на то, чтоб эта связка заработала. Очень много инфы было перелопачено (форумы, статьи, видео...), но никак не получалось. Разные вариации скетчей были перепробованы, разные php  коды... В основном гонял на Денвере, иногда пробовал на бесплатном хостинге. К стати, на хостинге очень быстро блокируют страницу, если идут частые запросы.

В общем всегда где-то присуствала неправильность действий. За основу я взял стандартный пример ServerClient. И не зная некоторых важных вещей, мучался меняя коды для Меги и ПХП. Последнее, что очень помогло, это вот эта статья http://www.tweaking4all.com/hardware/arduino/arduino-ethernet-data-push/

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

Итак код ПХП файл test1.php (лежит в корне хостинга). (в примере поменял только пароль)

<?php
//адрес хоста
$dbhost = 'localhost';
//Имя пользовтаеля
$dbuser = 'u254277277_2560';
//пароль для подключения к Mysql
$dbpass = '123123';
//имя базы данных
$dbname = 'u254277277_2560';
// сохраняем IP на всякий случай
$client_ip = $_SERVER['REMOTE_ADDR'];

//устанавливаем подключение к MySQL
$connect = mysql_connect($dbhost, $dbuser, $dbpass);
// проверяем состояние подключения
if(! $connect )
{
  die('Could not connect: ' . mysql_error());
}
// Выбираем базу данных
mysql_select_db ($dbname, $connect);

//Отправляем данные в таблицу
// Prepare the SQL statement
  $SQL = "INSERT INTO table1 (date_time, sensor_temp, sensor_humidity, client_ip) VALUES (NOW(),'966', '445', '$client_ip')";     

    // Execute SQL statement
   mysql_query($SQL);

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

На хостинге была создана база данных u254277277_2560 с пользователем u254277277_2560. В базе создана таблица table1 c полями "date_time, sensor_temp, sensor_humidity, client_ip" с типом данных соответственно  - datetime, float,float, text.

В этом примере не испльзуются значения переданные с Меги, первоначальная задача стояла запустить этот скрипт скетчем с Меги и увидеть результат в таблице БД. Поэтому при активации кода www.yousite.com/test1.php в БД должны записаться указанные данные. Со строки это получалось, а вот с Меги ну никак! 

Теперь привожу код скетча для Меги (Arduino 1.6.6), с которым все получилось!

 

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };                                       

EthernetClient client;
char server[] = "*********.hol.es"; // IP Adres (or name) of server to dump data to
int  interval = 9000; // Wait between dumps

void setup() {

  Serial.begin(9600);
  Ethernet.begin(mac); 
}

void loop() {
  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("-> Connected");
    // Make a HTTP request:
    client.print( "GET /test1.php?");
    client.println( " HTTP/1.1");
    client.print( "Host: " );
    client.println(server);
    client.println( "Connection: close" );
    client.println();
    client.println();
    client.stop();
    Serial.println("Disconected ->");
  }
  else {
    // you didn't get a connection to the server:
    Serial.println("--> connection failed/n");
  }
  while (true); // не повторять цикл
  //delay(interval); //можно поставить паузу, чтоб не грузить сервер частыми запросами
}

Вот собстенно и все. Задача решена, Мега активирует код ПХП. Данные в БД заносятся. 

Теперь вместо конкретных цифр можно в БД заносить данные с датчиков Меги. В ПХП принять переменные, например, $temp = $_GET["t"]; $hum = $_GET["h"]; 

И внести в БД $SQL = "INSERT INTO table1 (date_time, sensor_temp, sensor_humidity, client_ip) VALUES (NOW(),'t', 'h', '$client_ip')";

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

Надеюсь это поможет начинающим (как я ) избежать много головной боли :)

switch
Offline
Зарегистрирован: 07.12.2015

Молодец!

Но расово  верно делать, конечно, TCP туннель и в него кидать данные. Если часто будешь слать - будешь просто грузить сервер бестолку. Каждый запрос твоей  ардуины порождает тред в апаче и отдельный запуск интерпретатора PHP. Но с TCP работать несколько сложнее.

AlexRyzh
Offline
Зарегистрирован: 11.11.2015

Нет смысла часто слать, нужно будет придумывать, чтоб 3 раза в час не более. а ТСР не знаю такого, нужно будет найти и почитать.

alexvs
Offline
Зарегистрирован: 22.07.2014

Я год назад, избежал данных проблем, т.к. изначально и MySQL и сайт были подняты на домашнем дисковом хранилище QNAP.

Туда же сливаю данные с дачного устройства через 3G модем и роутер.