mikrocontroller.net

Forum: PC-Programmierung einfacher html server mit qt?


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

weiß jemand von euch, ob man mit qt einen html Server programmieren 
kann?
Es gibt im Tutorial Beispiele für einen UDP Server/Client und ein 
Beispiel für einen HTML Client. Aber leider kein Beispiel für einen 
Server.

Ich würde gerne mal ein wenig experimentieren und eine einfache HTML 
Seite mit dem Webbrowser darstellen.
Später soll ein Mikrocontroller Daten zum HTML Server übertragen, die 
dann im Browser dargestellt werden können.

Kann mir jemand helfen?

Gruß,
chris

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Protokoll, das die Daten zum Browser übertägt, heißt HTTP, nicht 
HTML.  HTML ist die Markierungssprache, mit der die Daten zur 
Darstellung formatiert werden.  Ich nehme also an, Du suchst einen 
HTTP-Server und wirst sicher leichter fündig, wenn Du danach suchst.

Was der allerdings mit QT am Hut hat (eine Library zum Aufbau von 
graphischen Bedienoberflächen), ist mir auch nicht klar.  Der 
HTTP-Server hat einfach Seiten auszuliefern und mit graphischem 
Schnickschnack wenig zu tun.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der HTTP-Server hat einfach Seiten auszuliefern und mit graphischem
>Schnickschnack wenig zu tun.

Den graphischen Schnickschnack braucht man um verschiedene Einstellungen 
des Servers verändern zu können und den Datenfluss vom Mikrocontroller 
debuggen zu können.Außerdem gibt es für  qt eine hervorragend 
funktionierende Klasse für die serielle Schnittstelle, welche die 
Verbindung zum Mikrocontroller herstellt.

>Was der allerdings mit QT am Hut hat (eine Library zum Aufbau von
>graphischen Bedienoberflächen

Qt hat eine eigene Netzwerkklasse. Da ich mit qt programmiere, will ich 
diese Klasse verwenden.
Innerhalb der qt-Klassen zu bleiben hat auch den Vorteil, dass ich keine 
Probleme haben, irgendwelche inkompatiblen Libraries einbinden zu müssen 
und das Programm Plattform unabhängig bleibt.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Was der allerdings mit QT am Hut hat (eine Library zum Aufbau von
> graphischen Bedienoberflächen), ist mir auch nicht klar.

Nein, Qt besteht seit Version 4.0 aus einer Sammlung von mehreren 
Libraries, von denen sich nur ein Teil um graphische Oberflächen 
kümmert.
Man kann mit Qt auch problemlos einen Server schreiben, der überhaupt 
nichts mit graphischen Oberflächen am Hut hat und nicht mal an irgendwas 
linkt, das mit graphischen Oberflächen zu tun hat.

chris schrieb:

> Qt hat eine eigene Netzwerkklasse.

Qt hat nicht nur eine "Netzwerkklasse", sondern eine ganze Bibliothek 
aus Klassen, die für Netzwerk-Kommunikation da sind.
Siehe http://doc.trolltech.com/4.6/network-programming.html

> Innerhalb der qt-Klassen zu bleiben hat auch den Vorteil, dass ich keine
> Probleme haben, irgendwelche inkompatiblen Libraries einbinden zu müssen
> und das Programm Plattform unabhängig bleibt.

HTTP setzt auf TCP auf, und um in Qt einen TCP-Server zu schreiben, 
bietet sich die Klasse (Achtung... jetzt kommt's!) QTcpServer an.

chris schrieb:
> Es gibt im Tutorial Beispiele für einen UDP Server/Client und ein
> Beispiel für einen HTML Client. Aber leider kein Beispiel für einen
> Server.

Du meinst so eins wie das:
http://qt.nokia.com/doc/solutions/4/qtservice/qtse...

Hast recht, das gibt es nicht ;-)

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du meinst so eins wie das:
>http://qt.nokia.com/doc/solutions/4/qtservice/qtse...
>Hast recht, das gibt es nicht ;-)

Hmm, das scheint tatsächlich ein Beispiel für einen HTTP-Server zu sein.

Aber nenne mich "Weichei": ich habe mich schon ein wenig an die 
Entwicklungsoberfäche "qt-creator" von qt gewöhnt. Dort findet man ein 
schönes Menü mit Beispielprogrammen. Die kann man einfach anklicken und 
mit dem grünen "Run" Button kompilieren und laufen lassen. Wunderbar, 
das ist fast so, als wenn man ein Auto, bevor man damit losfahren möchte 
gar nicht mehr zusammenschrauben müsste, sondern einfach einsteigt 
fährt. ;-)

Mit der Erstellung von Make-Files habe ich es noch nicht so. Vielleicht 
kannst Du mir einen Tipp geben wie alle Files zusammen mit der *.pro zu 
erstellen sind, damit das Programm einfach zu kompilieren ist.

Gruß,
chris

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, da müste ich ja qmake lernen, wo ich doch die schöne Oberfläche von 
qt-creator habe.

Jetz bin ich einfach mal so vorgegangen: In den Beispielfiles des 
qt-Creators gibt es einen TCP-Server, der sendet ein paar Sprüche bei 
einem TCP-Request.

Dort habe ich einfach den Beispielcode für "GET" aus dem obigen Link 
kopiert. Ich kann per telnet den Server kontaktieren, aber er liefert 
keine Antwort. Habt Ihr eine Ahnung warum?

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nichts gegen eine schoene, angenehme Entwicklungsumgebung, aber leider 
unterstuetzen sie auch unheimlich Faulheit und erzeugen die Illusion, 
Software koennte man mit ein wenig Klickediklick entwickeln.

Tipp: Mit http://www.w3.org/Protocols/HTTP/AsImplemented.html und dich 
dann almaehlich bis zu HTTP/1.0 weiterentwickeln.

Das hier schadet sicher auch nicht: 
http://oopweb.com/CPP/Documents/DebugCPP/Volume/te...

Und natuerlich noch der hier: 
http://www.amazon.de/Programmieren-C-ANSI-2-C-Refe...

Autor: sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hilft mir jetzt im Moment nicht weiter.

Was ich brauche ist jemand der mir sagt, warum in meinem oben geposteten 
Programm das Signal

    connect(tcpServer, SIGNAL(readyRead()), this, SLOT(sendFortune()));

meine Funktion

void Server::sendFortune() {
..}

nicht auslöst, wenn mit telnet ein Kommando an den Server gesendet wird.

Der Server selbst läuft, da man ihn mit telnet kontaktieren kann. Wird 
der Server mit dem "Quit" Button beendet, merkt das telnet und schließt 
auch ganz korrekt die Verbindung.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Tipp: Mit http://www.w3.org/Protocols/HTTP/AsImplemented.html und dich
>dann almaehlich bis zu HTTP/1.0 weiterentwickeln.

Wobei, der Link ist gar nicht so schlecht.

Es gibt nämlich noch ein kleines Problem: Wenn sich Web-Inhalte auf dem 
HTTP ändern ( also z.B. der Mikrocontroller einen anderen Temperaturwert 
anzeigen will ) müsste der Browser die Seite ja neu laden. Deshalb die 
Frage: Kann man den Browser dazu bringen, die Seite zyklisch 
anzufordern?

Autor: asdfgh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Frage: Kann man den Browser dazu bringen, die Seite zyklisch
> anzufordern?
<meta http-equiv="refresh" content="50" />

zwischen <HEAD> und </HEAD> fordert zur Aktualisierung auf. Mit 
content="xy" wird die Zeit angegeben, nach der aktualisiert werden soll.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@asdfgh

super, danke, das hilft für die Datenaktuallisierung schon mal weiter.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, es scheint so, als wenn ich nicht der Einzige bin, der versucht hat 
das Fortune-Server Example von qt umzubauen:

http://www.c-plusplus.de/forum/viewtopic-var-t-is-...

Allerdings tritt dort genau das gleich Problem auf: das Siganl 
readyRead() scheint nicht zu funktionieren.

@Rolf Magnus (Gast)
Siehst Du, genau da liegt dann das Problem: Man kann Stunden damit 
verbraten, irgend welche Fehler in Beispielen zu suchen, die eben nicht 
als lauffähige Projektdatei vorhanden sind. Das Problem liegt nämlich in 
diesem Fall jetzt nicht mehr am zusammengestückelten Code, sondern an 
irgend einer Eigenschaft von QtServer mit der auch andere Leute Probleme 
haben.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist zwar etwas offtopic: Aber muss man sich für einen einfachen HTTP-
Server unbedingt durch Qt udn C++ quälen? In Python, Perl oder Ruby geht
das ratzfatz ohne viel Tipparbeit. Hier ein Beispiel in Python, das die
aktuelle Uhrzeit auf einer Webseite anzeigt:
from BaseHTTPServer import *
from time import strftime

page = """
<html>
 <meta http-equiv="refresh" content="60"/>
 <h1>Uhrzeit</h1>
 Es ist jetzt %s.
</html>
"""

class MyHTTPRequestHandler(BaseHTTPRequestHandler):
  def do_GET(self):
    self.wfile.write(page % strftime("%H:%M"))

HTTPServer(("", 8080), MyHTTPRequestHandler).serve_forever()

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast schon Recht: mit Python geht es einfacher.

Ich habe mir eine ganze Weile überlegt, ob Python nicht das Mittel der 
Wahl ist. Bei meinem Projekt sollte später noch Datengraph dazu kommen. 
In der Grundausstattung hat Python soweit ich das verstanden habe aber 
keine Graphik. Man muss dann erst zusätzliche Libraries installieren. 
Mein Ziel ist es aber, ein kompaktes, in sich geschlossenes Programm 
ohne große Installationsorgien zu haben.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Yalu X
witzig, spaßeshalber habe ich Dein Python Script mal ausprobiert und es 
kann tatsächlich die Uhrzeit im Browser anzeigen, wenn ich die lokale 
IP-Adresse eingebe:

http://192.168.1.10:8080/

Jetzt wäre es  spannend ein Python-Script, das Daten von der seriellen 
Schnittstelle einliest und im Server mit Browser-Refresh darstellt mit 
dem Aufwand in c++ zu vergleichen.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sepp schrieb:

> Was ich brauche ist jemand der mir sagt, warum in meinem oben geposteten
> Programm das Signal
>
>     connect(tcpServer, SIGNAL(readyRead()), this, SLOT(sendFortune()));
>
> meine Funktion
>
> void Server::sendFortune() {
> ..}
>
> nicht auslöst, wenn mit telnet ein Kommando an den Server gesendet wird.

Das liegt ganz einfach daran, daß es dieses Signal nicht gibt, wie auch 
die Ausgabe des Programms schon sagt. Auch mit Qt wird man sich nicht 
aus Fragmenten aus völlig verschiedenen Programmen einen HTTP-Server 
basteln können, ohne auch nur einen Blick in die Doku zu werfen.
Lies wenigstens mal 
http://doc.trolltech.com/4.6/network-programming.h...

Das da ist übrigens nicht gut:
server.cpp: In member function ‘void Server::sendFortune()’:
server.cpp:148: warning: format ‘%s’ expects type ‘char*’, but argument 2 has type ‘QChar*’

Du solltest statt:
qDebug( "%s",tokens[0].data()   );
besser schreiben:
qDebug( "%s",tokens[0].toLocal8Bit().data()   );
oder nach vorherigem #include <QDebug> einfach:
qDebug() << tokens[0];

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Magnus,

danke für die Hinweise. Ich habe jetzt schon eine ganze Weile probiert, 
bin aber leider nicht weitergekommen.

Dafür habe ich das obige Python Beispiel für den Server erweitert ( ich 
habe bis jetzt noch nie was mit Python zu tun gehabt ).

Und ich muss sagen, es ist wirklich beeindruckend: ich konnte auf die 
Schnelle einen seriell nach http Konverter basteln. Die Daten von meinem 
Arduino Board, welche über die USB-Schnittstelle kommen, werden jetzt im 
Browser dargestellt. Das ganze funktioniert auch noch vom Rechner im 
Nachbarzimmer aus. Wenn ich die Portfreigabe im Router noch schaffe, 
dann wahrscheinlich auf der ganzen Welt ...

Hier der Code:
from BaseHTTPServer import *
from time import strftime
import serial

SER_PORT = '/dev/ttyUSB0'
SER_BAUD = 9600
ser = None

page = """
<html>
 <meta http-equiv="refresh" content="3"/>
 <h1>python serial input http server</h1>
 <h4>chris, march 2010 </h4>
 
 %s

</html>
"""

textBuffer="<p> trying serial port:" + SER_PORT + "</p>"

class MyHTTPRequestHandler(BaseHTTPRequestHandler):
  def do_GET(self):
    global textBuffer
    #self.wfile.write(page % strftime("%H:%M"))
    self.wfile.write(page % textBuffer)
    textBuffer=textBuffer+ser.read(10)

def cb_opendat():
  print "opendat"

def cb_quit():
  print "quit - cleanup"
  ser.close()
  root.quit()

def openSerial():
  global ser
  ser = serial.Serial(SER_PORT, SER_BAUD, timeout = 1)

openSerial()

HTTPServer(("", 8080), MyHTTPRequestHandler).serve_forever()


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
QtWebApp ist ein HTTP 1.1 Server mit Support für Cookies, Sessions und 
Datei-Uploads.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.