So, ich habe mit dem PB Webserver nun mal ein wenig weitergemacht.
Mein Anwendung ist da doch sehr spezifisch, deshalb erst mal ein paar Erläuterungen.
Ich bastle momentan an einer WebGUI universell einsetzbar mit jedem Mikrocontroller der seriell mit dem PC kommunizieren kann.
Dies geschieht folgendermaßen:
HTML z.B. mit NVU erstellen und Platzhalter
bis
an gewünschter stelle ins HTML einfügen. Die Platzhalter werden beim senden der Seite durch Content den der µC sendet ersetzt.
Umgekehrt werden Events der Gadgets/Form an den µC gesendet.
Leider habe ich aber bezüglich Server - Browser Kommunikation noch nicht alles hinbekommen.
Habe nun einfach mal für Euch ein kleines Demo vorbereitet.
Demonstration deshalb, weil ich nun mal nicht davon ausgehe, das jeder Leser hier mal gerade so nen Mikrocontroller zu Hand hat um den tatsächlichen Code zu testen.
Den ganzen Serial- Code habe ich entfernt und durch zwei Dummy Prozeduren ersetzt.
Ok, durch das ganze Ausschneiden werde ich nun leider keinen Code Schönheitswettbewerb gewinnen, aber egal.
Hier nun der PB Code und zwei HTML.
In Eurem PB Code Verzeichnis müsst Ihr einen Ordner namens "
Server_Content" erstellen. Dort kommen logischerweise die zwei HTML Dateien rein.
PB Code:
Code: Alles auswählen
; UNICODE PB 5.42 LTS Window x86
EnableExplicit
Declare content_html(client,*Buffer) ;Sendet alle notwendigen Daten zum Browser
Declare.s MC_Daten_anfordern(placeholder_number) ;Soll später mal Daten seriell vom Mikrocontroller empfangen. DERZEIT NUR EIN DUMMY
Declare.s MC_Daten_senden(command.s) ;Soll später mal Befehle seriell zum Mikrocontroller senden. DERZEIT NUR EIN DUMMY
Define *Buffer
Define Event
Define client
Global Dim placeholder.s(100)
Global An_Aus.s = "An" ;wird nur für die Dummy Prozeduren gebraucht zwecks Demo
OpenConsole()
If InitNetwork()=0
PrintN("Das Netzwerk konnte nicht initialisiert werden")
End
EndIf
If CreateNetworkServer(1,80)=0
PrintN("Server konnte nicht auf Port 80 erstellt werden")
End
Else
PrintN("Server wurde auf Port 80 erstellt")
EndIf
*Buffer = AllocateMemory(1000) ;Speicher für den HTML Content. Derzeit 1000 Bytes
Repeat
Event= NetworkServerEvent()
Select Event
Case #PB_NetworkEvent_Data
client = EventClient()
PrintN("Nachfrage von "+ IPString(GetClientIP(client)))
;TODO: Server Log- Datei zum speichern der IP
content_html(client,*Buffer)
EndSelect
ForEver
Procedure content_html(client,*Buffer)
Define bytes_gelesen
Define HtmlFile.s
Define content_laenge
Define content.s
Define EOL$ = Chr(13)+Chr(10)
Define Request.s
Define info.s
Define zaehler
Define Replace_placeholder.s
FillMemory(*Buffer,1000)
Repeat
bytes_gelesen=ReceiveNetworkData(client,*Buffer,1000)
Until bytes_gelesen<=0
Request.s = PeekS(*Buffer,-1,#PB_UTF8)
;TODO: Request im Server-Log protokollieren
If StringField(Request.s,1,"/") = "POST "
MC_Daten_senden(Request.s)
EndIf
info.s = StringField(Request,2,"/")
info.s = RemoveString(info.s," HTTP")
If info.s=""
info.s="index.html"
EndIf
If info="favicon.ico" ;wird derzeit noch nicht unterstützt
;TODO: favicon Unterstützung
ProcedureReturn
EndIf
;HTML laden und Platzhalter im Content ersetzen
If ReadFile(0,"Server_Content\"+info.s,#PB_File_SharedRead)
While Eof(0) = 0
content.s + ReadString(0,#PB_UTF8)+EOL$
Wend
CloseFile(0)
For zaehler = 1 To 100
Replace_placeholder.s = MC_Daten_anfordern(zaehler)
content.s = ReplaceString (content.s,"<!--placeholder"+Str(zaehler)+"-->",Replace_placeholder)
Next zaehler
content_laenge = StringByteLength(content.s,#PB_UTF8)
EndIf
;HTTP Header und Seiten-Content senden
HtmlFile= "HTTP/1.1 200 OK"+EOL$
HtmlFile+ "Date: Wed, 07 Aug 1996 11:15:43 GMT"+EOL$
HtmlFile+ "Server: Atomic Web Server 0.2b"+EOL$
HtmlFile+ "Content-Length: "+Str(content_laenge)+EOL$
HtmlFile+ "Content-Type: text/html" +EOL$
HtmlFile+ EOL$
HtmlFile+ content.s
SendNetworkString(client,HtmlFile)
EndProcedure
Procedure.s MC_Daten_anfordern(placeholder_number)
;FIXME: Diese Prozedur ist nur ein Dummy für serielle Kommunikation mit einem Mikrokontroller
Define ReturnString.s
placeholder(1) ="40%"
placeholder(2) =Str(Random(70,30))+"%"
placeholder(3) =Str(Random(70,30))+"%"
placeholder(4) =Str(Random(70,30))+"%"
placeholder(5) = An_Aus.s
If placeholder(placeholder_number) <>""
ReturnString.s = placeholder(placeholder_number)
EndIf
ProcedureReturn ReturnString.s
EndProcedure
Procedure.s MC_Daten_senden(command.s)
;FIXME: Diese Prozedur ist nur ein Dummy für serielle Kommunikation mit einem Mikrokontroller
Define Send_Serial.s
Define sl
Send_Serial.s = StringField(command.s,2,";;")
sl = StringByteLength(Send_Serial.s) /2-2
Send_Serial=Left(Send_Serial,sl)
PrintN("Es wird "+Send_Serial.s+" an den Mikrocontroller gesendet. Wenn das Programm mal fertig ist. ;-)")
Select Send_Serial.s
Case "ja=Wassersparprogramm AN"
An_Aus.s = "AN"
Case "nein=Wassersparprogramm AUS"
An_Aus.s = "AUS"
EndSelect
EndProcedure
Html bitte als "index.html" im Content Ordner speichern:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="content-type">
<title>Mikrocontroller Projekt Gartenbewässerung</title>
</head>
<body>
<big><big><span
style="font-weight: bold;">Mikrocontroller Projekt
Gartenbewässerung DEMO</span></big></big><br>
<br>
Die Button Events werden auch in der Console angezeigt!<br>
<br>
Füllstand Zisterne:
<!--placeholder1-->
<br>
<br>
Bodenfeuchte Messpunkt 1:
<!--placeholder2-->
<br>
Bodenfeuchte Messpunkt 2:
<!--placeholder3-->
<br>
Bodenfeuchte Messpunkt 3:
<!--placeholder4--> <br>
<br>
Wassersparprogramm :
<!--placeholder5--><br>
<br>
<br>
<form enctype="text/plain" target="_self" method="post"
action="/" name="Wasser_sparen_ja"><input
name=";;ja" value="Wassersparprogramm AN" type="submit"><br>
</form>
<form target="_self" enctype="text/plain" method="post"
action="/" name="Wasser_sparen_nein"><input
name=";;nein" value="Wassersparprogramm AUS"
type="submit"><br>
</form>
<br>
<br>
<a href="demo2.html"><big>weiter
zur nur nächsten Demo</big></a><br>
<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>
HTML2 als bitte als "demo2.html" in den Content Ordner.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="content-type">
<title>Universal Mikrocontroller WebGUI</title>
</head>
<body>
<big>Ein wenig Spielerei

</big><br>
<br>
Events werden auch hier wieder iim Consolenfenster angezeigt<br>
<br>
<form enctype="text/plain" method="post"
action="/demo2.html" name="test"> <input
name=";;text"><br>
</form>
<br>
<form enctype="text/plain" method="post"
action="/demo2.html" name="test1"><input
name=";;checkbox" type="checkbox"><br>
<input value="checkbox Senden" name=";;senden"
type="submit"><br>
<br>
</form>
<br>
<br>
<form enctype="text/plain" method="post"
action="/demo2.html" name="test1"><br>
<select size="5" name=";;Liste">
<option>soso</option>
<option>jaja</option>
</select>
<br>
<br>
<input value="Liste Senden" name=";;senden"
type="submit"><br>
<br>
<br>
<br>
<br>
</form>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>
Puhh, vor lauter schreiben und Einfügen habe ich gar keine Zeit mehr für meine Fragen.
Mach ich später.
Grüße