Waarde in database opslaan (localhost) d.m.v. ethernetshield

Arduino shields
Gebruikers-avatar
Berichten: 4877
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Waarde in database opslaan (localhost) d.m.v. ethernetsh

Berichtdoor nicoverduin » 15 Jan 2017, 14:09

Soms moet je ff terug naar de basis:
a) ik heb ff XAMPP gedownload en geinstalleerd. Die zet een lokale server (Apache) op je PC.
Binnen xampp/htdocs komen je webserver applicaties. Ik de volgende add.php script erin gezet :
cpp code
<?php
$data=""; // maak de ontvangst variabele leeg
if(isset($_GET["data_sent"])) { // alleen als er data is meegegeven voeren we dit uit
echo "ok";
$data = $_GET["data_sent"]; // parameter ophalen
echo '<br />'; // beetje tierelantijntjes
echo '________';
echo '<br />';
echo $data; // output de parameter
echo '<br />';
echo '_';
} else {
echo "Geen parameter binnen gekregen"; // spreekt voor zich
}
?>

Je ziet dat ik die al iets heb veranderd.
Als ik nu in mijn browser dit zet :
cpp code
http://127.0.0.1/add.php?data_sent=12345


krijg ik de volgende output:
cpp code
ok
________
12345
_

Dit werkt dus. Nu kijken of het via de Arduino werkt.
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

Gebruikers-avatar
Berichten: 4877
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Waarde in database opslaan (localhost) d.m.v. ethernetsh

Berichtdoor nicoverduin » 15 Jan 2017, 16:13

Nu de Get met een nodeMCU (Ik gebruik nl een Arduino Wifi meer). Dit mag overigens geen verschil maken maar probeer het maar. Ik heb add.php in de root van een van mijn subdomeinen gezet op het internet. Dus een externe server. Verder een ino van Adafruit aangepast en wat meer voor de beginner leesbaar gemaakt.
script add.php:
cpp code
<?php
$data=""; // maak de ontvangst variabele leeg
//
// controleer eerst of onze data is doorgestuurd
//
if(isset($_GET["data_sent"])) {
$data = $_GET["data_sent"]; // parameter ophalen
$returnString = $data;
} else {
//
// fout boodschap
//
$returnString = "Geen parameter binnen gekregen"; // spreekt voor zich
}
//
// geef het resultaat terug
//
echo $returnString;
?>


De aangepaste sketch. Let er wel op dat we in dit voorbeeld nog steeds met GET werken. POST is de volgende stap

cpp code
/*
* This sketch sends data via HTTP GET requests to a server
* Original souce code from Sparkfun
*
*
*/

#include <ESP8266WiFi.h>

//#define DEBUG // uncomment als je dubug info wil
//
// door gebruiker in te vullen ssid en pw
//
const char* ssid = "xxxxxxx";
const char* password = "xxxxxxxx";
//
// in dit voorbeeld laten we een teller oplopen en via de webserver tonen
// op de serial
//
uint8_t value = 0;
const char* host = "xxxxxxxxxxxxxxxxx"; // ip adres of dns
const char* scriptName = "add.php"
;/**
* Initieren van het programma
*/
void setup() {
Serial.begin(115200);
//
// verbinding maken met het lokale WiFi netwerk
//
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

/* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
would try to act as both a client and an access-point and could cause
network-issues with your other WiFi-devices on your WiFi-network. */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
//
// in principe blijft de node oneindig proberen een verbinding te maken met het
// netwerk. Bij mij is het rond de 10 seconden
//
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//
// verbinding is gemaakt dus ff de lezer informeren
//
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
/**
* Eindeloze lus
*/
void loop() {
//
// een keer per 5 seconden ff iets doen
//
delay(1000);
++value;
//
// kijken of we een verbinding met de server krijgen
//
#ifdef DEBUG
Serial.print("connecting to ");
Serial.println(host);
#endif
//
// Use WiFiClient class to create TCP connections
//
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
//
// nu de rest van de browser regel opbouwen
//
String url = "/";
url += scriptName;
url += "?data_sent=";
url += value;
#ifdef DEBUG
Serial.print("Requesting URL: ");
Serial.println(url);
#endif
//
// de URL wordt naar de server gestuurd met allerlei relevante info
//
client.print(
String( "GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");

unsigned long timeout = millis();
//
// als we binnen 5 seconden niet hebben ontvangen gaat er iets anders verkeer
//
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
//
// lees elke regel die we terugkrijgen
//
boolean printenOverslaan = true; // alleen de data printen
while (client.available()) {
String line = client.readStringUntil('\r');
//
// alleen printen als we de header achter de rug hebben
//
if (!printenOverslaan) {
Serial.print(line);
}
//
// wachten totdat we een lege regel ontvangen
//
if (line.length() == 1) {
printenOverslaan = false;
}
}
//
// en klaar
//
#ifdef DEBUG
Serial.println();
Serial.println("closing connection");
#endif
}
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 4877
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Waarde in database opslaan (localhost) d.m.v. ethernetsh

Berichtdoor nicoverduin » 15 Jan 2017, 16:55

En dan met POST. Kan zeker nog verder verbeterd worden door constanten in flash te knikkeren ed.
Script:
cpp code
<?php
$data=""; // maak de ontvangst variabele leeg
//
// controleer eerst of onze data is doorgestuurd
//
if(isset($_POST["data_sent"])) {
$data = $_POST["data_sent"]; // parameter ophalen
$returnString = $data;
} else {
//
// fout boodschap
//
$returnString = "Geen parameter binnen gekregen"; // spreekt voor zich
}
//
// geef het resultaat terug
//
echo $returnString;
?>


En de sketch:

cpp code
/*
* This sketch sends data via HTTP GET requests to a server
* Original souce code from Sparkfun
*
*
*/

#include <ESP8266WiFi.h>

//#define DEBUG // uncomment als je dubug info wil
//
// door gebruiker in te vullen ssid en pw
//
const char* ssid = "xxxxxxxxxxxx";
const char* password = "xxxxxxxxxxxxxx";

//
// in dit voorbeeld laten we een teller oplopen en via de webserver tonen
// op de serial
//
uint8_t value = 0;
const char* host = "ip adres of dns";
const char* scriptName = "add.php";
//
// vaste url gegevens
//
String url = "POST /" +
String(scriptName) +
" HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"User-Agent: Arduino/1.0\r\n" +
"Connection: close\r\n" +
"Content-Type: application/x-www-form-urlencoded;\r\n" +
"Content-Length: ";



/**
* Initieren van het programma
*/
void setup() {
Serial.begin(115200);
//
// verbinding maken met het lokale WiFi netwerk
//
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

/* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
would try to act as both a client and an access-point and could cause
network-issues with your other WiFi-devices on your WiFi-network. */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
//
// in principe blijft de node oneindig proberen een verbinding te maken met het
// netwerk. Bij mij is het rond de 10 seconden
//
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//
// verbinding is gemaakt dus ff de lezer informeren
//
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
/**
* Eindeloze lus
*/
void loop() {
//
// een keer per 5 seconden ff iets doen
//
delay(1000);
++value;
//
// kijken of we een verbinding met de server krijgen
//
#ifdef DEBUG
Serial.print("connecting to ");
Serial.println(host);
#endif
//
// Use WiFiClient class to create TCP connections
//
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
//
// nu de rest van de browser regel opbouwen
//
String data = "data_sent=" + String(value);
//
// en versturen
//
String urlRegel = url + data.length() + "\r\n\r\n";
urlRegel += data;

#ifdef DEBUG
Serial.print("Requesting URL: ");
Serial.println(urlRegel);
#endif
//
// de URL wordt naar de server gestuurd met allerlei relevante info
//
client.println(urlRegel);

unsigned long timeout = millis();
//
// als we binnen 5 seconden niet hebben ontvangen gaat er iets anders verkeer
//
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
//
// lees elke regel die we terugkrijgen
//
boolean printenOverslaan = true; // alleen de data printen
while (client.available()) {
String line = client.readStringUntil('\r');
//
// alleen printen als we de header achter de rug hebben
//
if (!printenOverslaan) {
Serial.print(line);
}
//
// wachten totdat we een lege regel ontvangen
//
if (line.length() == 1) {
printenOverslaan = false;
}
}
//
// en klaar
//
#ifdef DEBUG
Serial.println();
Serial.println("closing connection");
#endif
}
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 118
Geregistreerd: 28 Jul 2013, 13:30

Re: Waarde in database opslaan (localhost) d.m.v. ethernetsh

Berichtdoor ercmrj » 15 Jan 2017, 20:07

Eindelijk werkt er iets.

Code: Alles selecteren
http://192.168.1.105/add.php?data_sent=12345


Dit werkt wel, maar alleen met het ip adres van mijn nas, maar hij ontvangt nog geen data van de nodemcu met geen van beide scripts.

Als ik localhost of 127.0.0.1 invul doet ie het niet.

Op mijn pc met ubuntu krijg ik wel de "apache2 Ubuntu Default Page" te zien als ik alleen localhost invul maar als ik de /add.php erachter zet vind ie de pagina niet. Op mijn mac is het nog veel erger. Ik weet zeker dat ik de pagina "apache2 Ubuntu Default Page"
wel gezien heb toen ik het installeerde maar nu niets meer.

En hartelijk dank Nico voor alle energie die je er tot dusver in hebt gestoken.

Gebruikers-avatar
Berichten: 4877
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Waarde in database opslaan (localhost) d.m.v. ethernetsh

Berichtdoor nicoverduin » 15 Jan 2017, 20:41

localhost zal hij wel niet vinden omdat ie niet aan wifi hangt. Maar op het internet is mijn subdomein nog actief. Dus pak de POST sketch en doe die in de nodeMCU. En vul voor host dit in
cpp code
collectdata.verelec.com

Als het goed is krijg je dan een oplopend tellertje op de serial.
Mocht dat ook niet werken dan zou ik bijna zeggen dat er iets met jouw firewall aan de hand is. Wel jouw eigen SSID en PW invullen anders kom je het internet niet op.
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 118
Geregistreerd: 28 Jul 2013, 13:30

Re: Waarde in database opslaan (localhost) d.m.v. ethernetsh

Berichtdoor ercmrj » 15 Jan 2017, 21:10

Dat werkt ook Nico via collectdata.verelec.com

Maar nu loopt de data natuurlijke via het add.php bestand wat op jouw server staat.

edit:
Overigens werkt het add.php bestandje nu wel op mijn mac als ik localhost:8888/add.php intyp in de browser alleen kan ik daar mijn nodemcu niet op aansluiten want hij ziet die usb poort niet??? (overigens wel van een arduino uno)
Laatst gewijzigd door ercmrj op 15 Jan 2017, 21:15, in totaal 1 keer gewijzigd.

Gebruikers-avatar
Berichten: 4877
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Waarde in database opslaan (localhost) d.m.v. ethernetsh

Berichtdoor nicoverduin » 15 Jan 2017, 21:12

Dat script staat een paar posts terug....... Dus als je die op jouw server zet kun je testen of het werkt. De sketch is nu al goed.
Wel het juiste ip weer invullen (zonder de http://) voor host.
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 118
Geregistreerd: 28 Jul 2013, 13:30

Re: Waarde in database opslaan (localhost) d.m.v. ethernetsh

Berichtdoor ercmrj » 15 Jan 2017, 21:43

Ik wordt ff helemaal gek, want net werkte het wel en nu niet meer. Zoeken we morgen wel weer uit.

Ff herhalen of ik je helemaal begrijp. Ik heb 2 mappen www een op de server en een op de nas. Bij de nas werkt het probleemloos als ik invoer:
Code: Alles selecteren
http://192.168.1.105/add.php?data_sent=12345



Op mijn server de ene keer wel de andere keer niet
Code: Alles selecteren
http://localhost/add.php?data_sent=12345


Dus neem ik aan de scripts add.php op de juiste plaats staan.

En met de sketch bedoel je het bestand wat ik naar de arduino stuur met de regels POST erin

Gebruikers-avatar
Berichten: 4877
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Waarde in database opslaan (localhost) d.m.v. ethernetsh

Berichtdoor nicoverduin » 15 Jan 2017, 22:21

Ik heb 3 voorbeelden neergezet. Een alleen ff de browser testen. Die lijk jij steeds te gebruiken. Weggooien dus. Daarna de volgende met GET zowel script als sketch en de volgende is POST eveneens met script en sketch. Ze horen dus bij elkaar. Je kan ze niet door elkaar gooien want dat werkt niet
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 118
Geregistreerd: 28 Jul 2013, 13:30

Re: Waarde in database opslaan (localhost) d.m.v. ethernetsh

Berichtdoor ercmrj » 16 Jan 2017, 07:47

Ik kon het niet na laten om het vanmorgen ff te proberen maar nu werken alle sketchen. Idd had ik bij het testen van de laatste de add.php niet gewijzigd.

Super bedankt Nico.

VorigeVolgende

Terug naar Shields

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast