Как Arduino Mega 2560+Wifi Shield 2.0 (SeeedStudio) может получать данные из базы данных на сервере XAMPP на моем ПК?

Я пытаюсь подключить Arduino Mega через Wi-Fi к моему серверу XAMPP. Моя основная цель — получить значение из моей базы данных и сохранить его в переменной в коде Arduino. С помощью этой новой переменной я смогу управлять остальной частью программы... Так что мне нужна ваша помощь. Кто-нибудь может дать мне совет?

Я уже перепробовал все, что нашел в Интернете, но ничего не работает.

Я думаю, что проще всего отправить GET-запрос на сервер и прочитать его ответ... Но по какой-то причине я не могу отправить GET-запрос через...

Я протестировал его непосредственно в браузере, и значение отображается, поэтому я думаю, что на стороне сервера все в порядке.

Вот мой код Arduino:

#include <Arduino.h>
#include <SoftwareSerial.h>
#include "WiFly.h"
#include "HTTPClient.h"

#define SSID      "mySSID"
#define KEY       "myKEY"
#define AUTH      WIFLY_AUTH_WPA2_PSK
#define HTTP_GET_URL "http://192.168.1.80/xampp/training/send_data_db.php/?temp=0"

// соединение пинов
// Ардуино WiFly
// 2 <----> Передача
// 3 <----> RX
SoftwareSerial uart(10, 11);
WiFly wifly(uart);
HTTPClient http;
char get;

void setup() {
  Serial.begin(9600);
  Serial.println("------- WIFLY HTTP --------");
  uart.begin(9600); // Скорость передачи WiFly UART: 9600
  // Подождите, пока WiFly запустится
  // задержка(3000);

  // проверяем, связан ли WiFly с точкой доступа (SSID)
  if (!wifly.isAssociated(SSID)) {
    while (!wifly.join(SSID, KEY, AUTH)) {
      Serial.println("Failed to join " SSID);
      Serial.println("Wait 0.1 second and try again...");
      delay(100);
    }
    wifly.save(); // сохранить конфигурацию,
  }
  Serial.println("\r\nTry to get url - " HTTP_GET_URL);
  Serial.println("------------------------------");
  while (http.get(HTTP_GET_URL, 10000) < 0) {
  }
  while (wifly.receive((uint8_t *)&get, 1, 1000) == 1) {
    Serial.print(get);
  }
  if (wifly.commandMode()) {
    Serial.println("\r\n\r\nEnter command mode. Send \"exit\"(with \\r) to exit command mode");
  }
}

void loop() {
  int c;
  while (wifly.available()) {
    c = wifly.read();
    if (c > 0) {
      Serial.write((char)c);
    }
  }
  while (Serial.available()) {
    c = Serial.read();
    if (c >= 0) {
      wifly.write((char)c);
    }
  }
}

А вот PHP-код:

<? php
include("./connection/database_connect.php");
include("./top_table.php");

if ((isset($_SESSION["ID"])) AND (isset($_GET["temp"]))) {
  $id = $_SESSION["ID"];
  $sql = "SELECT temp FROM perfil, client WHERE perfil.ID ='$id'";
  $consult = mysqli_query($connect, $sql);
  $result = mysqli_num_rows($consult);
  if (($result == 1)) {
    $person_data = mysqli_fetch_array($consult, MYSQLI_ASSOC);
    $temp = $person_data["temp"];
    header("HTTP/1.1" . " " . 200 . "OK");
    header("Content-Type: text/html; charset=UTF-8");
    header("Content-Length: 1112");
    header("Connection: close");
    header("/r/n");
    echo $temp;
  } else {
    //se user dosen't exist on data base
    header("Location: http://192.168.1.80/xampp/training/login.php");
    exit;
  }
} else {
  header("Location: http://192.168.1.80/xampp/training/login.php");
  exit;
}
?>

, 👍4

Обсуждение

Шаг 1: подтвердите, достигает ли запрос сервера Apache., @Majenko

Извините за задержку, но только сейчас увидел... Да, запрос доходит до сервера. Я попытался использовать более простой код, чтобы быть уверенным, что сервер отправляет ответ, но не то, что я хочу. Кажется, что $_GET['temp'] не установлен..., @Filipe Carrasquinho

php/?temp - мне это кажется "сомнительным". Должен ли там быть /?, @Majenko

Я так думаю, совсем недавно я заметил ошибку в этой строке, у меня там было "php/?$temp", и решил часть своей проблемы. Похоже , проблема в том, что $_SESSION недоступен. И, кроме того, моя веб-страница в браузере не реагирует, @Filipe Carrasquinho

Для $_SESSION нужны либо файлы cookie, либо параметр PHPSESSID=...., чего у вас, скорее всего, не будет., @Majenko

гм... это может быть проблемой, я только вхожу в систему пользователя в своем браузере и запускаю сеанс в "include('./top_table.php'), может быть, этого недостаточно. Я думал, что когда пользователь войдет в систему, я смогу использовать его $_SESSION, но, похоже, нет... Меняет ли PHPSESSID новый сеанс? если да, я не думаю, что смогу использовать его в коде Arduino в качестве переменной. Что я должен делать? зарегистрировать arduino вместе с информацией о человеке/доме? С этим я мог бы получить доступ к идентификатору человека и связаться с «temp», @Filipe Carrasquinho

PHPSESSID — это уникальный ключ, идентифицирующий сеанс. Он выделяется PHP при открытии сеанса и должен возвращаться обратно в PHP с каждым запросом, чтобы иметь возможность доступа к сеансу. Что вы можете сделать, так это выполнить двухэтапное действие входа в систему, когда вы сначала переходите на страницу входа, которая возвращает ваш идентификатор сеанса, а затем вы делаете свой обычный (и все последующие) запросы, включая идентификатор сеанса., @Majenko

Филипе, мне нужна твоя помощь. Можете ли вы помочь мне из этого! Мне нужно хранить данные датчика напряжения от arduino mega с помощью щита на локальном сервере. Пожалуйста, свяжитесь со мной по адресу [email protected] Спасибо за ваше время., @Partha S. Kundu


2 ответа


1

Вы должны забыть о $_SESSION["ID"]; на стороне PHP, потому что вы работаете без сохранения состояния без сеанса! Вы должны указать параметр для идентификации вашей переменной от arduino до скрипта php - это temp=0? Если это так, вам нужно обменять

$sql="SELECT temp FROM perfil, client WHERE perfil.ID ='$id'";

с

$sql="SELECT temp FROM perfil, client WHERE perfil.ID =" . $_GET["temp"];

предполагается, что perfil.id является целым числом. Если это строка, добавьте "'".

,

0

Да, вы правы!

Тем временем я закончил этот проект.

Проблема была связана с экраном Wi-Fi, который я использовал. Запрос Http был в неправильном формате.

,