PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mysql.h file



Manta
12.12.2009, 09:14
Hallo!

Ich versuche zur Zeit mit einem µC auf eine Mysql Datenbank zuzugreifen. Ich habe so etwas vorher noch nie gemacht und kenne mich nun auch dementsprechend wenig aus. Programmiert habe ich vorher schon nur nicht den Zugriff auf eine Datenbank. Ich habe mich erst mal erkundigt und im Internet gesucht und bin dann darauf gestoßen, dass ich diese ominösen Headerfiles:

mysql.h und auch mysqlerror.h

benötige. Ist das soweit richtig? Und kann mir eventuell jemand einen Denkanstoß geben wie denn so ein Datenbank connect zu bewerktelligen ist?
Das heißt jetzt nicht, dass ich ein fertiges Programm will, ganz im Gegenteil ich würde nur gern ein klein bisschen Hilfe geniesen können.

lg

vklaffehn
12.12.2009, 13:07
Moin! kurze Frage : wie greifst Du auf die Datenbank zu? seriell? Was für ein µC nutzt Du?Ich kann mir nicht vorstellen, das es für kleine 8-bitter eine mysql Bibliothek gibt.... Die Headerfiles werden auch nicht reichen, da da ja eigentlich nur Funktionsdefinitionen (oder Deklaratoren? :-) ) drin stehen, abe nicht der eigentliche Code. Gib mal ein paar mehr Infos...

MfG
Volker

Manta
13.12.2009, 10:51
Oke das war nur halb formuliert!

Also:

Ich programmiere in C. Als µC verwende ich den LM3S6918. Besser gesagt ich verwende das ganze Controllerboard und das ist ein Reference Design Kit von Luminary Micro. Da bin ich auch gleich bei der Frage wie ich auf die Datenbank zugreife. Dieses Controllerboard hat eine Ethernetschnittstelle also damit und dementsprechend seriell.

Reicht das oder willst du noch mehr wissen? Falls mehr Inforamtionen benötigt werden bitte melden! Danke.

lg

vklaffehn
13.12.2009, 12:07
Ah, da bin ich außen vor :-) Das ist doch ein ARM? Läuft da nicht ein Linux drauf? so mit GCC? Da sollte google zum Thema Arm, gcc und mysql evtl. was ausspucken... Kenn mich nur mit den kleinen 8Bit Atmels aus

MfG
Volker

Manta
13.12.2009, 15:47
Jop das ist ein ARM.

Aber es macht ja nichts wenn du dich da nicht so gut auskennst wie mit den "kleinen" 8Bit Atmels. Das Grundprinzip müsste ja sowieso das gleiche sein und ein bisschen Hintergrundinformation kann nie schaden.

lg

vklaffehn
13.12.2009, 16:36
Najaaa, 'im Prinzip' ist das schon ähnlich, mit dem kleinen Unterschied, dass man bei einem 8Bitter alle Bits selber in Griff hat, bei Pc's aber z.B. schön ein Betriebssystem dazwischen hat, was einem die schwierigen Dinge, wie z.B. Ansprechen des Chips auf der Netzwerkkarte, einen TCP/IP Stack, abnimmt :-) Also mit C# und PHP hab ich auch schon auf mysql Servern rumgefuhrwerkt, willst Du das jetzt von deinem ARM aus machen, mußt du den Mysql Client für den ARM übersetzen und wahrscheinlich auch anpassen. Gefunden hab ich z.B. das hier : http://guymage.net/index.php?post/2006/04/25/45-nokia-770-mysql-remote-connection-with-libmysqlclient-for-arm
, oder gleich selber das Protokoll implementieren. Wenn Du TCP Sockets öffnen kannst und Daten empfangen und versenden, dann kann man evtl. selber was bauen....


P.S.: greifst Du nun über Ethernet ODER seriell auf die Datenbank zu? Seriell würde ich evtl. sogar noch mit einem AVR hinkriegen :-)
MfG
V.Klaffehn

Manta
14.12.2009, 16:17
So ich habe mir das einmal durchgelesen was du mir da nettes herausgesucht hast. Ich hab mich auch anderwertig engagiert und regagiert (ich hoffe das schreibt man so). Auf jeden Fall bin ich zu diesem Resulatat gekommen. (Bitte richtig stellen, wenn es nicht stimmt):

Für den µC also den ARM den ich verwende, gibt es diese ominösen mysql.c und mysql.h files nicht. Diese selbst zu schreiben oder abzuändern von einem anderen µC ist zwar möglich, allerdings nicht mit meinen Kenntnissen. Das ist schon was für Profis.

Jetzt mein Schluss aus dem ganzen:

Ich muss die Ethernet Schnittstelle verwenden. Also gibt es einen kleinen µC wie z.B. einen von den "kleinen" 8 Bittern, mit dem dies möglich wäre? (Ja muss es geben, denn sonst hättest du keine Erfahrung damit @vklaffehn). Also ich nehm mir zusätzlich zu meinem ARM so einen µC und extra noch einen Ethernet to RS232 Converter. Damit bin ich also nicht an die max. 10m von der RS232 gebunden. (Ja das ist das hauptächliche Problem, der Abstand).

Ich steuer dann praktisch mit dem ARM über das Ethernet und den Converter den 8 Bitter an un damit dann die Datenbank? Geht das dann über RS232? Weil dann brauch ich entweder einen Schalter der mir eine RS232 einmal auf das Ethernet leget und dann wieder wenn ich es brauche auf die Datenbank. Oder gibt es da 8 Bitter mit 2 RS232?

Was meinst du mal prinzipiell zu dieser Idee? Sie ist sicher noch nicht ausgereift, allerdings kann man mit dem Ansatz schon was machen oder ist das vollkommener Schwachsinn?

Wenn das wirklich möglich wäre so wie oben beschrieben. Hast du dann eventuell auch einen Vorschlag für mich welchen "kleinen" 8 Bitter ich da verwenden könnte?

Programmieren könnte ich den dann in C oder? Und kann ich da gleich meinen JTAG Adapter für meinen ARM nehmen zum Übertragen des Programmes oder brauch ich da so ein ISP und ein anderes Programm zum "Rüberschieben"?

Außerdem wenn das so funktionieren würde, wäre es mir nur recht, denn damit kennst du dich ja ein bisschen aus und mit einem Rückkrad etwas anzufangen, also wenn ich weiß, dass ich auch mal fragen darf wenn mir was nicht klar ist, das ist einfacher, macht mehr Spaß und der Lernerfolg ist dabei deutlich höher.

lg

vklaffehn
14.12.2009, 17:49
Öhm.
Irgendwie steig ich jetzt nicht so ganz durch :-) Erklär doch mal, was genau Du eigentlich vorhast. Ich hab bisher noch nicht mit einem µC auf eine Datenbank zugegriffen, sondern immer nur von großen PC's, die haben da alle nette MySQL Bibliotheken, wo ich nur noch sage : Sag diesem Server folgenden SQL Befehl .... Wie das da dann ankommt, da kümmert sich dann die fertige MySQL Bibliothek bzw. das Betriebssystem drum... Also, wie gesagt : was genau hast Du vor? Und mußt du dafür zwingend einen Datenbankserver nutzen?
Mfg
Volker

Manta
14.12.2009, 20:08
Oke was ich im Wesentlichen vorhabe:

Ich lese mittels eines RFID Lesers Nummern von Transponder ein. Diese Nummern soll der ARM Controller zur Datenbank schicken und erhält dann Informationen von der Datenbank wem dieser Transponder gehört und noch etwaige andere. Das Einlesen der Transpondernummer funktioniert schon wunderbar. Jetzt habe ich eben das Problem mit der Datenbank.

Ich hoffe jetzt ist das Ganze ein bisschen klarer geworden.

lg

markusj
14.12.2009, 21:00
Um Mal etwas aufzuräumen mit dem durcheinander einige grundsätzliche Sachen zum Thema Datenbank:
1. Ist die Datenbank im Netzwerk oder läuft die (kann ich mir kaum vorstellen) auf deinem ARM mit? Wenn ja, brauchst du auch nen TCP/IP-Stack
2. Du benötigst auf jeden Fall die Clientbibliotheken für MySQL, zu denen dann auch die Headerfiles gehören. Mit etwas Glück kannst du diese für deine Plattform aus dem Sourcecode kompilieren, wie gut das funktioniert weiß ich aber nicht.

Beides wohlgemerkt vorausgesetzt dass du ein Linux auf dem ARM laufen hast.
Wenn du direkt auf der blanken Hardware arbeitest, hilft dir das aber wenig, du wirst die Library dann wohl händisch portieren müssen - neben dem TCP/IP-Stack den du dann wohl auch brauchst.

mfG
Markus

Edit: Es schmerzt mich ja, bei MySQL von einer *hust* Datenbank zu sprechen

TheDarkRose
15.12.2009, 13:33
Ich glaub bei diesem Vorhaben, wäre es einfacher einen eigenen Serverdienst zu programmieren, der sich mit dem MySQL-Server verbindet.
Im ARM brauchst du dann nur mehr einen TCP/IP-Stack implementieren, der über ein sehr einfaches Protokoll (kannste dir nach belieben dann ausdenken) dann mit deinen eigenen Serverdienst kommuniziert.

vklaffehn
15.12.2009, 22:24
Tja, also die Frage bleibt, ob auf dem Board ein Linx läuft oder nicht :-)
Mal OT an markusj: Warum hustest Du bei einer MySQL Datenbank ? ;-)
Mfg
Volker

Manta
17.12.2009, 19:58
1. Ist die Datenbank im Netzwerk oder läuft die (kann ich mir kaum vorstellen) auf deinem ARM mit? Wenn ja, brauchst du auch nen TCP/IP-Stack


Die Datenbank ist im Netzwerk. Außerdem habe ich mittlerweile auch schon den TCP/IP - Stack gefunden. Da ich C Programmierung in Zusammenhang mit Datenbanken noch nicht gemacht habe, geschweige denn irgendetwas über Ethernet und TCP/IP geschickt habe, bin ich noch relativ unbeholfen auf diesem Gebiet.



2. Du benötigst auf jeden Fall die Clientbibliotheken für MySQL, zu denen dann auch die Headerfiles gehören. Mit etwas Glück kannst du diese für deine Plattform aus dem Sourcecode kompilieren, wie gut das funktioniert weiß ich aber nicht.


Oke ich werde mal nach diesen Clientbibliotheken für MySQL suchen.

Weiters:



Tja, also die Frage bleibt, ob auf dem Board ein Linx läuft oder nicht


Nein da läuft kein Linux drauf.

Also meine weitere Erkenntnis bis jetzt von dem ganzen:

Ich muss mal den TCP/IP - Stack konfigurieren, damit der richtig funktioniert. Weiters muss ich mir die Clientbibliotheken und die zugehörigen Headerfiles für MySQL besorgen und dann kann ich mich mit den Befehlen rumschlagen, damit ich das von der Datenbank bekomme, was ich auch wirklich haben will. Stimmt das so weit?

lg

TheDarkRose
17.12.2009, 20:02
Also wenn auf dem ARM kein OS läuft sondern eine direkte von dir selbstprogrammierte Firmware, dann solltest du nur den TCP/IP-Stack implementieren und einen selbst programmierten zwischenserver ansprechen

Manta
19.12.2009, 13:48
Hallo,

Ich bni gerade auf der Suche nach den Clientbibliotheken für MySQL, finde allerdings nichts passendes. Wisst ihr eventuell wo ich die herkriegen kann? Das sind doch ganz normale opensource files oder?

lg

TheDarkRose
21.12.2009, 06:25
mysql.com einfach guggen

Manta
21.12.2009, 21:18
Danke! Ich denke ich habe da etwas gefunden. Jetzt nur mehr eine Frage:
Ist das dort kotenlos das Runterladen oder nicht?

lg

TheDarkRose
21.12.2009, 21:20
Ja es ist kostenlos

Manta
22.12.2009, 16:32
So danke erstmal!
Ich habe mir das jetzt runtergeladen und das sieht ganz nett aus. Nur habe ich jetzt noch eine Frage:

Ich habe das jetzt eingebunden in meinen C Code und jetzt tritt folgender Fehler auf:

Bei der Zeile des mysql.h files:

#include <sys/types.h>

kommt dann folgende Fehlermeldung:

mysql.h(47): error: #5: cannot open source input file "sys/types.h": No such file or directory.

Ich habe dann nachgesehen wo das sein könnte, aber ich finde das nirgends. Oder ist das so zu verstehen, dass ich hier die sys.h und die types.h von meinem µC einfügen muss?

lg

TheDarkRose
22.12.2009, 18:14
du kannst die mysql-clientbibliothek nicht so auf deinen µC einbinden.

markusj
22.12.2009, 20:46
Ich hatte dir bereits angekündigt, dass du die Bibliothek selbst auf deinen µC portieren musst - und dabei insbesondere Schnittstellen fürs Speichermanagement und die Netzwerkbiliothek emulieren musst.
Eigentlich musst du ein halbes POSIX-Betriebssystem emulieren oder den Code entsprechend umbauen, dass er mit deinen Möglichkeiten läuft.

Zusammengfasst:
Lern zu verstehen was du tun willst oder lass es sein!

mfG
Markus

Manta
08.01.2010, 20:05
So jetzt bin ich wieder aus meinem Urlaub zurück und habe mich frisch wieder ans Werk gemacht.

Ich habe inzwischen nachgeforscht und bin auf folgendes gekommen:

1. Ich verwende den lwIP TCP/IP - Stack - das sollte die Sache doch ein bisschen vereinfachen auch wenn ich kein OS verwende oder? @ markusj

2. Ich denke ich abe schon mal den Anfang gemacht und mal den Stack initialisieren können. Jetzt aber eine weitere Frage: muss ich bei einer Verbindung mit einer Datenbank eine Socketverbindung herstellen oder reicht da eine normale TCP Verbindung. Ich habe den Begriff "Socketverbindung" nur mal wo in dem Kontext aufgefasst, weiß aber nicht genau was eigentlich der Unterschied zwischen einer Socketverbindung und der TCP Verbindung ist. Oder kann ich eine Socketverbindung nur verwenden wenn ich ein OS in betrieb habe?

3. Anscheinend besitzt mein ARM controller auch ein OS drauf. Nur habe ich keine Ahnung wie ich dieses verwende und ich will es eigentlich auch nicht wirklich verwenden. Deswegen habe ich mich auch ein bisschen eingelesen in das lwIP (mit dem ich auch hoffe, dass es funktioniert) und da steht drin, dass ich nicht umbedingt ein OS benötige, weil ein OS nur benötigt wird wenn multi- threading gewünscht ist. Bei meinem Anwendungsfall von single-threading (falls meine Anwenundung, also der Datenbankconnect ein single-thread ist) ist das doch dann garnicht notwendig. Das habe ich zumindest aus dem wiki auf lwIP-Wiki (http://lwip.wikia.com) so herausgelesen. Irgendwie muss ich bei single-threading nur alle 250ms eine Timerroutine aufrufen, die mir den tcp-timer verwaltet.

lg

markusj
08.01.2010, 21:05
Ich denke, du wirst nicht umhin kommen, größere Teile der Clientbibliothek zu adaptieren oder gar neu zu schreiben. Dass du jetzt immerhin weißt, welche Netzwerkbibliothek du verwendest, ist schon einmal ein Fortschritt.
Wenn dein ARM ein OS hat, solltest du das schleunigst in Erfahrung bringen, weil das massiven Einfluss darauf hat, welche Möglichkeiten du und Schnittstellen dir zur Verfügung stehen.

mfG
Markus

Manta
08.01.2010, 22:42
Also nochmal muss ich das auch in Erfahrung bringen welches OS ich drauf hab, wenn ich den NO_SYS betrieb, der ja gleichbedeutdend ist mit dem als ob da kein OS drauf wäre?

Und ich würde das mit der Socketverbindung auch gerne wissen, also was genau der Unterschied zwischen einer TCP/IP- und einer Socketverbindung ist? Und ob es da eventuell eine Faustregel gibt, die besagt, dass bei einem Datenbankconnect diese oder jene Verbindungsart verwendet werden muss oder besser ist?

lg Manta

cmock
09.01.2010, 05:34
sockets sind, vereinfacht gesagt, das netzwerk-API von *nix, darüber machst du TCP/IP-verbindungen (u.a.). es reicht also an sich eine TCP-verbindung, wie auch immer du die dann mit dem vorhandenen IP-stack herstellst.

aber ich schließe mich markusj an: die mysql-client-library setzt ein betriebssystem und dessen APIs voraus (*nix oder windows, vermutlich), und wenn das nicht vorhanden ist, mußt du entweder die mysql-libraries massiv ändern oder emulationen für alle verwendeten APIs (speicherverwaltung, netzwerkverwaltung, fileverwaltung, evtl threads und und und) schreiben. das würd ich auf jeden fall vermeiden wollen.

der IMHO einfache lösungsansatz wurde ja auch schon vorgeschlagen: schreib einen serverprozeß am PC, mit dem dein µC kommuniziert. grob skizziert: der µC macht eine TCP-verbindung zum PC auf und schickt dort die ID des RFID-tags hin, der serverprozeß packt die in ein "SELECT bla FROM table WHERE id= '1234'", kommuniziert mit der "datenbank", und schickt die aus der antwort extrahierten daten in einem simplen format, das sich am µC leicht verarbeiten läßt, zurück.

cm.

Manta
09.01.2010, 10:20
der IMHO einfache lösungsansatz wurde ja auch schon vorgeschlagen: schreib einen serverprozeß am PC, mit dem dein µC kommuniziert. grob skizziert: der µC macht eine TCP-verbindung zum PC auf und schickt dort die ID des RFID-tags hin, der serverprozeß packt die in ein "SELECT bla FROM table WHERE id= '1234'", kommuniziert mit der "datenbank", und schickt die aus der antwort extrahierten daten in einem simplen format, das sich am µC leicht verarbeiten läßt, zurück.

Oke, wenn das denn der einfachere Weg ist, dann werde ich wohl diesen nehmen.

Und nochmal langsam ob ich das jetzt alles verstanden habe. Ich würde dsa sehr gerne verstehen was genau ich hier überhaupt betreibe:

Ich verwende jetzt also KEIN OS auf meinem µC, daher ist die direkte Verbinung mit der DB flach gefallen, da ich sonst in der mysql-client-bibliothek zu viel ändern müsste. Darum steig ich jetzt um auf folgende Variante:

Mit dem lwIP - Stack öffne ich eine TCP - Verbindung mit dem Server und dem dort laufenden Serverprozess der mir dann die Abfragen und die Einträge in der DB macht. Diesem Serverprozess schicke ich dann die entschprechenden IDs der RFID - Tags und lasse sie dort verarbeiten.

Stimmt ja so oder? Ich weiß ich hab das jetzt sicherlich einfach nochmal wiederholt was cmock geschrieben hat aber ja so tu ich mir einfach leichter.

Gut, aber, damit ergibt sich schon die nächste Frage. Wie schreibt man so einen Serverprozess, der mit der DB und dem µC kommuniziert? Also welche Sprache? Wo gibts für sowas Tutorials zum Einlesen und wenn man so etwas ind er Richtung mit dem Serverprozess noch nie gemacht hat ist das dann schaffbar?

lg Manta

cmock
10.01.2010, 00:21
Ich würde dsa sehr gerne verstehen was genau ich hier überhaupt betreibe:

ja, das wär wohl hilfreich :-)


Mit dem lwIP - Stack öffne ich eine TCP - Verbindung mit dem Server und dem dort laufenden Serverprozess der mir dann die Abfragen und die Einträge in der DB macht. Diesem Serverprozess schicke ich dann die entschprechenden IDs der RFID - Tags und lasse sie dort verarbeiten.

ja, so hab ich das gemeint.


Gut, aber, damit ergibt sich schon die nächste Frage. Wie schreibt man so einen Serverprozess, der mit der DB und dem µC kommuniziert? Also welche Sprache? Wo gibts für sowas Tutorials zum Einlesen und wenn man so etwas ind er Richtung mit dem Serverprozess noch nie gemacht hat ist das dann schaffbar?

sicher ist das schaffbar, vor vielen jahren war ich auch in der situation "ich kann grundsätzlich programmieren, hab keine ahnung von netzwerkprogrammierung oder programmierung unter *nix, aber das macht ja nix", und hab drei jahre später meine firmenanteile um ordentlich geld verkauft, die nix wert gewesen wären, wenn ich das nicht gelernt hätt...

ich würd das heutzutage mit perl unter linux lösen, also eine etwas ausgefeiltere variante von


use DBI;
# mysql-connection oeffnen
$dbh = DBI::connect(blablabla);

# uC schickt LF-terminierte RFID-IDs:
while(<>) {
chomp;
print $dbh->selectrow_arrayref("SELECT name FROM rfids WHERE id = ?", {}, $_)->[0], "\n";
}

aber das ist natürlich minimalst und ungetestet, und hat vor allem den nachteil, daß es nicht auf die wichtigen fragen eingeht:

* wie sind deine aktuellen programmierkenntnisse?

* welche betriebssysteme beherrscht du?

weil an sich kannst das mit jeder kombination aus OS und sprache abfackeln, für die es MySQL-anbindung gibt.

cm.

Manta
14.01.2010, 06:54
Also

Ich habe mich entschieden den Serverprozess in PHP zu realisieren. -Ich stelle also einen TCP - Kanal mit dem µC zum Server her und übergebe dann dem PHP Skript die entsprechenden Parameter und diese kommuniziert dann mit dem Server.

Mal schaun ob das so geht wie ich mir das vorstelle.

lg

TheDarkRose
14.01.2010, 15:04
Ich würde eher einen nativen Serverprozess mit C, C++, C#, Java oder ähnliches machen, aber nicht mit PHP!

Manta
16.01.2010, 16:48
Also der Stand der Dinge:

Da der Stack Probleme gemacht hat, als ich ihn im single thearded modus gefahren bin, also ohne OS, habe ich mal versucht ein OS zu aktivieren. Ich habe mir da ein bisschen was durchgelesen und dann bin ich irgendwie auf die Seite des FreeRTOS gestoßen. Habe dann dort gesucht ob es denn so ein OS auch für meinen µC gibt. Habe es auch gefunden und runtergeladen. Dann habe ich es mal compiliert und dann in den µC gespielt und jetzt ist er tot. Oder ich glaub es zumindest. Er tut nichts mehr. Seine Anzeige ist schwarz und ich kann ihn auch nicht mehr anwählen.

Zum programmieren verwende ich:

Kompiler: KEIL µVision
JTAG adapter: ULINK2

Die Fehlermeldung die ich nun bekomme, wenn ich versuche auf den µC zuzugreifen ist folgende

1. Cannot access memory
2. Cannot enter debug mode

Also die 1. heißt ja, dass der JTAG auf einen Speicher zugreifen will, der physikalisch nicht existiert.
Die 2. Fehlermeldung ist mir noch unbekannt.

Hat eventuell irgendjemand Erfahrung mit KEIL und dem ULINK2 und Fehlermeldungen dieser Art?

lg Manta