Нестабильная работа Arduino+W5100
- Войдите на сайт для отправки комментариев
Чт, 02/07/2015 - 01:43
Доброго времени суток. Приобрел у китайцев Arduino Mega с W5100. Залил скетч
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };
byte ip[] = { 192, 168, 1, 3 };
byte server[] = { 192, 168, 1, 2 }; // Google
EthernetClient client;
void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);
delay(1000);
Serial.println("connecting...");
if (client.connect(server, 80)) {
Serial.println("connected");
client.println("GET /test2.php");
client.println();
} else {
Serial.println("connection failed");
}
}
void loop()
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
for(;;)
;
}
}
В некоторый случаях arduino подключается к базе данных и обрабатывает php скрипт, а в некоторых выдает "connection failed".
Собственно вопросы:
1) От чего это может зависить?
2) Как с подобным боросться. Хочется более стабильную работу.
Я бы на месте сервера тоже посылал такого клиента переодически. Ибо какого фига он из себя изображает ddos атаку.
Будьте добры, подскажите, как правильно сделать запрос? Или ссылочкой поделитесь. И если можите подскажите, почему при открытии монитора последовательного порта происходит переподключение arduino к серверу.
Вот вы типа щас поржать? Посмотрите на свой код. Что он делает? 100500 раз в секунду долбит сервер. ЗАЧЕМ?
Я понял, что вы имеете ввиду и добавил задержку.
{ if (client.available()) { char c = client.read(); Serial.print(c); } if (!client.connected()) { Serial.println(); Serial.println("disconnecting."); client.stop(); for(;;) ; } delay(1000); }не помогло.
Попробуйте побольше задержку 10 секунд например. Никто не знает что у вас за сервер и чем он там занят
http://forum.arduino.cc/index.php?topic=146838.15
Так запрос же из Setup() отправляется. В loop() только ответ от сервера слушается. Это не напрягает сервер.
Попробуйте не назначать IP Ардуинке, пусть роутер сам назначает.
if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); }А запрос отправляйте в таком виде:
client.println("GET /test2.php HTTP/1.0"); client.println(); delay (1000);P.S. мервер Гугла повеселил :)
Спасибо за ответ. Может вы посоветуете, что сделать, чтобы "все работало".
есть скрипт
<?php //адрес хоста $dbhost = 'localhost'; //Имя пользовтаеля $dbuser = 'root'; //пароль для подключения к Mysql $dbpass = '******'; //имя базы данных $dbname = 'test'; //устанавливаем подключение к MySQL $connect = mysql_connect($dbhost, $dbuser, $dbpass); // проверяем состояние подключения if(! $connect ) { die('Could not connect: ' . mysql_error()); } // Выбираем базу данных mysql_select_db ($dbname, $connect); $sql = mysql_query("SELECT q FROM test3"); $myrow = mysql_fetch_array($sql); echo ( $myrow['q']."\n"); ?>Есть скетч для отладки.
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}; char server[] = {192, 168, 1, 2}; IPAddress ip(192,168,1,3); EthernetClient client; int val; String currentLine = ""; void setup() { Serial.begin(9600); /*if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP");*/ Ethernet.begin(mac, ip); } void loop() { if (Serial.available()) { val = Serial.read(); if (val == '1') { Serial.println("connecting to server..."); if (client.connect(server, 80)) { Serial.println("making HTTP request..."); // Создаем GET HTTP-запрос client.println("GET /test2.php HTTP/1.0"); // client.println("HOST: 192.168.1.44"); client.println(); delay(1000); // while (client.connected()) { Serial.println("All right"); if (client.available()) { // считываем полученные байты: char inChar = client.read(); //Serial.println(inChar); // добавляем полученные байты в конец строки: currentLine += inChar; } else Serial.println("NO"); // } // Serial.println("All bad"); Serial.println(currentLine); client.stop(); } else Serial.println("NO connected"); } } }И скрин монитора
Перепробовал различные вариации. Подскажите, как с этим бороться
Проблема может быть в роутере? Перед началом действий я пингую ардуино (ping 192.168.1.3 -n 100), когда непосредственно вызываю монитор порта пропадает соединение секунд на 10. Потом происходит подключение к серверу, ардуино пингуется нормально. Но client.connected ВСЕГДА 0. Сервер на ubuntu. Вчера только переустановил, стоит только LAMP.
А что не работает то?
Не могу получить данные из mysql базы GET запросом. client.connected постоянно возвращает 0
вариантов много. может рутер не пускает, может сервер не принимает, может мак "левый", может айпишник уже занят.
ip для данного мака присваивается в обход DHCP . А у сервера есть какой нибудь родной брендмауэр, который может не пускать.
Откуда нам знать про настройки Вашего сервера?
А вы случайно не подскажите, если client.connect(serv, port) возвращат -5, что это может означать?
А вы случайно не подскажите, если client.connect(serv, port) возвращат -5, что это может означать?
Судя по описанию - так не бывает.
https://www.arduino.cc/en/Reference/ClientConnect
С правами доступа на сервере все в порядке?
Вы уверены, что ваш скрипт работает корректно? Браузеры могут некоторые ошибки прощать...
Вы уверены, что причина не в вашем странном мас-адресе? Может попробуйте обычный...
Gippopotam, если Вас не затруднит, не могли бы вы оставить какие нибудь контакты для связи, чтобы писать Вам напрямую.
Данный пример адекватно работает. Каждый 10 секунд пишет в базу значение.
<?php //адрес хоста $dbhost = 'localhost'; //Имя пользовтаеля $dbuser = 'root'; //пароль для подключения к Mysql $dbpass = '***; //имя базы данных $dbname = 'test'; // получение значения переменной температура $val = $_GET["val"]; $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); //Отправляем данные в таблицу $sql = "INSERT INTO pin2 VALUES (NOW(),'$val', '$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 <Ethernet.h> #include <SPI.h> #include <math.h> #include <stdlib.h> byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }; byte ip[] = { 192, 168, 1, 3 }; //IP адрес сервера который будет собирать статистику byte server[] = { 192, 168, 1, 2 }; EthernetClient client; void setup() { pinMode(9, INPUT); Ethernet.begin(mac, ip); // Для отладки включим отправку данных в COM порт Serial.begin(9600); } void loop() { int val; val = 1+rand()%10; //int val = digitalRead(9); //int l = analogRead(A0); String msg = "GET /test.php?val="+ String(val); // Для отладки включим отправку данных в COM порт Serial.println(msg); // Если это не требуется, то можно закомментировать int s = client.connect(server, 80); Serial.println(s); client.println(msg); //Ждем 2 сек. delay (2000); //потом отключаемся client.stop(); //Данные будут отправляться каждые 10 сек, выше мы уже подождали 2 сек, подождем еще 8 сек. delay (8000); }Gippopotam, если Вас не затруднит, не могли бы вы оставить какие нибудь контакты для связи, чтобы писать Вам напрямую.
StudioGippopotam@gmail.com