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
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
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
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.
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?
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.
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
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
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
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.
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
voidhttpRequest(){
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!
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
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.
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.
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?
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!");
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.
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.
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!!!
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??
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.
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.
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.
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?
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 ;-)
> 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.
..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.
??
> 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]
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?
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:
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"
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?
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
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?
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.
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
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?
> $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
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.
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?
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?
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.
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?
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.
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...
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.
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.
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.
@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.
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).
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.
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.