Forum: Mikrocontroller und Digitale Elektronik Von Microkontroller auf MySQL Datenbank schreiben


von Burningflash (Gast)


Lesenswert?

Hallo,

mache mir gerade einen kleinen GPS Logger und möchte gerne die Daten auf 
eine MSSQL Datenbank schreiben.

Meine Idee geht so :
Im Fahrzeug ist mein Logger, ist ein Microchip Controller und der hat 
das SIM900 Modul. Nun will ich direkt über das SIM900 meine Daten die 
ich aufzeichne auf eine Datenbank auf meinem Server schreiben. Ist so 
ewas möglich? Und wenn ja WIE? Habe das Netz durchforstet aber überall 
nur angefangene Themen und nichts was wirklich hilft

Für jede Hilfe bin ich dankbar

von Vlad T. (vlad_tepesch)


Lesenswert?

das würde ja ein ständige GSM-Verbindung voraussetzen.
ein wenig teuer, oder?


ansonsten:
das schwierigste sollte doch sein eine Internetverbindung aufzubauen, 
dannach ist alles einfach, egal ob SQL, TXT oder sonst was.
Du baust auf irgend einen Server entweder ein eigenes Server-Programm, 
oder du machst das ganze über einen Webserver mit php oder perl, indem 
du eine Url mit Parametern (GPS Daten) aufrufst.

Ich vermute aber, das ganze scheitert an dem Netzwerk-Stack

von Burningflash (Gast)


Lesenswert?

Ne ist nicht teuer  :)

Da hab ich ne SIM Karte die für Datentransfer ausgelegt ist.
Die Internetverbindung ist kein Problem! Das ist über das SIM900 Modul 
gelöst. Ich habe eine ständige Verbindung über GPRS.

Was den Server angeht da will ich ebend kein Serverprogramm haben 
sondern etwas in Form von Tabular Data Stream.

Will sogesehen direkt vom IC auf den Server schreiben

von Karl H. (kbuchegg)


Lesenswert?

Burningflash schrieb:
> Ne ist nicht teuer  :)
>
> Da hab ich ne SIM Karte die für Datentransfer ausgelegt ist.
> Die Internetverbindung ist kein Problem! Das ist über das SIM900 Modul
> gelöst. Ich habe eine ständige Verbindung über GPRS.
>
> Was den Server angeht da will ich ebend kein Serverprogramm haben
> sondern etwas in Form von Tabular Data Stream.

Na dann.
Du kannst auch über Telnet/SSH eine Verbindung zu Mysql aufbauen.
Dann bedeutet Zugriff auf die Datenbank: ein paar Texte (nämlich SQL 
Anweisungen) wandern über die Leitung.

von ... (Gast)


Lesenswert?

Du kannst natürlich auch versuchen, die MySQL Client Library auf Deinen 
µC zu portieren :)
Oder zumindest die von Dir benötigten Teile des Protkolls.

von Burningflash (Gast)


Lesenswert?

Um den Datenstrom so klein wie möglich zu halten will ich ebend meinen 
IC soweit intelligent machen das ich nicht über Telenet paar zusätzliche 
Zeilen schicken muss.

Die Client Libary wäre natürlich die eleganteste Lösung nur hab ich 
wirklich keine Ahnung wie ich da anfangen soll.
Hat vielleicht jemand so etwas schon gemacht? Gibt es was im Netz was 
ich implementieren könnte?

von (prx) A. K. (prx)


Lesenswert?

Es dürfte weit einfacher sein, auf dem MySQL Server einen Service zu 
installieren, der Botschaften des Dataloggers in MySQL-Aktionen umsetzt. 
Auf dem Server ist das schnell implementiert und das Protokoll zwischen 
Logger und Server kann dadurch sehr einfach gehalten werden.

Der Ansatz, mit einem Controller ohne Linux direkt auf den MySQL 
Netzwerk-Service zu gehen, maximiert hingegen den Aufwand auf der 
Controller-Seite.

von ... (Gast)


Lesenswert?

Huch, sorry.
Ich seh grad Du willst ja MSSQL connecten und nicht MySQL. Ist irgendwie 
einfach zu heiß heute. Also vergiß meinen letzten Post.

Die Protokollbeschreibung für TDS findest Du hier:
http://msdn.microsoft.com/en-us/library/cc448435.aspx
Und hier eine Implementierung:
http://www.freetds.org

von A. B. (funky)


Lesenswert?

also entweder ich versteh gerade etwas nicht, oder du ^^

Du brauchst doch nur eine Php Datei oder ähnliches aufrufen, welcher du 
deine Parameter übergibst...den Rest macht dann der Server.
Also so eine Art WebService.
Eigentlich musst Du es nur schaffen, mit deinem MC eine GET/POST Abfrage 
an den Server abzusetzen und die Sache ist geritzt.

Und was spricht gegen ein Serverprogramm wenn Du doch sowieso den MySQL 
Server am laufen hast? Ich mein Dein Serverprogramm wäre ja nur ein 
kleines Script.

Wenn ich mir mal anschaue was Tabular Data Stream mein: "The TDS packets 
are passed to a SQL Server client Net-Library and encapsulated into 
network protocol packets. The network protocol packets are received by a 
server Net-Library at the server end where the TDS packet are extracted 
and passed to Open Data Services. This process is reversed when results 
are returned and received at the client's end."

dann ist das im Endeffekt das selbe in grün

von A. B. (funky)


Lesenswert?

achso und ob MySql, MSSQL oder Oracle ist in dem Fall doch wurscht. 
Kommt im Endeffekt alles aufs selbe raus und kann von PHP, Perl, C oder 
was weiß ich was auf dem Server erledigt werden.

Der MC muss nur die Daten in irgendeinem Format hinschicken und gut ist

von Simon K. (simon) Benutzerseite


Lesenswert?

Im Falle von PHP muss aber auch ein Webserver laufen.

von ... (Gast)


Lesenswert?

irgenwie steh ich jetzt entgültig auf dem Schlauch.
Im Titel steht MySQL in den Posts vom TO ist von MSSQL und TDS die Rede. 
Ja was denn nu?

Ansonsten hat der Rest hier natürlich völlig recht. Apache/IIS mit 
PHP/Python/Perl/CGI/ASP/<was auch immer> ist vermutlich das einfachste.
Oder die Variante von A.K., ein eigenes (binäres) Protokoll mit 'nem 
selbst geschrieben Service auf der anderen Seite. Das dürfte von der zu 
übertragenden Datenmenge her das Optimum sein.

von ... (Gast)


Lesenswert?

Der Netwerkstack steckt schon in seinem GSM Modul. Das Teil hat 
vermutlich mehr Rechenpower wie sein µC, da steckt ein AMR926EJ-S core 
drin :)

http://wm.sim.com/sim/wm/html/en/WMS/EDGE%20Module/ProductDetail.aspx?id=770

von Burningflash (Gast)


Lesenswert?

Ihr habt Recht.

Ich werde wohl ein Programm für den Server schreiben lassen. Das ist das 
Beste.

Vielen Dank für die Hilfe bei der Wahl!!

von Sebastian bösl (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein ähnliches Problem!

Ich möchte mit meinem Ardunio UNO und einem SIM900 GSM/GPRS Modul in 
eine SQL Datenbank schreiben.

Der Sketch für das schreiben in die DB über ein Ethernet Modul 
funktioniert!

Nur an der GSM übertragung scheitere ich! Hier mal der Sketch mit dem 
Ethernet shield! Nur der Teil für die Übergabe in die DB!


Wie mache ich das über das GSM-Shield?
1
// this method makes a HTTP connection to the server:
2
void httpRequest(){ 
3
//void DatenSenden(){
4
// if there's a successful connection:
5
Serial.println("try connecting...");
6
if (client.connect(server, 80)) {
7
Serial.println("connecting...");
8
// send the HTTP PUT request:
9
client.print("GET /data2mysql.php?Gewicht=");
10
client.print(weightSamples.getAverage());
11
client.print("&Aussentemperatur=");
12
client.print(dht.readTemperature());
13
client.print("&Luftfeuchte=");
14
client.print(dht.readHumidity());
15
client.println(" HTTP/1.1");  //Das Leerzeichen for HTTP... ist wichtig!
16
client.print("Host: ");
17
client.println(server);
18
client.println("Connection: close");
19
client.println();
20
 
21
// note the time that the connection was made:
22
lastConnectionTime = millis();
23
}
24
else {
25
// if you couldn't make a connection:
26
Serial.println("connection failed");
27
Serial.println("disconnecting.");
28
client.stop();
29
}
30
}

VIELEN DANK schonmal!!!

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Doku zum Modul lesen. Es gibt z.B. eine TCP Appnote.

von Sebastian Bösl (Gast)


Lesenswert?

Das ist auch so ein Problem! Ich habe dazu keine Doku! Bis jetzt habe 
ich alles mit probieren und tutorials aus dem Internet geschrieben.

Kannst du mir vielleicht die doku schicken? Oder nen downloadlink geben?

Aber so schwierig kann das doch nicht sein oder?


Grüße
Sebastian

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Bösl schrieb:
> Das ist auch so ein Problem!

Wieso?

Wenn ich die Stichworte hier aus dem Thread zusammenfüge und Google mit
"SIM900 GSM/GPRS TCP AppNote" suchen lasse, finde ich in 3 Sekunden ein 
entsprechendes Tutorial, wie man mit diesem Teil eine Internet 
Verbindung aufbaut.

: Bearbeitet durch User
von Sebastian Bösl (Gast)


Lesenswert?

Ok, des hab ich schon! Aber wie schreib ich das in einen Arduino sketch?

Kann ja nicht einfach AT+... Schreiben!

von Linksammler (Gast)


Lesenswert?

Sebastian Bösl schrieb:
> nicht einfach AT+... Schreiben!

Doch. Genau sowas muss dein arduino über seine Serielle Schnittstelle an 
das GSM-Modul schicken/schreiben.

der Arduino-Befehl dazu ist "Serial.println". der ist dir sicher 
schonmal begegnet.

Mit Google-Suche nach "Arduino SIM900 TCP Example" findet man auch 
sofort Beispiel-Code, der das verwendet.

z.B
http://www.cooking-hacks.com/documentation/tutorials/arduino-gprs-gsm-quadband-sim900

Die Google-Suche ist nicht kostenpflichtig. Die kannst du auch selber 
kostenfrei verwenden. Auch mehrfach mit leicht abgeänderten Suchworten, 
bis du was brauchbares gefunden hast.

von Sebastian B. (ibes1410)


Lesenswert?

Ach Linksammler, du brauchst mir nicht erklären wie google funktioniert. 
:-)

Ich hab schon ziemlich alles ausprobiert mit der Kostenlosen 
Google-Suche!

Trotzdem komme ich nicht weiter! Ich kann zwar jetzt ne Verbindung 
aufbauen zu meinem Webspace aber dann scheiterts am Daten in die 
Datenbank schreiben!

Hat sowas schonmal jemand geschaft? Und kann mir weiterhelfen?

von Pete K. (pete77)


Lesenswert?

Was macht denn Dein data2mysql.php Programm?

von Sebastian B. (ibes1410)


Lesenswert?

Das trägt die daten in die Datenbank.

Hier der inhalt von data2mysql.php:


<?php
$mysql_host = "****";
$mysql_db   = "****";
$mysql_user = "****";
$mysql_pw   = "****";
isset($_GET['Gewicht']) ? $Gewicht=$_GET['Gewicht'] : $Gewicht='';
isset($_GET['Aussentemperatur']) ? 
$Aussentemperatur=$_GET['Aussentemperatur'] : $Aussentemperatur='';
isset($_GET['Luftfeuchte']) ? $Luftfeuchte=$_GET['Luftfeuchte'] : 
$Luftfeuchte='';

$connection = mysql_connect($mysql_host, $mysql_user, $mysql_pw) or 
die("Verbindung zur Datenbank fehlgeschlagen.");
mysql_select_db($mysql_db, $connection) or die("Datenbank konnte nicht 
ausgewaehlt werden.");
$insert_data = "INSERT INTO analog_data (Gewicht, Aussentemperatur, 
Luftfeuchte) VALUES ($Gewicht, $Aussentemperatur, $Luftfeuchte)";
mysql_query($insert_data, $connection) or die("Fehler beim Eintragen der 
Daten in die Datenbank!");

von Linksammler (Gast)


Lesenswert?

Sebastian B. schrieb:
> $insert_data = "INSERT INTO analog_data (Gewicht, Aussentemperatur,
> Luftfeuchte) VALUES ($Gewicht, $Aussentemperatur, $Luftfeuchte)";

Achtung: Damit hat jeder, der auf deine Webseite kommt, Vollzugriff auf 
die Datenbank.

data2mysql.php?Gewicht=);+DROP+table+analog_data;+--

PHP hat inzwischen viel bessere mysql-Schnittstellen, das steinalte 
"mysql_"-Zeuchs sollte man nicht mehr verwenden.

von Karl H. (kbuchegg)


Lesenswert?

Sebastian B. schrieb:

> Trotzdem komme ich nicht weiter! Ich kann zwar jetzt ne Verbindung
> aufbauen zu meinem Webspace aber dann scheiterts am Daten in die
> Datenbank schreiben!

Na ja.
Was macht denn dein Beispiel von da oben?
1
client.connect(server, 80)
2
client.print("GET /data2mysql.php?Gewicht=");
3
client.print(weightSamples.getAverage());
4
client.print("&Aussentemperatur=");
5
client.print(dht.readTemperature());
6
client.print("&Luftfeuchte=");
7
client.print(dht.readHumidity());
8
client.println(" HTTP/1.1");  //Das Leerzeichen for HTTP... ist wichtig!
9
client.print("Host: ");
10
client.println(server);
11
client.println("Connection: close");
12
client.println();
13
client.stop();

und das bildest du jetzt per GSM nach.

Dieses Programmfragment schickt an deinen Webserver einfach nur den Text
1
GET /data2mysql.php?Gewicht=20&Aussentemperatur=23&&Luftfeuchte=80 HTTP/1.1
2
Host: irgendwas
3
Connection: close

und dasselbe machst du jetzt auch von deiner GSM Verbindung aus. Die 
Klasse wird ja wohl irgendeine Methode haben, mir der man Text 
übertragen kann, nachdem die Verbindung zu einem Server steht.

Zum probieren und für den Anfang reicht es doch, wenn du einfach nur den 
Text so wie er ist (ohne gemessene Zahlenwerte) schickst (inklusive 
Zeilentrenner)

> aber dann scheiterts am Daten in die Datenbank schreiben!
damit hat dein Arduino Programm überhaupt nichts zu tun.
Es schickt einfach nur die Anforderung an den HTML Server, die 'Seite' 
data2mysql.php zu liefern. Im Zuge dieser Anforderung spezifiziert es 
noch Parameter, die diese 'Seite' erhalten soll. Dass dein PHP Skript 
diese Daten dann in eine Datenbank schreibt, interessiert deinen Arduino 
nicht und braucht ihn auch nicht zu interessieren.
Vielleicht mal ein bischen damit beschäftigen, wie eigentlich die 
Kommunikation Browser/Server funktioniert? Das ist einfach nur: der 
Browser schickt an den Server die Anforderung eine 'Datei' zu liefern. 
Dass diese Datei in WIrklichkeit bei dir ein PHP Skript ist, dass vom 
Server ausgeführt wird, ist etwas was den Browser überhaupt nicht 
interessiert.

: Bearbeitet durch User
von Sebastian B. (ibes1410)


Lesenswert?

Hallo zusammen,

ich schaffe es einfach nicht die Daten in die SQL-DB einzutragen!
Laut Seriellen Monitor habe ich zwar eine Verbindung zu meinem Servern, 
aber Daten werden nicht übertragen...

Hat vielleicht jemand noch einen Tip oder ne Hilfe für mich?


Vielen vielen Dank schon einmal!!!

von Eric B. (beric)


Lesenswert?

Sebastian B. schrieb:

> Hat vielleicht jemand noch einen Tip oder ne Hilfe für mich?

Lies doch noch mal das was K.H oben geschrieben hat.

von Sebastian B. (ibes1410)


Lesenswert?

Das habe ich schon oft genug gemacht!!

Meine Serieller Monitor sieht nun so aus:

Starting...
AT
AT
AT+CPIN=****
Connecting to the network...
AT+CREG?
AT+CIPMUX=0
AT+CIPSTATUS
AT+CSTT="web.vodafone.de","",""
AT+CIPSTATUS
AT+CIICR
AT+CIPSTATUS
AT+CIFSR
AT+CIPSTATUS
Openning TCP
AT+CIPSTART="TCP","i***e.kilu.de","80"
Connected
AT+CIPSEND=106
www.ibesbee.kilu.de, 80 GET /data2mysql_zwei.php?Gewicht=20 HTTP/1.1 
www.ibesbee.kilu.de Connection: close
AT+CIPCLOSE
AT+CIPSHUT

Aber warum klappt das nicht??

von häxe (Gast)


Lesenswert?

curl meint:
"Fehler beim Eintragen der Daten in die Datenbank!"

von Sebastian B. (ibes1410)


Lesenswert?

Guten Morgen,
was meinst du mit "curl"?

von Sebastian B. (sebastian_b56)


Lesenswert?

Wenn du die data2mysql_zwei.php nicht inzwischen ordentlich sanitized 
hast,
dann betrachte deine Server-Datenbank jetzt als kompromittiert.
In diesem Thread sind inzwischen genug Informationen um die einfachste 
aller SQL-Injections vorzunehmen.
Damit meine ich:

Sebastian B. schrieb:
> www.ibesbee.kilu.de, 80 GET /data2mysql_zwei.php?Gewicht=20 HTTP/1.1

Davon abgesehen kann ich dir wahrscheinlich nicht viel helfen, ich habe 
das Modul nicht, und auch noch nie damit gearbeitet.
Du könntest dir aber mal die Apache-Logfiles anschauen, ob überhaupt 
eine Verbindung zu deinem Server ankommt? Oder scheitert's schon daran? 
Dann lass dir mal die (UART?) antworten des Moduls auf deinem Debug-UART 
ausgeben.

LG,

Ein anderer Sebastian B.

von Sebastian B. (ibes1410)


Lesenswert?

Wenn einer meint er will mir schaden, dann kann ich auch nichst dagegen 
Tun.
Das ganze ist eine Bienenstockwaage in der Testphase. Ich wäre ja froh, 
wenn das mal laufen würde.
Und dann kann ich mir Gedanken über eine sicherere Möglichkeit machen!
Oder kann mir jemand direkt eine bessere Möglichkeit nennen?

Ich bin Anfänger, daher kann ich auch nicht nachvollziehen was einige 
hier schreiben.

von Stefan F. (Gast)


Lesenswert?

DU hast anscheinen zwei Baustellen auf einmal, und keine Ahnung, welche 
der beiden Baustellen nicht läuft.

Auf der einen Seite wäre die Kommunikation zum GSM Modul.

Auf der anderen Seite ist die Kommunikation zum Webserver.

Reduziere deine Software auf EINE Baustelle und teste sie getrennt.

von Sebastian B. (ibes1410)


Lesenswert?

Ja, da hast du Recht Stefan Us.

Ich habe jetzt versucht über die Serielle Schnittstelle "AT" an das GSM 
modul zu senden.

So wie ich das verstanden habe, müsste doch dann "OK" zurückkommen oder?

Leider tut sich da garnix..

Hier der Sketch:


void setup() {

  Serial.begin(9600);

  Serial.println("AT");


}

Was kann ich da falsch machen?

von Sigi S. (sermon)


Lesenswert?

Ohje,

Dir fehlen jahrelange Grundlagen.
Ich will Dich nicht frustrieren, aber das wird nix...

Lern erst einmal Laufen, dann können wir Dir auch Dein Dreirad ölen ;-)

von Stefan F. (Gast)


Lesenswert?

> So wie ich das verstanden habe, müsste doch dann "OK" zurückkommen oder?

Ja schon, nur brauchst du auch Code, der die Antwort empfängt und 
auswertet oder zumindest irgendwo anzeigt.

Ohne Programm macht der Mikrocontroller nichts. Wenn du etwas auf einem 
Display anzeigen willst, musst du das auch programmieren.

von Sigi S. (sermon)


Lesenswert?

..und ist nicht in der Lage seine Fehlerquellen systematisch zu 
analysieren, in Teilprobleme zu unterteilen und schrittweise 
vorzugehen......

Auch da hapert es.

Wozu gibt es eigentlich ein Terminalprogramm a la Putty/Hyperterm etc. 
??

von Sebastian B. (ibes1410)


Lesenswert?

Ok, ich bekomme zahlenwerte zurück!
Habe ich vergessen zu posten! Das habe ich in void loop geschrieben.

Aber ich dachte da müsste OK zurückkommen?

von Stefan F. (Gast)


Lesenswert?

> Aber ich dachte da müsste OK zurückkommen?

Ja. Wenn das nicht der Fall ist, hast du womöglich gepufferte Daten von 
vorherigen Kommandos ausgelesen. Oder die falsche Baudrate. Oder die 
Taktfrequenz des Mikrocontroller stimmt nicht mit F_CPU überein. Oder 
die CLK/8 Fuse ist falsch gesetzt. Oder dieses GPS sendet seine 
Zahlenkollonnen schon ohne einen entsprechenden Befehl. Was sagt denn 
das Manual dazu?

Du solltest doch deine beiden Baustellen trennen!


Also: Schließe das GPS Modul an den PC an, starte dort ein 
Terminalprogramm (z.B. Hammer Terminal) und probiere erstmal manuell per 
Tastatur/Bildschirm aus, wie das Ding funktioniert.

Danach verbindest du den Mikrocontroller mit dem PC und Terminalprogramm 
und kommuniziert wieder halb-manuell mit deinem Programm. Also ganz ohne 
GPS Modul.

Danach nutzt du den PC, um das GPS Modul zu simulieren und kommunizierst 
mit dem Mikrocontroller.

Danach erst verbindest du das echte GPS Modul mit dem Mikrocontroller.

By the way: Es könnte sehr hilfreich sein, Dir zwei USB-UART Kabel zu 
kaufen, mit denen du die serielle Kommunikation einer Schnittstelle 
mitschnüffelst.

[/code]
GPS Rx o------+---------o µC Tx
              |
    Tx o------|---+-----o µC Rx
              |   |
              |   |
              |   +-----o PC USB-UART 1 Rx  (Tx nicht verwenden)
              |
              +---------o PC USB-UART 2 Rx  (Tx nicht verwenden)
[/code]

von Sebastian B. (ibes1410)


Lesenswert?

Habe ich jetzt gemacht..

Jetzt bekomme ich auch "Antworten" vom yC und dem GPS-Modul.

Die Verbindung müsste jetzt klappen zum Webserver.

Allerdings verstehe ich noch nicht warum nach aufbau der Verbindung und 
nach der "OK" Meldung trotzdem keine Daten an meine DB übergeben werden.

Kann ich da noch weitere Infos über Fehler programmieren?

Das hier ist ein Teil meiner momentane Serielle Ausgabe:


STATE: IP STATUS
Openning TCP
AT+CIPSTART="TCP","i****.de","80"

OK

CONNECT OK
Connected
AT+CIPSEND=44

> GET /data2mysql_zwei.php?Gewicht=20 HTTP/1.1

SEND OK
AT+CIPCLOSE

CLOSE OK
AT+CIPSHUT

SHUT OK


Ich hoffe ich komme der Sache langsam näher?

von Sebastian B. (sebastian_b56)


Lesenswert?

Spontane Vermutung:
Du musst einen HTTP-GET-Request auf jeden Fall mit zwei(!) 
Zeilenumbrüchen abschließen, damit der Server weiß, dass die Anfrage 
zuende ist.
Probier mal das zu senden:

"GET /data2mysql_zwei.php?Gewicht=20 HTTP/1.1\r\nHost: 
www.example.com\r\nConnection: close\r\n\r\n"

Wobei du example.com natürlich noch durch deinen eigenen Host ersetzt

Und schau dir auf jeden Fall an, was der Webserver loggt. (bei einem 
eigenen Server z.B. unter /var/log/apache2/ bei einer Hosting Umgebung 
stellt dein Anbieter dir diese Daten üblicherweise irgendwo gesondert 
bereit)
Funktioniert das Script denn, wenn du manuell via Browser versuchst, 
etwas einzutragen?


Und was das sanitizen des Scripts angeht (aus Security Sicht enorm 
wichtig!)
solltest du mindestens noch Folgendes machen:
1
$Gewicht = mysql_real_escape_string($Gewicht);
2
$Aussentemperatur = mysql_real_escape_string($Aussentemperatur);
3
$Luftfeuchte = mysql_real_escape_string($Luftfeuchte);

Wenn alles nur Integer-Werte sind vielleicht sogar
1
if (!is_numeric($Gewicht) || !is_numeric($Aussentemperatur) || !is_numeric($Luftfeuchte)){die("Injection versuch erkannt!");}

Am besten beim Datenbank-Eintrag selbst noch "prepared statements" 
benutzen, aber das kannst du auch später noch machen.

Liebe Grüße,
Sebastian

: Bearbeitet durch User
von Sebastian B. (ibes1410)


Lesenswert?

Vielen Dank für dein Hilfe!

Leider immer noch keinen Erfolg. Es ist beim gleichen geblieben.

Sebastian B. schrieb:
> Und schau dir auf jeden Fall an, was der Webserver loggt.)

Auf meinem Server konnte ich dazu keine Infos finden. www.Kilu.de 
scheint das nicht zur Verfügung zu stellen.
Welche Webserver gibt es die das machen?

Sebastian B. schrieb:
> Funktioniert das Script denn, wenn du manuell via Browser versuchst,
> etwas einzutragen?

Das versuche ich schon ewig, schaffe es aber nicht. Ich habe mir auch 
den "open http requester" im firefox runtergeladen. => Ohne Erfolg.

Wenn ich

http://www.i****.de/data2mysql_zwei.php?Gewicht=20

in den Browser schreibe kommt nur "Fehler beim Eintragen in die 
Datenbank".
Das habe ich habe in der "data2mysql_zwei.php"

Sebastian B. schrieb:
> Hier der inhalt von data2mysql_zwei.php:
>
> <?php
> $mysql_host = "****";
> $mysql_db   = "****";
> $mysql_user = "****";
> $mysql_pw   = "****";
> isset($_GET['Gewicht']) ? $Gewicht=$_GET['Gewicht'] : $Gewicht='';
> isset($_GET['Aussentemperatur']) ?
> $Aussentemperatur=$_GET['Aussentemperatur'] : $Aussentemperatur='';
> isset($_GET['Luftfeuchte']) ? $Luftfeuchte=$_GET['Luftfeuchte'] :
> $Luftfeuchte='';
>
> $connection = mysql_connect($mysql_host, $mysql_user, $mysql_pw) or
> die("Verbindung zur Datenbank fehlgeschlagen.");
> mysql_select_db($mysql_db, $connection) or die("Datenbank konnte nicht
> ausgewaehlt werden.");
> $insert_data = "INSERT INTO analog_data (Gewicht, Aussentemperatur,
> Luftfeuchte) VALUES ($Gewicht, $Aussentemperatur, $Luftfeuchte)";
> mysql_query($insert_data, $connection) or die("Fehler beim Eintragen der
> Daten in die Datenbank!");


Liegt das ganze vielleicht an der "data2mysql_zwei.php"

von Stefan F. (Gast)


Lesenswert?

Schreibe das Script so um, dass es die Eingabeparameter in eine Datei 
loggt. Dann siehst du schonmal, ob der HTTP Request richtig ankommt.

Es sollte auch möglich sein, nur den Datenbank Zugriff (ohne HTTP) auf 
der Kommandozeile zu testen. Du kannst dir ja zuhause einen PHP 
Interpreter und eine MySQL Datenbank (ganz ohne Webserver) installieren.

Bevor du halbfertige Programme ins öffentliche Netz stellst, solltest du 
sie ohnehin vorher zuhause durchgetestet haben. Steht das nicht auch in 
den Vertragsbedingungen dieses Webhosters?

von Sebastian B. (sebastian_b56)


Lesenswert?

Sebastian B. schrieb:
> Auf meinem Server konnte ich dazu keine Infos finden. www.Kilu.de
> scheint das nicht zur Verfügung zu stellen.
> Welche Webserver gibt es die das machen?

Also Webserver machen das alle, die Frage ist, ob der Provider das dann 
auch zur Verfügung stellt. Hier dann wohl nicht.


> Sebastian B. schrieb:
>> Funktioniert das Script denn, wenn du manuell via Browser versuchst,
>> etwas einzutragen?
>
> Das versuche ich schon ewig, schaffe es aber nicht. Ich habe mir auch
> den "open http requester" im firefox runtergeladen. => Ohne Erfolg.
>
> Wenn ich
>
> http://www.i****.de/data2mysql_zwei.php?Gewicht=20
>
> in den Browser schreibe kommt nur "Fehler beim Eintragen in die
> Datenbank".
> Das habe ich habe in der "data2mysql_zwei.php"

Aha! Da liegt also der Fehler begraben. Wenn es schon beim händischen 
Ausführen nicht geht, wieso soll es dann mit dem Mikrocontroller 
gehen...

Schau dir erst mal an, ob die Tabelle (analog_data) bzw. Datenbank (in 
$mysql_db) überhaupt noch existiert (z.B. mit phpMyAdmin. Das liefert 
üblicherweise jeder Hoster aus. Dort kannst du auch die SQL-Statements 
manuell testen, die du ausführen möchtest.) Es kann nämlich gut sein, 
dass jemand mit den Daten die du ja hier schon veröffentlicht hast 
Schabernack getrieben hat, und die Tabelle gelöscht hat, nachdem 
linksammler ja schon den SQL-Injection-Code gepostet hatte.

Danach schaust du dir die Fehlermeldung an, die mySQL dir zurück gibt.
Das kannst du, indem du statt dem "mysqlQuery or die" soetwas machst:
1
$result = mysql_query($insert_data, $connection);
2
if (!$result) {
3
    die('MySQL-Fehler: ' . mysql_error());
4
}

Wenn die Fehlermeldung dann nicht selbsterklärend genug ist, schaun wir 
mal weiter :)



> Sebastian B. schrieb:
> Liegt das ganze vielleicht an der "data2mysql_zwei.php"

Auf jeden Fall mindestens daran :)

LG,
Sebastian

von Sebastian B. (ibes1410)


Lesenswert?

Vielen Dank für deine Infos!!

Habe alles kontrolliert. Und teilweise geändert.
Wenn ich nun das ganze über den httpRequester versuche kommt folgendes 
dabei raus!


GET http://i****.de/data2mysql_zwei.php?Gewicht=22

 -- response --
200 OK
Date:  Fri, 01 May 2015 18:36:42 GMT
Server:  Apache
X-Powered-By:  PHP/5.3.14
Connection:  close
Content-Type:  text/html; charset=iso-8859-1

MySQL-Fehler: You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right syntax to 
use near ' )' at line 1


Aber ich finde keinen Fehler... Was läuft denn da falsch?

von Stefan F. (Gast)


Lesenswert?

Wie lautet denn der SQL Befehl, der diese Fehlermeldung auslöst?

> $insert_data = "INSERT INTO analog_data (Gewicht, Aussentemperatur,
> Luftfeuchte) VALUES ($Gewicht, $Aussentemperatur, $Luftfeuchte)";

Was steht denn dann in $insert_data drin?

Du solltest Dich echt mal mit dem Thema Logging beschäftigen. Nicht 
irgendwann mal, sondern am Besten jetzt sofort.

von Sebastian B. (sebastian_b56)


Lesenswert?

Sebastian B. schrieb:
> MySQL-Fehler: You have an error in your SQL syntax; check the manual
> that corresponds to your MySQL server version for the right syntax to
> use near ' )' at line 1
>
>
> Aber ich finde keinen Fehler... Was läuft denn da falsch?

Ich vermute, die arme Datenbank weiß nicht, was sie in die Felder 
"Aussentemperatur" und "Luftfeuchte" reinschreiben soll. Wenn sie 
"nichts" eintragen sollte, müsstest du ihr "NULL" übergeben. Und nicht 
den leeren String. Der führt nur zu einer ungültigen SQL-Syntax.
Probier's mal ohne die beiden anderen Felder. (Auch die Tabelle 
anpassen, dann.)
Wenn das funktioniert, kannst du's nach und nach erweitern.

LG,
Sebastian

von Sebastian B. (ibes1410)


Lesenswert?

Ja, da hast du recht gehabt!
Jetzt kann ich vom Browser aus Werte eintragen.

Jedoch macht mein yC noch nicht mit...

Sebastian B. schrieb:
> Spontane Vermutung:
> Du musst einen HTTP-GET-Request auf jeden Fall mit zwei(!)
> Zeilenumbrüchen abschließen, damit der Server weiß, dass die Anfrage
> zuende ist.
> Probier mal das zu senden:
>
> "GET /data2mysql_zwei.php?Gewicht=20 HTTP/1.1\r\nHost:
> www.example.com\r\nConnection: close\r\n\r\n"


Das habe ich schon in sämtlichen Varianten versucht, jedoch ohne Erfolg. 
Es kommt aber auch keine Fehlermeldung zurück. Hier die Ausgabe:


STATE: IP STATUS
Openning TCP
AT+CIPSTART="TCP","i****.de","80"

OK

CONNECT OK
Connected
AT+CIPSEND=94

> GET /data2mysql_zwei.php?Gewicht=20 HTTP/1.1
Host: www.i****.de
Connection: close



SEND OK


Was ist das jetzt noch für ein Bug?

von Michael U. (amiga)


Lesenswert?

> $insert_data = "INSERT INTO analog_data (Gewicht, Aussentemperatur,
> Luftfeuchte) VALUES ($Gewicht, $Aussentemperatur, $Luftfeuchte)";

Wenn Du das mit mysql_query aud php abschickst, müssen die 
Variablennamen in einfach Anführungszeichen, also so:

 $insert_data = "INSERT INTO analog_data (Gewicht, Aussentemperatur,
 Luftfeuchte) VALUES ('$Gewicht', '$Aussentemperatur', '$Luftfeuchte')";

Sonst gerät entweder $Gewicht als String in den Insert oder MySQL 
interpretiert es als Spaltenname (müßte ich nachschauen).

Sowas kann man doch einfach aus dem Browser am PC testen: mit
echo $insert_data;
den erzeugten String im Browser ausgeben, entweder sieht man dann den 
Fehler sofort oder man kopiert die Ausgabe in den PHPMyAdmin und läßt es 
von dort ausführen, da kann man dann gleich live den Fehler korrigieren 
und testen.

Gruß aus Berlin
Michael

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Michael U. schrieb:
>> $insert_data = "INSERT INTO analog_data (Gewicht, Aussentemperatur,
>> Luftfeuchte) VALUES ($Gewicht, $Aussentemperatur, $Luftfeuchte)";
>
> Wenn Du das mit mysql_query aud php abschickst, müssen die
> Variablennamen in einfach Anführungszeichen, also so:
>
>  $insert_data = "INSERT INTO analog_data (Gewicht, Aussentemperatur,
>  Luftfeuchte) VALUES ('$Gewicht', '$Aussentemperatur', '$Luftfeuchte')";

Wohl kaum.

Da die drei genannten Größen alle numerisch sind, werden die Datenfelder 
ja hoffentlich auch von einem numerischen Typ sein. Und dann gehören die 
Werte eben gerade nicht in Anführungszeichen. Das wäre nur dann so, 
wenn sie in der Tabelle als Strings gespeichert würden.

Aber auch dann wäre das manuelle Hinzufügen von Anführungszeichen nur 
die zweitbeste (lies: die schlechteste) Lösung. Denn wenn man einen 
String in Anführungszeichen setzt (MySQL erlaubt hier wahlweise einfache 
oder doppelte Anführungszeichen) dann müssen im String befindliche 
Anführungszeichen der gleichen Art auch wieder escaped werden - 
typischerweise indem man sie mit einem davorgeschiebenen Backslash 
"entwertet". Und damit man das alles nicht händisch beachten muß, bietet 
die "mysql" Erweiterung von PHP schon seit Ewigkeiten die Funktion 
mysql_escape_string() die sich um all das kümmert.

Allerdings würde man viel lieber die "mysqli" Erweiterung verwenden und 
prepared Statements. Dann braucht man Strings nicht zu quoten und die 
Angriffsmöglichkeiten für SQL-Injection werden reduziert.

von Bernd K. (prof7bit)


Lesenswert?

Wie wärs zur Abwechslung mal mit prepared statements?

Oder ist es Absicht daß man hier krampfhaft versucht alle schon seit dem 
letzten Jahrtausend gelösten Probleme umständlich gezielt wieder 
herzustellen um all die seit damals längst gelösten Probleme erneut 
heraufzubeschwören anstatt sich das Leben einfacher zu machen indem man 
einfach das passende Werkzeug verwendet?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Vielleicht haben die Zeilenumbrüche noch nicht das richtige Format. Es 
muss "\r\n" sein, bzw. 0x0a gefolgt von 0x0d.

von Wolfgang (Gast)


Lesenswert?

Stefan Us schrieb:
> Es muss "\r\n" sein, bzw. 0x0a gefolgt von 0x0d.

Ja - was den nun?

von Stefan F. (Gast)


Lesenswert?

Tschuldigung, ich wollte schreiben:

Es muss "\r\n" sein, bzw. 0x0d gefolgt von 0x0a.

von Sebastian B. (ibes1410)


Lesenswert?

Habe jetzt alle möglichen formen der zeilenumbrüchen ausprobiert und 
keinen Erfolg gehabt.

Kann ich mir ergendwo anschauen wie meine Daten an dem Server ankommen?

von Stromverdichter (Gast)


Lesenswert?

Mach doch einfach einen Socket auf, und schaue, was dein Controller zum 
Socket schickt. Alternativ kannst du ja auch Wireshark verwenden, um den 
Traffic zu sehen.

von Sebastian B. (ibes1410)


Lesenswert?

Was der yC zum Modul schick sehe ich ja schon, das passt ja.

Und wireshark hilft mir doch in dem Fall nix weil das ja übers GSM 
gesendet wird. Oder lieg ich da falsch?

von Martin M. (capiman)


Lesenswert?

Du schreibst oben, dass du die Daten in die Datenbank auf deinem
Server schreiben willst. Was spricht dagegen, dort Wireshark
laufen zu lassen? Dann müsstest du doch die Request sehen,
die du über GSM an den Server sendest?

Dies kannst du dann auch gegen andere (funktionierende) Anfragen
vergleichen.

von Sebastian B. (ibes1410)


Lesenswert?

Das ist ja nicht mein server, sonder nur ein kostenloser Webspace.

Wenn das alles klappt werde ich mir einen eigenen server zulegen.


Ich denke das es nur an der Form des GET-Request liegt. Den manuel über 
den Browser funktionert das übergeben der Daten.

"GET /data2mysql_zwei.php?Gewicht=20 HTTP/1.1\r\nHost: 
www.i****.de\r\nConnection: close\r\n\r\n";


Ich bekomme ja auch keine Fehlermeldung rurück...

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Sebastian B. schrieb:
> Ich bekomme ja auch keine Fehlermeldung rurück...

Aber Apache wird eine Fehlermeldung ins Errorlog schreiben.

Sebastian B. schrieb:
> Das ist ja nicht mein server, sonder nur ein kostenloser Webspace.

Dann wäre es angebracht, zumindest für die Entwicklungs- und Testphase 
lokal einen Webserver aufzusetzen. Der kann z.B. auf deinem PC laufen.

von stefan us (Gast)


Lesenswert?

Du kannst mit Wireshark auf deinem PC auch den Traffic zwischen yC und 
Webserver aufeichnen, sofern PC und yC am selben Switch stecken. Falls 
der Switch das Mitschnüffeln nicht unterstützt, besorge einen alten Hub, 
dann geht es auf jeden Fall.

von Fritz G. (fritzg)


Lesenswert?

Du kannst kein = hinschreiben, das muss %3D heißen.

Siehe http://php.net/manual/de/function.urlencode.php

Edit: vergiss mein Geschreibsel, bei der Parameterübergabe nimmt man =, 
nur im Text nicht.

: Bearbeitet durch User
von Peter P. (Gast)


Lesenswert?

@stefan us
Das Problem ist, dass der uC im Fahrzeug sitzt und via GSM
mit dem Internet kommuniziert. Der Server ist auch im Internet.
Der Traffic kommt in dem jetzigen Aufbau nie an seinem Heimatnetz
vorbei und daher kann er ihn auch nicht tracen.

@Sebastian
Je nachdem, was du daheim einsetzt, könntest du den Traffic
(Datenpakete) in dein Heimnetz umlenken. Dies geht z.B. mit
einer FritzBox (oder jedem anderen modernen Router).
Wenn die Datenpakete dann schon mal bei dir ankommen,
dann kannst du diese entweder lokal auf einem Webserver
bearbeiten oder evt. an den echten Webserver weiterleiten.
(kennt jemand ein Programm für solch eine Weiterleitung?)
Selbiges auch für die Datenbank.
Ein Raspberry Pi würde für so etwas schon reichen,
aber auch jeder andere Rechner.

Seit aber vorsichtig: Es wurde oben schon erwähnt, welche Gefahren
durch nicht korrekt verarbeitete SQL Queries auftreten können.
Durch die Portweiterleitung auf einen (internen) Rechner
wird es nicht besser und die Gefahr, dass jemand dann dein lokales
Netzwerk angreift oder gar übernimmt, ist nicht zu unterschätzen.

von Fritz G. (fritzg)


Lesenswert?

Wenn du einen Linuxrechner zur Verfügung hast, kannst du netcat bzw. nc 
verwenden um deine Anfrage zu sehen. Entweder statt einem Webserver, 
oder du lauscht z.B. auf Port 1080 (dann muss deine URL auch auf :1080 
zeigen).

von Martin M. (capiman)


Lesenswert?

Gibt doch vielleicht auch mal etwas Text zurück,
wenn das Eintragen geklappt hat.
Dies müsstest du auf dem uC dann wieder empfangen können,
bevor die Verbindung geschlossen wird.

von Bernd K. (prof7bit)


Lesenswert?

Peter P. schrieb:
> Das Problem ist, dass der uC im Fahrzeug sitzt und via GSM
> mit dem Internet kommuniziert. Der Server ist auch im Internet.
> Der Traffic kommt in dem jetzigen Aufbau nie an seinem Heimatnetz
> vorbei und daher kann er ihn auch nicht tracen.

Dann soll er einen Server zuhause aufsetzen zum Entwickln und Debuggen 
so lange bis es funktioniert und dann kann er es beim Hoster 
installieren. Das wird mit anderen Webanwendungen genauso gemacht.

von Peter P. (Gast)


Lesenswert?

Port-Forwarding: Vielleicht so etwas (nicht probiert/nicht getestet):

http://stackoverflow.com/questions/11525703/port-forwarding-in-windows

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.