Отправка данных 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>&nbsp;Timestamp&nbsp;</td>
            <td>&nbsp;Data&nbsp;</td>
            <td>&nbsp;Serial Number&nbsp;</td>

        </tr>

      <?php 
          if($result!==FALSE){
             while($row = mysql_fetch_array($result)) {
                printf("<tr><td> &nbsp;%s </td><td> &nbsp;%s&nbsp; </td><td> &nbsp;%s&nbsp; </td></tr>", 
                   $row["timeStamp"], $row["data"], $row["serial_number"]);
             }
             mysql_free_result($result);
             mysql_close();
          }
      ?>

   </table>
</body>
</html>

, 👍0


3 ответа


Лучший ответ:

1

В вашем коде 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, совершенно не связано с именами переменных, которые у вас есть слева от знака =: это действительно разные вещи!

,

0

Данные = 10 — это не символы, составляющие 1 и 0, а символ ascii со значением 10, ваш php-скрипт этого не понимает. Попробуйте использовать функцию itoa, чтобы сделать массив символов 1 и 0 для понимания вашего php.

,

0

Вы получаете отметку времени запуска файла php. Это не означает, что в $data или $serialnmber есть число. Что произойдет, если вы заполните значение в своем файле php вместо переменных $data и $serialnmber. Если база данных заполняется, вы знаете, что ваши переменные были пусты. Если они не заполнены, что-то не так в вашем коде php

,