Ардуино webClient - Локальный сервер

Тема в разделе "Arduino & Shields", создана пользователем alexdoronin95, 31 окт 2017.

  1. alexdoronin95

    alexdoronin95 Нуб

    Здравствуйте уважаемые форумчание!
    Очень прошу Вашей помощи! Очеень хочу научится получать данные о температуре и влажности на локальном сервере ( на ноутбуке - Open Server 5/2/2) используя ардуино как вебКлиент. Сервер есть, связь настроил, но есть одно НО.
    В базе данных, в которую записываются значения о темп. и влажн. полученные от ардуино - записываются нули.
    Уже не знаю что и думать и куда смотреть...
    ВСе файлы прилагаю.
    sketch^
    Код (C++):
    #include <SPI.h>
    #include <Ethernet.h>
    #include "DHT.h"
    //Константы
    #define DHTPIN 2
    #define DHTTYPE DHT11
    DHT dht(DHTPIN, DHTTYPE);
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
    EthernetClient client;
    //Переменные
    unsigned long int timeConn = millis();      // Частота отправки данных о t/h на сервер
    float h;                                    // Значение температуры
    float t;                                    // Значение влажности
    IPAddress server(192,168,1,2);
     

    /*--------------------------------------------------------------
    Необходимые настройки
    --------------------------------------------------------------*/

    void setup()
    {
      //Старт
      Serial.begin(9600);
      Ethernet.begin(mac);
      dht.begin();
    }
    /*--------------------------------------------------------------
    Основное тело программы
    --------------------------------------------------------------*/

    void loop()
    {
      h = dht.readHumidity();
      t = dht.readTemperature();
      if (millis() - timeConn > 2000) {
        sendData();
        timeConn = millis();
      }
    }
    /*--------------------------------------------------------------
    Функция отправляет данные о температуре и влажности на
    WEB сервер.
    --------------------------------------------------------------*/

    void sendData() {
      client.connect(server, 80);
      client.print( "GET /parser.php? ");
      client.print("t=");
      client.print(t);
      client.print("&");
      client.print("h=");
      client.print(h);
      client.println(" HTTP/1.1");
      client.print( "Host: " );
      client.println(server);
      client.println( "Connection: close" );
      client.println();
      client.println();
      client.stop();
      client.flush();
      }
    parser.php
    PHP:
    <?php

    ini_set("display_errors",1);
    error_reporting(E_ALL);

    $db_host = "192.168.1.2";
    $db_user = "alex";
    $db_pass = "Mc19bR73";
    $db_name = "home";

    define('DB_HOST',$db_host);
    define('DB_USER',$db_user);
    define('DB_PASS',$db_pass);
    define('DB_NAME',$db_name);

    $link = mysql_connect(DB_HOST, DB_USER, DB_PASS);
    if(!$link) die ("Невозможно подключиться к базе данных!");
    mysql_select_db(DB_NAME);

    $temp=$_GET['t'];
    $hum=$_GET['h'];

    $query = "INSERT INTO `room` (`time`, `temp`, `hum`)
    VALUES ('"
    .time()."', '".$temp."','".$hum."')";


    if(!mysql_query($query))
    echo "ошибка при записи в БД!";
    mysql_close($link);
    ?>
    Таблица в бд куда все записывается:
    Код (Text):

    --
    -- Структура таблицы `room`
    --

    CREATE TABLE IF NOT EXISTS `room` (
      `id` mediumint(9) NOT NULL,
      `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `temp` float NOT NULL,
      `hum` float NOT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=396 DEFAULT CHARSET=utf8;
    Очень надеюсь на Вашу помощь!
     

    Вложения:

  2. rkit

    rkit Гуру

    С SQL так нельзя работать. Это ошибочный код, который ведет к уязвимости приложения и битой базе данных. Используйте движок sql, поддерживающий подстановки, Например
    mysqli с mysqli->prepare()->bind_param()
     
  3. ИгорьК

    ИгорьК Гуру

    Есть некоторый шанс, что кто-то знает и Ардуино и php и mysql одновременно и к этому захочет въезжать в ваше творение.
    И пока этот кто-то здесь объяаится, вот что посоветую.

    Ваша задача состоит из трех элементов.
    Найдите сами хотя бы в каком элементе затык.

    Двигайтесь от конца к началу.

    1. Убедитесь, что база данных настроена правильно и из консоли данные в нее заходят правильными запросами. Запомните эти запросы. Научитесь работать с mysql через консоль ( если не умеете)

    2. Убедитесь, что php страница правильно формирует такие запросы - сделайте входящие от get запроса переменные константами и просто вызывайте эту страницу.

    3. Убедитесь, что правильный get запрос обрабатывается правильно - сформируйте его не от ардуино, а через браузер.

    4. Если все правильно - ищите что не так отправляет ардуино и отправляет ли что то. Используйте сериал для контроля.

    Это общий ход мыслей. Глубже думать не умею в отличие от предыдущего выступающего.
     
    Последнее редактирование: 31 окт 2017
    arkadyf нравится это.
  4. chandlerMbing

    chandlerMbing Нерд

    1) попробуйте вместо time() использовать date("Y-m-d H:i:s");
    $time = date("Y-m-d H:i:s");

    2) Для проверки того, что "долетает" до скрипта добавьте:
    echo $time."\n";
    echo $temp."\n";
    echo $hum."\n";

    3) Как php стоит на сервере? Если меньше 4.1, то проблема может быть в том, что раньше переменные через get запрос обрабатывались не через массив _GET, а напрямую т.е. в вашем случае $t и $h.
     
    arkadyf нравится это.