Проблема с client.connect()

Я использую сервер XAMPP(версия 7.2.1) на своем ПК для публикации данных датчика arduino на веб-странице. Я попробовал приведенный выше код, и он показывает такую ошибку, как:

Ethernet, настроенный через DHCP

Связывающий...

-->сбой подключения>

Я также следовал шагам, приведенным в этом https://forum.arduino.cc/index.php?topic=40448.0 но это не работает. Код выполняется до тех пор, пока client.connect() после этого не попадет в цикл if(client.connect(сервер,80)).

Экран Ethernet arduino получает IP-адрес от ПК с помощью микросхем. Я считаю, что проблема заключается в подключении arduino к локальному хосту, но я не знаю, как ее решить. Сервер XAMPP, похоже, работает правильно. Я проверил это по журналам.

Я также разместил сообщение по адресу https://forum.arduino.cc/index.php?topic=525947.0.

Надеюсь, кто-нибудь сможет мне помочь

Заранее спасибо

#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
DHT dht;
const int sensor_pin = A1;
unsigned int ldr;
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 33);
char server[] = "192.168.1.7"; // IMPORTANT: If you are using XAMPP you will have to find out the IP address of your computer and put it here (it is explained in previous article). If you have a web page, enter its address (ie. "www.yourwebpage.com")
EthernetClient client;

void setup() {
  Serial.begin(9600); // Serial.begin starts the serial connection between
  computer and Arduino
  Ethernet.begin(mac, ip);
  Serial.println("Ethernet configured via DHCP");
  delay(1000);
  dht.setup(2);
}

void loop() {
  delay(dht.getMinimumSamplingPeriod());  /* Delay of amount equal to sampling period */
  float soilmoisture;
  int sensor_analog;
  sensor_analog = analogRead(sensor_pin);
  soilmoisture = ( 100 - ( (sensor_analog / 1023.00) * 100 ) );
  float temperature = dht.getTemperature();
  float humidity = dht.getHumidity();
  ldr = analogRead(A0);

  Serial.println("Connecting...");
  // Connect to the server (your computer or web page)
  if (client.connect(server, 80)) {
    Serial.println("--> Connected");
    client.print("GET /write_data.php?"); // This
    client.print("temperature="); // This
    client.print(temperature); // And this is what we did in the testing section above. We are making a GET request just like we would from our browser but now with live data from the sensor
    client.print("&humidity="); // This
    client.print(humidity); // And this is what we did in the testing section above. We are making a GET request just like we would from our browser but now with live data from the sensor
    client.print("&soilmoisture="); // This
    client.print(soilmoisture); // And this is what we did in the testing section above. We are making a GET request just like we would from our browser but now with live data from the sensor
    client.println(" HTTP/1.1"); // Part of the GET request
    client.println("Host: 192.168.1.7"); // IMPORTANT: If you are using XAMPP you will have to find out the IP address of your computer and put it here (it is explained in previous article). If you have a web page, enter its address (ie.Host: "www.yourwebpage.com")
    client.println( "Content-Type: application/x-www-form-urlencoded" );
    client.println("Connection: close"); // Part of the GET request telling the server that we are over transmitting the message
    client.println(); // Empty line
    client.println(); // Empty line
  }
  else {
    // If Arduino can't connect to the server (your computer or web page)
    Serial.println("--> connection failed\n");
  }
  client.flush();
  client.stop();
  // Give the server some time to recieve the data and store it. I used 10 seconds here. Be advised when delaying. If u use a short delay, the server might not capture data because of Arduino transmitting new data too soon.
  delay(10000);
}

Мой PHP-код выглядит следующим образом:

<?php
// Prepare variables for database connection
$dbusername = "x";  // enter database username, I used "arduino" in step 2.2
$dbpassword = "y";  // enter database password, I used "arduinotest" in step 2.2
$server = "localhost"; // IMPORTANT: if you are using XAMPP enter "localhost", but if you have an online website enter its address, ie."www.yourwebsite.com"
$dbname = "arduinotest1";
// Connect to your database
$dbconnect = mysqli_connect($server, $dbusername, $dbpassword,$dbname);
if (!$dbconnect) {
    die("Database connection failed: " . mysqli_connect_error());
}
$dbselect = mysqli_select_db($dbconnect, "arduinotest1");
if (!$dbselect) {
    die("Database selection failed: " . mysqli_connect_error());
}
// Prepare the SQL statement
$sql = "INSERT INTO arduinotest1.tabletest2 (temperature,humidity,soilmoisture) VALUES ('".$_GET["temperature"]."','".$_GET["humidity"]."','".$_GET["soilmoisture"]."')";    
// Execute SQL statement
mysqli_query($dbconnect,$sql);
?>

, 👍-1

Обсуждение

Откуда ты знаешь, куда он бежит? Какую продукцию он производит? Что вы пытались отладить? Почему вы останавливаете клиента дважды?, @tttapa

Также спрашивают по адресу: http://forum.arduino.cc/index.php?topic=525947 Если вы собираетесь это сделать, пожалуйста, будьте достаточно внимательны, чтобы добавить ссылки на другие места, которые вы разместили. Это позволит нам избежать потери времени из-за дублирования усилий, а также поможет другим, у кого есть те же вопросы, найти ваш пост и найти всю необходимую информацию., @per1234

попробуйте сменить ip на 127.0.0.1? может быть, попробовать NAT на вашем маршрутизаторе., @hary kusuma

Вы доказали, что отключили защиту брандмауэра? Это работает на меня., @enrique-es


2 ответа


0

Проверьте правильность IP - адреса сервера и работоспособность сервера. Затем проверьте возвращаемое значение функции client.connect (). Если это 0, то, скорее всего, ваш сервер находится за брандмауэром. Если это так, разблокируйте сервер apache, чтобы пройти через него. У меня была похожая проблема с вампом.

Хотя 0 не является допустимым кодом возврата для client.connect() в соответствии с http://www.arduino.cc/en/Reference/ClientConnect , это странно возвращает 0. В любом случае это даст вам ключ к разгадке.

Также используйте класс IPAddress для назначения адреса сервера вместо использования char [].

,

2

Насколько я могу видеть, когда вы вызываете client.connect(сервер, 80), вы вызываете его с переменной char [], которая содержит char server[] = "192.168.1.7". И из кода библиотеки кажется, что он вызовет функцию с теми параметрами, которые попытаются разрешить dns, но не смогут этого сделать и вернут 0.

Он вызывает: int EthernetClient::connect(постоянный char* хост, порт uint16_t) ,
когда он должен вызывать: int EthernetClient::connect(IP-адрес ip, порт uint16_t)
Исходный код: https://github.com/arduino-libraries/Ethernet/blob/master/src/EthernetClient.cpp

Поэтому вам нужно изменить char server[] = "192.168.1.7"; на IP-адрес сервера(192,168,1,7); Таким образом, он вызовет правильную функцию подключения и не застрянет в dns.

Изменить: добавлены дополнительные сведения

,