Нестабильная работа Arduino+W5100

Вячеслав21
Offline
Зарегистрирован: 29.05.2015

Доброго времени суток. Приобрел у китайцев 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) Как с подобным боросться. Хочется более стабильную работу. 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Я бы на месте сервера тоже посылал такого клиента переодически. Ибо какого фига он из себя изображает ddos атаку.

Вячеслав21
Offline
Зарегистрирован: 29.05.2015

Puhlyaviy пишет:
Я бы на месте сервера тоже посылал такого клиента переодически. Ибо какого фига он из себя изображает ddos атаку.

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

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Вот вы типа щас поржать? Посмотрите на свой код. Что он делает? 100500 раз в секунду долбит сервер. ЗАЧЕМ?

Вячеслав21
Offline
Зарегистрирован: 29.05.2015

Я понял, что вы имеете ввиду и добавил задержку.  

{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
  delay(1000);
}

не помогло.

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Попробуйте побольше задержку 10 секунд например. Никто не знает что у вас за сервер и чем он там занят

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013
Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Так запрос же из 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. мервер Гугла повеселил :)

Вячеслав21
Offline
Зарегистрирован: 29.05.2015

Спасибо за ответ.  Может вы посоветуете, что сделать, чтобы "все работало". 

есть скрипт 

<?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");
        }
    }
}

И скрин монитора 

Перепробовал различные вариации. Подскажите, как с этим бороться

Вячеслав21
Offline
Зарегистрирован: 29.05.2015

Проблема может быть в роутере? Перед началом действий я пингую ардуино (ping 192.168.1.3 -n 100), когда непосредственно вызываю монитор порта пропадает соединение секунд на 10. Потом происходит подключение к серверу, ардуино пингуется нормально. Но client.connected ВСЕГДА 0. Сервер на ubuntu. Вчера только переустановил, стоит только LAMP.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

А что не работает то?

Вячеслав21
Offline
Зарегистрирован: 29.05.2015

Не могу получить данные из mysql базы GET запросом. client.connected постоянно возвращает 0

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

вариантов много. может рутер не пускает, может сервер не принимает, может мак "левый", может айпишник уже занят.

Вячеслав21
Offline
Зарегистрирован: 29.05.2015

ip для данного мака присваивается в обход DHCP . А у сервера есть какой нибудь родной брендмауэр, который может не пускать.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Откуда нам знать про настройки Вашего сервера?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
Вячеслав, функции типа "connect()" и т.п. возвращают не просто "успех/неудача", а вполне информативные коды. Например тот же connect() возвращает.
 
Returns an int (1,-1,-2,-3,-4) indicating connection status :
SUCCESS 1
TIMED_OUT -1
INVALID_SERVER -2
TRUNCATED -3
INVALID_RESPONSE -4
 
Вы бы печатали эти коды вместо безликого сообщения "failed". И Вам было бы понятнее почему именно failed, да и нам тоже.
 
Кстати, мне любопытно, а что делает 
 
delay(1000); 
 
в самом начале функции setup()? Для чего там delay() ?
 
Вячеслав21
Offline
Зарегистрирован: 29.05.2015

А вы случайно не подскажите,  если client.connect(serv, port) возвращат -5, что это может означать?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Вячеслав21 пишет:

А вы случайно не подскажите,  если client.connect(serv, port) возвращат -5, что это может означать?

Судя по описанию - так не бывает.

https://www.arduino.cc/en/Reference/ClientConnect

С правами доступа на сервере все в порядке?

Вы уверены, что ваш скрипт работает корректно? Браузеры могут некоторые ошибки прощать...

Вы уверены, что причина не в вашем странном мас-адресе? Может попробуйте обычный...

Вячеслав21
Offline
Зарегистрирован: 29.05.2015

Gippopotam, если Вас не затруднит, не могли бы вы оставить какие нибудь контакты для связи, чтобы писать Вам напрямую. 

Вячеслав21
Offline
Зарегистрирован: 29.05.2015

Данный пример адекватно работает. Каждый 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
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Вячеслав21 пишет:

Gippopotam, если Вас не затруднит, не могли бы вы оставить какие нибудь контакты для связи, чтобы писать Вам напрямую. 

StudioGippopotam@gmail.com