Проблема с 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);
?>
@Lakshana, 👍-1
Обсуждение2 ответа
Проверьте правильность IP - адреса сервера и работоспособность сервера. Затем проверьте возвращаемое значение функции client.connect (). Если это 0, то, скорее всего, ваш сервер находится за брандмауэром. Если это так, разблокируйте сервер apache, чтобы пройти через него. У меня была похожая проблема с вампом.
Хотя 0 не является допустимым кодом возврата для client.connect() в соответствии с http://www.arduino.cc/en/Reference/ClientConnect , это странно возвращает 0. В любом случае это даст вам ключ к разгадке.
Также используйте класс IPAddress для назначения адреса сервера вместо использования char [].
Насколько я могу видеть, когда вы вызываете 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.
Изменить: добавлены дополнительные сведения
- avrdude ser_open() can't set com-state
- Float печатается только 2 десятичных знака после запятой
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Печать массива байтов на экране последовательного монитора Arduino IDE
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino IDE Отказано В Разрешении На Загрузку, Ubuntu
- Нет заголовочных файлов (.h) в Documents\Arduino\libraries\arduino_144469 с демонстрационным кодом
- Связь Arduino master/slave с использованием RS485
Откуда ты знаешь, куда он бежит? Какую продукцию он производит? Что вы пытались отладить? Почему вы останавливаете клиента дважды?, @tttapa
Также спрашивают по адресу: http://forum.arduino.cc/index.php?topic=525947 Если вы собираетесь это сделать, пожалуйста, будьте достаточно внимательны, чтобы добавить ссылки на другие места, которые вы разместили. Это позволит нам избежать потери времени из-за дублирования усилий, а также поможет другим, у кого есть те же вопросы, найти ваш пост и найти всю необходимую информацию., @per1234
попробуйте сменить ip на 127.0.0.1? может быть, попробовать NAT на вашем маршрутизаторе., @hary kusuma
Вы доказали, что отключили защиту брандмауэра? Это работает на меня., @enrique-es