Связка Mega 2560+W5100+php+MySQL
- Войдите на сайт для отправки комментариев
Здравствуйте. Была проблема с отправкой данных и наконец-то решилась.
Создаю пост, т.к. изучая тему, натыкался на форумах на подобную проблему. Но ничего внятного там не находил. И вот решил создать пост конкретно решенной проблемы, дабы уменьшить страдания других ищущих. (хотя "страдания" без пользы не проходят, многое понимаешь, многому учишься...).
Я поставил себе задачу: данные с Мега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')";
А дальше... это другая история, в которой будет немало непоняток и приключений, задач и их решений насколько позволит фантазия и возможности используемого!
Надеюсь это поможет начинающим (как я ) избежать много головной боли :)
Молодец!
Но расово верно делать, конечно, TCP туннель и в него кидать данные. Если часто будешь слать - будешь просто грузить сервер бестолку. Каждый запрос твоей ардуины порождает тред в апаче и отдельный запуск интерпретатора PHP. Но с TCP работать несколько сложнее.
Нет смысла часто слать, нужно будет придумывать, чтоб 3 раза в час не более. а ТСР не знаю такого, нужно будет найти и почитать.
Я год назад, избежал данных проблем, т.к. изначально и MySQL и сайт были подняты на домашнем дисковом хранилище QNAP.
Туда же сливаю данные с дачного устройства через 3G модем и роутер.