Отправка данных Arduino через Ethernet на сервер PHP.
В настоящее время у меня возникают трудности с отправкой данных из Arduino с помощью ethernet-экрана в базу данных PHP в MySQL. Моя проблема заключается в том, что кажется, что сервер получает данные, поскольку есть отметка времени, когда я отправляю их с Arduino, однако другие значения, которые он получает, неверны (см. Изображения ниже). Сервер говорит, что значения «data» и «serial_number» равны 0, но они должны быть 10 и 24. Наряду с этим Arduino сообщает, что данные были успешно отправлены. Мой код как для сервера, так и для Arduino указан ниже. Любые идеи о том, как исправить это или что происходит, очень ценятся.
Код Arduino:
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x00, 0xAB, 0xBA, 0xBC, 0xDD, 0x02 };
EthernetClient client;
String data;
int t;
int h;
void setup() {
Serial.begin(9600);
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
}
Serial.println("still working here");
}
void loop() {
t = 10;
h = 24;
data = "temp1=";
data.concat(t);
data.concat("&hum1=");
data.concat(h);
if (client.connect("www.smartwater.x10host.com",80)) {
Serial.println(data);
client.print("POST /add.php HTTP/1.1\n");
client.print("Host: www.smartwater.x10host.com\n");
client.print("Connection: close\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(data.length());
client.print("\n\n");
client.print(data);
Serial.println("Successfull");
}
if (client.connected()) {
client.stop();
}
delay(20000);
}
add.php (код сервера)
<?php
include("connect.php");
$link=Connection();
$temp1=$_POST["data"];
$hum1=$_POST["serial_number"];
$query = "INSERT INTO `Main` (`data`, `serial_number`)
VALUES ('".$temp1."','".$hum1."')";
mysql_query($query,$link);
mysql_close($link);
header("Location: index.php");
?>
connect.php (код сервера)
<?php
function Connection(){
$server="localhost";
$user="smartwat_arduino";
$pass="*****";
$db="smartwat_Main";
$connection = mysql_connect($server, $user, $pass);
if (!$connection) {
die('MySQL ERROR: ' . mysql_error());
}
mysql_select_db($db) or die( 'MySQL ERROR: '. mysql_error() );
return $connection;
}
?>
index.php (код сервера)
<?php
include("connect.php");
$link=Connection();
$result=mysql_query("SELECT * FROM `Main` ORDER BY `timeStamp` DESC",$link);
?>
<html>
<head>
<title>Data</title>
</head>
<body>
<h1>Stuff</h1>
<table border="1" cellspacing="1" cellpadding="1">
<tr>
<td> Timestamp </td>
<td> Data </td>
<td> Serial Number </td>
</tr>
<?php
if($result!==FALSE){
while($row = mysql_fetch_array($result)) {
printf("<tr><td> %s </td><td> %s </td><td> %s </td></tr>",
$row["timeStamp"], $row["data"], $row["serial_number"]);
}
mysql_free_result($result);
mysql_close();
}
?>
</table>
</body>
</html>
@Z_F, 👍0
3 ответа
Лучший ответ:
В вашем коде Arduino вызов функции, которая отправляет реальные данные в вызове HTTP-POST, выглядит следующим образом:
[...]
client.print(data);
[...]
При выполнении содержимое переменной data
отправляется на сервер.
Предположим, что data
— это объект String
, тогда data.concat()
— это эта функция, позволяющая "... String, string, char, byte, int, unsigned int, long, unsigned long, float , double..." в качестве аргумента.
Итак, после выполнения данные
должны содержать:
temp1=10&hum1=24
и именно такой контент передается через POST
в сценарий /add.php
.
По сути, вы передаете две переменные с именами "temp1" и "hum1". Пожалуйста, обратите внимание на имена этих переменных!
Теперь переключим скрипт PHP, где у вас есть:
[...]
$temp1=$_POST["data"];
$hum1=$_POST["serial_number"];
[...]
В двух приведенных выше инструкциях PHP запрашивается с помощью функции $_POST
содержимое двух переменных data и serial_number.
Поскольку такие переменные не определены (вы передали переменные temp1
и hum1
), PHP рассматривает их как 0
и, таким образом, присвойте 0 значениям $temp1
и $hum1
.
Держу пари, что для решения вашей проблемы вам нужно всего лишь изменить вышеприведенный PHP с помощью:
[...]
$temp1=$_POST["temp1"];
$hum1=$_POST["hum1"];
[...]
Кстати: обратите внимание, что то, что находится внутри вызова $_POST, совершенно не связано с именами переменных, которые у вас есть слева от знака =
: это действительно разные вещи!
Данные = 10 — это не символы, составляющие 1 и 0, а символ ascii со значением 10, ваш php-скрипт этого не понимает. Попробуйте использовать функцию itoa, чтобы сделать массив символов 1 и 0 для понимания вашего php.
Вы получаете отметку времени запуска файла php. Это не означает, что в $data или $serialnmber есть число. Что произойдет, если вы заполните значение в своем файле php вместо переменных $data и $serialnmber. Если база данных заполняется, вы знаете, что ваши переменные были пусты. Если они не заполнены, что-то не так в вашем коде php
- Простая веб-страница с Ethernet-шилдом Arduino на SD-карте
- Ethernet Shield не подключается
- Как получить данные из базы данных моего сервера в переменную в моем Arduino?
- Клиент MQTT на Arduino + SIM900
- Удаленная загрузка кода на плату Arduino через интернет
- Arduino Ethernet shield server и клиент одновременно
- Есть ли тайм-аут для Ethernet.begin?
- Как создать сервер сокетов Arduino для получения сообщений