Онлайн-проблема подключения 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;
}
@tanjamaya, 👍3
Обсуждение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
Прежде всего, вы теперь подключены к SQL? Если да, то это все равно не работает... Вы пытались экранировать свой "
, поэтому вместо:
$SQL = "... VALUES ('".$_GET["serial"]."', '".$_GET["temperature"]."',...')";
делаю что-то вроде:
$SQL = "... VALUES ('\".$_GET[\"serial\"].\"', '\".$_GET[\"temperature\"].\"',...')";
Если это по-прежнему не работает, после отправки кода в SQL распечатайте на экране то, что вы фактически отправляете, скопируйте его с помощью мыши, вставьте в консоль phpadmin-sql и выполните. Там вы должны увидеть любые полезные советы о том, что происходит на самом деле. Надеюсь, это поможет!
- Использование YS-IRTM с Arduino Uno
- Как устранить сообщение об ошибке "assignment of function 'void digitalWrite (uint8_t, uint_8)"?
- Как преобразовать значения RGB в интенсивность
- Подключение датчика давления к Arduino для сбора данных о давлении и времени
- Как считать показания датчика звука и включить датчик с датчиком воды, если показания выше порогового значения и при обнаружении воды в течение 2 минут?
- Использовать Data Logger Shield с Arduino Sensor shield V5.0
- Как запрограммировать 2 ультразвуковых датчика, один на серводвигателе и один прикрепленный на передней стороне автомобиля?
- Датчики TFmini с Arduino
Почему все && в вашем 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