Онлайн-проблема подключения Arduino к базе данных MySQL

Я пытаюсь подключить Arduino к базе данных MySQL на своем онлайн-сервере.

Я управляю своим проектом для работы на WampServer локально на локальном хосте, но когда я пытаюсь переместить все в Интернет, у меня возникает проблема... на последовательном мониторе я получаю сообщение о том, что сервер подключен, и показания моего датчика, но я могу я не помещаю их в свою базу данных на своем онлайн-сервере.

Вот мой код:


dbconnect.php

<?php
$MyUsername = "*******";  //вводим свое имя пользователя для MySQL
$MyPassword = "*******%";  //вводим свой пароль для MySQL
$MyHostname = "*************";      // обычно это «localhost», если ваша база данных не находится на другом сервере

$dbh = mysql_pconnect($MyHostname , $MyUsername, $MyPassword);
$selected = mysql_select_db("tanjamayaarduino",$dbh);
?>

add_data.php

<?php
    // Подключаемся к MySQL
    include("dbconnect.php");

    // Подготавливаем оператор SQL
    $SQL = "INSERT INTO tanjamayaarduino.temperature (sensor ,celsius, light, moisture1, moisture2) VALUES ('".$_GET["serial"]."', '".$_GET["temperature"]."','".$_GET["light"]."','".$_GET["moisture1"]."','".$_GET["moisture2"]."')";     

    // Выполняем оператор SQL
    mysql_query($SQL);

    // Переходим к review_data.php (необязательно)
    header("Location: review_data.php");
?>

Код Arduino

#include<Ethernet.h>
#include<SPI.h>
const int temperaturePin = A3;    //LM35 Датчик температуры
const int lightPin = A2;          //Фоторезисторный датчик LDR
const int moisture1Pin = A4;          //Датчик влажности1
const int moisture2Pin = A5;          //Датчик влажности2

// **** НАСТРОЙКА ETHERNET ****
// Контакты Arduino Uno: 10 = CS, 11 = MOSI, 12 = MISO, 13 = SCK
// MAC-адрес Ethernet — должен быть уникальным в вашей сети — MAC считывает T4A001 в шестнадцатеричном формате (уникальный в вашей сети)
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x3A, 0xDC };
// Для остального используем DHCP (IP-адрес и т.п.)
IPAddress ip(192, 168, 2, 121);
EthernetClient client;
//IP-адрес сервера(192, 168, 2, 100); // IP-адрес (или имя) сервера, на который нужно сбросить данные
// IP-адрес (или имя) сервера для сброса данных (godaddy baza server 37.148.204.140) (Пользователь: [email protected]) (godaddy главный адрес на хостингот 188.121.46.1)
//IP-адрес сервера(188, 121, 46, 1);
char server[] = "188.121.46.1";


int  interval = 5000; // Ожидание между дампами

void setup() {

  Serial.begin(9600);
  while (!Serial) {
    ; // ждем подключения последовательного порта. Требуется только для Леонардо.
  }
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // нет смысла продолжать, поэтому ничего не делайте навсегда:
    // попробуйте настроить использование IP-адреса вместо DHCP:
    Ethernet.begin(mac, ip);
  }


  Serial.println("Tweaking4All.com - Temperature Drone - v2.0");
  Serial.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
  Serial.print("IP Address        : ");
  Serial.println(Ethernet.localIP());
  Serial.print("Subnet Mask       : ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("Default Gateway IP: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("DNS Server IP     : ");
  Serial.println(Ethernet.dnsServerIP());
}

void loop() {
  // если вы получите соединение, сообщите об этом через последовательный порт:
  if (client.connect(server, 80)==1) {
    float tem = getTemp();
    Serial.println( tem );
    float lig = getLight();
    Serial.println( lig );
    float mois1 = getMoisture1();
    Serial.println( mois1 );
    float mois2 = getMoisture2();
    Serial.println( mois2 );

    Serial.println("-> Connected");
    if (client.connected()) {
      // Делаем HTTP-запрос:
      client.print( "GET /advertacs/test/arproekt/add_data.php?");
      Serial.println("-> add_data");
      client.print("serial=");
      client.print( "TempSensor" );
      client.print("&&");
      client.print("temperature=");
      client.print( tem);
      Serial.println("-> add_temp");
      client.print("&&");
      client.print("light=");
      client.print( lig);
      Serial.println("-> add_light");
      client.print("&&");
      client.print("moisture1=");
      client.print( mois1);
      Serial.println("-> add_mois1");
      client.print("&&");
      client.print("moisture2=");
      client.print( mois2);
      Serial.println("-> add_moi2");

      client.println( " HTTP/1.1");
      client.println( "Host:" );
      client.println(server);
      client.println( "Connection: close" );
      client.println();
      client.println();
      client.stop();
    }
  }
  else {
    // у вас не было соединения с сервером:
    Serial.println("--> connection failed/n");
  }

  delay(interval);
}
float getTemp() {
  float temperatureC = (5.0 * analogRead(temperaturePin) * 100.0) / 1024; //преобразование цифрового диапазона от 0 до 1023 в диапазон от 0 до 5 вольт (каждое 1 показание равно ~ 5 милливольтам)
  return temperatureC;
}
float getLight() {
  float light;
  light = analogRead(lightPin) ;
  return light;
}

float getMoisture1() {
  float moisture1;
  moisture1 = analogRead(moisture1Pin) ;
  return moisture1;
}
float getMoisture2() {
  float moisture2;
  moisture2 = analogRead(moisture2Pin) ;
  return moisture2;
}

, 👍3

Обсуждение

Почему все && в вашем URL?, @Majenko

О, а знаете ли вы термин *Атака с помощью SQL-инъекции*?, @Majenko

Спасибо за советы по безопасности :), как мне грустно, я очень новичок в программировании, когда я использовал этот код локально без знаков "&&", он не работал, поэтому я поставил их... кстати, я пробую сейчас без "&&" поет все еще не работает... есть идеи?, @tanjamaya

Вам следует уменьшить && до &, а не удалять их полностью., @Majenko

ок, я удаляю его и... все равно не работает, @tanjamaya

Что говорят вам журналы вашего веб-сервера?, @Majenko

Мой сервер на Godaddy... в папке Acces Logs ничего за сегодняшний день нет... последний лог от 18.09.2015, @tanjamaya

Ну, тогда я бы сдался ;) Мы отошли от GoBadly, потому что они просто бесполезны. Поэтому отсутствие журналов, вероятно, означает отсутствие связи. Убедитесь, что вы действительно подключаетесь к правильному адресу и к нужной записи Host:, и если у вас есть технологии и навыки, некоторый анализ Ethernet может оказаться полезным., @Majenko

Хорошо, спасибо за все, буду стараться... может быть, у меня получится :(, @tanjamaya

После того, как Уэльс завершит сбор Урагая, я опробую ваш код в своей системе и проанализирую данные Ethernet, чтобы увидеть, что отправляется. Кстати, оберните все строковые литералы в _F()., @Majenko

Я только что заметил ошибку в вашем коде... println("Host: ");, @Majenko

ок... Я исправил в client.println("Host:188.121.46.1"); ... по-прежнему нет результата... просто для справки... IP-адрес моего сервера - это главный IP-адрес моего хостинга, когда я захожу в панель управления... а не числа, указанные в URL-адресе администратора (phpMyAdmin), потому что они разные, @tanjamaya

Нет, вы неправильно поняли мое указание на ошибку. Ошибка заключалась в использовании println вместо print, поэтому имя сервера (*не IP*) оказывалось на следующей строке и нарушало форматирование заголовка., @Majenko

по-прежнему нет результата... могу ли я отправить вам пользователя и пароль из моей базы данных на вашу электронную почту, чтобы вы могли это проверить?, @tanjamaya

Теперь я снова за компьютером и могу дать вам правильный ответ., @Majenko

Я вижу, что вы разместили этот вопрос в качестве ответа [здесь](http://arduinoprosto.ru/q/11730/dht11-with-mysql/16202#answer-16202), как пользователь [tanja](http ://arduino.stackexchange.com/users/13495/tanja), @Greenonline


2 ответа


2

В вашем коде есть две основные ошибки. Во-первых, это форматирование заголовков: вы по ошибке использовали client.println для отправки первой части заголовка Host:, поэтому он разделяется на две строки:

client.println( "Host:" );
client.println(server);

Во-вторых, вы используете IP-адрес сервера вместо фактического имени хоста в заголовке Host:. Это означает, что сервер не может определить, с каким веб-сайтом вы хотите связаться, и просто отклоняет ваш запрос.

Вам нужно что-то вроде:

client.print("Host: ");
client.println(servername);

где имя_сервера — это имя сервера (www.website.com), а не IP-адрес . Вы можете поместить все это в одну строку, если не хотите когда-либо менять название веб-сайта, поскольку его немного сложнее найти и редактировать:

client.println("Host: www.mywebsite.com");
,

Дорогой Маженко, не повезло, я сдаюсь :( Я перепробовал все, что вы мне сказали, но все равно безуспешно. Спасибо за ваши усилия, я пришлю вам информацию на вашу электронную почту., @tanjamaya

Внесение этих изменений сработало для меня локально. Итак, если вы внесли изменения правильно, то либо проблема с сервером, либо вы общаетесь не по тому адресу., @Majenko


1

Прежде всего, вы теперь подключены к SQL? Если да, то это все равно не работает... Вы пытались экранировать свой ", поэтому вместо:

$SQL = "... VALUES ('".$_GET["serial"]."', '".$_GET["temperature"]."',...')";

делаю что-то вроде:

$SQL = "... VALUES ('\".$_GET[\"serial\"].\"', '\".$_GET[\"temperature\"].\"',...')";

Если это по-прежнему не работает, после отправки кода в SQL распечатайте на экране то, что вы фактически отправляете, скопируйте его с помощью мыши, вставьте в консоль phpadmin-sql и выполните. Там вы должны увидеть любые полезные советы о том, что происходит на самом деле. Надеюсь, это поможет!

,