program HelloWorldWebServerX4_Arduino_Sensor; //{$APPTYPE CONSOLE minimal -extend autotimer IP Hoster to Arduino event} // get a temp value from arduino to serve with socks on a browser //#sign:Max: MAXBOX10: 05/02/2017 21:41:27 //uses SysUtils, IdContext, IdCustomHTTPServer, IdHTTPServer; ////https://youtu.be/xvKF3WQYADk aerosmith - sweet emotion function CreateMutex2(aobj : TObject; init: boolean; aname: pchar): Longint; external 'CreateMutexA@kernel32.dll stdcall'; Const COMPORT = 'COM3'; IPPORT = 8080; LOGFILE = 'arduino_temp36log7.txt'; JSCRIPT = 'C:\maXbox\softwareschule\IBZ_2016\IBZ_Prozesstechnik_2016\Uebungen\date_time.js'; var hlog1: THotlog; artimer: TTimer; jsload, tmpval,tmp2,aremoteip, HStarttime: string; function connectAndGetValue: string; forward; procedure HTTPServerCommandGet(thread: TIdPeerThread; ReqInfo: TIdHTTPRequestInfo; RespInfo: TIdHTTPResponseInfo); begin RespInfo.ResponseNo:= 200; //RespInfo.ContentText:= 'IBZ TimeTempServe: '//charset=UTF-8' // +DateTimeToInternetStr(Now,true)+': '+tmpval; reqinfo.document := exepath+'/'; aremoteip:= ReqInfo.remoteIP; RespInfo.ContentType:= 'text/HTML'; RespInfo.ContentText := ''+ ''+ 'My Arduino mXResponse'+ //''+ ''+ CRLF+''+CRLF+''+CRLF+ '

Welcome OpenC° & maXbox4 temptime

'+ '

************************************

'+ 'Command: ' +ReqInfo.Command+' of Temperature C°: '+tmpval+''+ '


Host: ' + ReqInfo.Host + ' C°: '+tmp2+ '
RemoteIP: '+ ReqInfo.remoteIP + '
Version: ' + ReqInfo.Version + '
Docpath: ' + ReqInfo.Document + '
Client: '+ ''+ '
Host Starttime: '+ HStarttime+ '
URI: ' + ReqInfo.URI + '
ServerContent SW: '+RespInfo.ServerSoftware+ '
UserAgent: ' + ReqInfo.UserAgent+'

'+ ''+ ''; //*) tmp2:= tmpval; hlog1.AddStr(DateTimeToStr(Now)+': '+tmpval+'>'+ReqInfo.remoteIP); end; procedure eventActTimer(sender: TObject); begin tmpval:= connectAndGetValue; writeln(datetimetostr(now)+' C°: '+tmpval+'° >'+aremoteIP) end; procedure StartLogger; begin if not FileExists(ExePath+LOGFILE) then begin CloseFileHandle(FileCreate(ExePath+LOGFILE)); sleep(500); end; hlog1:= THotlog.create; hlog1.hlWriter.hlFileDef.filename:= LOGFILE; hlog1.hlWriter.hlFileDef.path:= exepath; hlog1.hlWriter.hlFileDef.append:= true; writeln('Logfile: '+hlog1.hlWriter.hlFileDef.filename) //SetHotLogHeader(hlog1); hlog1.StartLogging; sleep(200) hlog1.Add('>>>> Start {App_name} v {App_ver}{40@}{now}'); hlog1.Add('{@12}From : '+'maxform1.appname'); end; function connectAndGetValue: string; begin with TBlockSerial.Create do begin Config(9600,8,'N',1,true,false); Connect(COMPORT); result:= RecvString(1800) //com timeout CloseSocket; Free; end; end; begin //@main //jsload:= filetostring(JSCRIPT) tmp2:= '0'; HStarttime:= DateTimeToInternetStr(Now,true) //TWebServerCreate; with TIdHTTPServer.Create(Nil) do begin sr:= GetIPfromHost(getHostName) //'172.16.10.80'; try Bindings.Add.IP:= sr; Bindings.Add.Port:= IPPORT; OnCommandGet:= @HTTPServerCommandGet; Active:= True; except writeln(ExceptionToString(ExceptionType, ExceptionParam)); Active:= False; Free; end; try StartLogger; If IsCOMPort then begin writeln('SerialPortNames Init: '+GetSerialPortNames); with TBlockSerial.Create do begin SetCommState; Free; end; end; arTimer:= TTimer.Create(Self); arTimer.Enabled:= true; arTimer.Interval:= 2000; arTimer.OnTimer:= @eventActTimer; //ConnectArduinoSense; Writeln('Hello Temp/Web server start at: '+sr); ShowMessageBig('maXbox HellTempWeb server at: '+sr+':'+itoa(IPPORT)+#1310+ ' Press OK to quit webserver!'+#13); finally writeln('SocketServer stop: '+timetoStr(now)); //Destroy; Active:= False; Free; hlog1.Add('<<<< Stop socktimer {App_name}{40@}{now}'); hlog1.Free; arTimer.enabled:= false; arTimer.Free; end; end; End. Ref: https://rosettacode.org/wiki/Hello_world/Web_server#Delphi add bindings & contenttype for more convention SetCommState; //'
URI: ' + ARequestInfo.params[1] + Task: - log the exception - reduce latency with open comport - fix the host start time Exception: Could not bind socket. Address and port are already in use. PrintF('Command %s received: %s of temperature C°: %s', [RequestInfo.Command,thread.connection.Socket.binding.PeerIP,tmp2]); Doc: Function DateTimeToInternetStr( const Value : TDateTime; const AIsGMT : Boolean) : String Function GetIPAddress( const HostName : string) : string Function GetIP( const HostName : string) : string Function GetIPHostByName(const AComputerName: String): String; function GetIPFromHost(const HostName: string): string; HTTPServer1.Bindings.Add.IP := '127.0.0.1'; HTTPServer1.Bindings.Add.Port := 50001; writeln(GetIPAddress(getHostName)); writeln(GetIP(getHostName)); writeln(GetIPHostByName(gethostname)); writeln(GetIPfromhost(gethostname)); //writeln(RecvBlock(1000)) //SendString('8') This is a common newbie mistake. You are creating two bindings, one bound to 127.0.0.1:DefaultPort, and one bound to 0.0.0.0:50001. You need one binding instead, that is bound to 127.0.0.1:50001 instead. with HTTPServer1.Bindings.Add do begin IP := '127.0.0.1'; Port := 50001; end; call example: procedure TDataFormbtnHTTPSendGetClick(Sender: TObject); var HTTPClient : TIdHTTP; responseStream : TMemoryStream; begin HTTPClient := TIdHTTP.Create(Nil); responseStream := TMemoryStream.Create; try try HTTPClient.Get1('http://127.0.0.1:8080', responseStream); responseStream.Seek(0, soFromBeginning); SetLength(Sr, responseStream.Size); responseStream.Read(Sr, responseStream.Size); writeln('response: '+sr) //writeln(': '+streamtoString3(responseStream)) except //on e : Exception do begin showmessage('Could not send get request to localhost, port 8080'); end; //end; finally //FreeAndNil(HTTPClient); HTTPClient.Free; HTTPClient:= Nil; responseStream.Free; end; end; //******************************Arduino to copy ************************ int incomingByte = 0; int gndPin = A1; // select the input pin for the potentiometer int sensePin = 2; //analog in int ledPin = 13; // select the pin for the LED int plusPin = A3; // variable to store the value coming from the sensor int cnt = 0; int ledPin8 = 8; int val = 0; void setup(){ Serial.begin(9600); pinMode(ledPin8,OUTPUT); // declare the LED's pin as output pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW); pinMode(plusPin, OUTPUT); digitalWrite(plusPin, HIGH); //Serial.begin(9600); pinMode(13, OUTPUT); } void loop(){ //data=analogRead(rfReceivePin); //listen for data on Analog pin 0 /*if (Serial.available() > 0) { incomingByte = Serial.read(); Serial.println(incomingByte, DEC); }*/ incomingByte = 0; int raw = analogRead(sensePin); float volts = raw / 205.0; float tempC = 100.0 * volts - 50; float tempF = tempC * 9.0/5.0+32.0; Serial.print(cnt); //Serial.print(DateTimeStrings()); Serial.print(" C.temp: "); Serial.println(tempC); // turn the ledPin on val = Serial.read(); // read the serial port if (val=='8'){ digitalWrite(ledPin8,HIGH); } if (val=='H'){ digitalWrite(ledPin8,LOW); } //if (timeStatus()!= timeNotSet) { //digitalClockDisplay(); //delay(1000); //digitalClockDisplay(); delay(1000); } //******************************Arduino to copy End************************ 7 LANguages_: 1. Object Pascal 2. Arduino C 3. Java Script 4. HTML 5. C# 6. Windows C API 7. UML ----code_cleared_checked_clean----