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.
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.
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
Im Falle von PHP muss aber auch ein Webserver laufen.
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.
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
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!!
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
Doku zum Modul lesen. Es gibt z.B. eine TCP Appnote.
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.
:
Bearbeitet durch User
Ok, des hab ich schon! Aber wie schreib ich das in einen Arduino sketch? Kann ja nicht einfach AT+... Schreiben!
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.
:
Bearbeitet durch User
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!!!
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.
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??
curl meint: "Fehler beim Eintragen der Daten in die Datenbank!"
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. ??
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?
> 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:
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
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
:
Bearbeitet durch User
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?
:
Bearbeitet durch User
Vielleicht haben die Zeilenumbrüche noch nicht das richtige Format. Es muss "\r\n" sein, bzw. 0x0a gefolgt von 0x0d.
Tschuldigung, ich wollte schreiben: Es muss "\r\n" sein, bzw. 0x0d gefolgt von 0x0a.
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...
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.