Data TILL en webbsida

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Maalobs
Inlägg: 1299
Blev medlem: 3 februari 2005, 14:35:15
Ort: Stockholm

Re: Data TILL en webbsida

Inlägg av Maalobs »

Jag ställde en fråga igår om hur du separerar response-headern från response-svaret, men du svarade inte på det.
Har du ens en response-header, som Nerre frågade, en fråga du för övrigt heller inte har svarat på.

Vad händer om du kör det här kommandot:

Kod: Markera allt

telnet 192.168.1.187 2000
I telnet-sessionen, skriv:

Kod: Markera allt

GET / HTTP/1.0

Avsluta med två radmatningar.
Det är det minimala som behövs för att göra ett HTTP 1.0-anrop.
Vad du sedan har implementerat i din webserver är en annan sak.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Data TILL en webbsida

Inlägg av Icecap »

Maalobs: jag har inte installerat sniffaren men jag har fått lite gång i det hela nu.

När jag detekterar "GET /" sätter jag en flagga. Denna flagga har ingen timeout - men den hänger ihop med en timer som räknas upp varje ms. Men kommer det en byte på den seriella porten från WLAN-modulen nollställs den timer.

När den timer når 200, alltså 200ms utan bytes från förfrågningen, skickas "hemsidan" ut i ett block. På mobilen fungerar det rimligt bra, jag har numera möjlighet att "fiska fram" de "sökvägar" jag har lagt i listan och sortera ut rätt data.

Enda som kvarstår ät att jag inte vet hur jag ska signalera att hemsidan är slut och att den är fullt uppdaterat. Och om detta har jag fått ett antal länkar som jag ska kolla på.

Och jag misstänker att det är denna brist på stopp som gör att FF inte visar sidan.

helst skulle jag vilja göra en App till Android som dels kan kolla om det finns fler enheter i närverket och dels bara prata direkt med en port så att jag ville få en sorts IP-seriell port.

Men Android SDK vägrar låta sig installeras...

EDIT: och svara på din fråga ska jag också:
Jag har inte på något tidpunkt blandat ihop förfrågan jag får ifrån browsern med de data jag skickar tillbaka! Browsern skickar frågan, jag fångar "GET /" och väntar på att allt har kommit, sedan skickar jag hemsidan, rått och brutalt. Hemsidan är (för tillfället) hårdkodad i programmet och jag saknar som skrivit ett sätt att signalera att allt är överförd.

Jag ska nog kolla lite på de handskakningssignaler som finns på WLAN-modulen men det känns ganska tydligt att jag måste sända en "rå" hemsida och att WLAN-modulen bara tar hand om TCP/IP överföringen.
Maalobs
Inlägg: 1299
Blev medlem: 3 februari 2005, 14:35:15
Ort: Stockholm

Re: Data TILL en webbsida

Inlägg av Maalobs »

OK, men bara för att klargöra; När du returnerar "hemsidan" som svar på GET-anropet, gör du det med en HTTP-header som allra minst ser ut så här:

Kod: Markera allt

HTTP/1.0 200 OK
Content-Type: text/html

Med två radmatningar på slutet, som signalerar slutet på headern och början på din HTTP-body, alltså din html-kod?

Det här är ett exempel på vad din webserver ska returnera på ett GET-anrop:

Kod: Markera allt

HTTP/1.0 200 OK
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
<META NAME="AUTHOR" CONTENT="xxxxxx AB">
<META NAME="CHANGEDBY" CONTENT="xxxxxx AB">
<STYLE TYPE="text/css">
</STYLE>
</HEAD>
<BODY LANG="sv-SE" DIR="LTR">
<P STYLE="margin-bottom: 0cm">V&auml;lkommen till xxxx's websida p&aring; remoten.</P>
<LI><a href="#10">V&auml;lj 10km/t</a></LI>
<LI><a href="#20">V&auml;lj 20km/t</a></LI>
<LI><a href="#30">V&auml;lj 30km/t</a></LI>
<LI><a href="#40">V&auml;lj 40km/t</a></LI>
<LI><a href="#50">V&auml;lj 50km/t</a></LI>
<LI><a href="#60">V&auml;lj 60km/t</a></LI>
<LI><a href="#70">V&auml;lj 70km/t</a></LI>
<LI><a href="#80">V&auml;lj 80km/t</a></LI>
<LI><a href="#90">V&auml;lj 90km/t</a></LI>
</BODY>
</HTML>
Är det vad din webserver returnerar till browsern när webservern får ett GET-anrop?
Du behöver ingen sniffer för det, du har skrivit koden men du kan trivialt bekräfta att det även blir som du tror, genom att testa med telnet som jag beskrev tidigare.

Specifikationen för HTTP 1.0:
http://www.isi.edu/in-notes/rfc1945.txt
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Data TILL en webbsida

Inlägg av Icecap »

Maalobs: tack först och främst! Jag är inte helt i mål men det får räcka för idag.

Sekvensen ser ut som följer:
* "GET /" dektekteras.
* Det väntas till 200ms efter sista byte har kommit in.
* Hemsidadatan skickas:

"\HTTP/1.0 200 OK\r\n" // Just tillagt
"Content-Type: text/html\r\n" // Just tillagt
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\r\n"
"<HTML>\r\n"
"<HEAD>\r\n"
"<META HTTP-EQUIV=\"CONTENT-TYPE\" CONTENT=\"text/html; charset=windows-1252\">\r\n"
osv osv. Slutar med:
"</BODY>\r\n"
"</HTML>\r\n"

Jag har kollat på handskakningen från WLAN-modulen och den rapportera att det inte finns hinder för att skyffla på med data.

Nu har jag ett par dagar - kanske till och med fredag - på arbetsresa så det får vila för tillfället.

Men en sak stör mig: på hemsidan jag skickar står det "*Hello*" först på sidan. Det finns nog någon Clear-Screen kommando men jag har inte hunnit dit än. Jag har dock fixat så att den lista jag har skrivit in i hemsidan har ju några "länkar" i, de består av "Select_xx" och jag fångar "Select_" och läser ut siffrornas värde och kan ha dom som inställningsdata.

Så "enda" kruxet är egentligen att browsern ska fatta att sidan är färdigladdad.
Nerre
Inlägg: 26700
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Data TILL en webbsida

Inlägg av Nerre »

Det ska vara ytterligare en tomrad efter

Kod: Markera allt

"\HTTP/1.0 200 OK\r\n" // Just tillagt
"Content-Type: text/html\r\n" // Just tillagt
Maalobs
Inlägg: 1299
Blev medlem: 3 februari 2005, 14:35:15
Ort: Stockholm

Re: Data TILL en webbsida

Inlägg av Maalobs »

Jag börjar känna mig tjatig, du har fortfarande inte separator mellan header och body, precis som Nerre sa.
Det är fascinerande hur du har försökt dig på att implementera ett kommunikationsprotokoll utifrån din fantasi om hur protokollet kan se ut, utan att titta i specifikationen eller ens titta på exempel på internet.
Vad brukar du säga om dem som angriper MCUer utan att öppna databladet..? :badgrin:

Den som söker, finner:

Kod: Markera allt

C:\>telnet elektronikforumet.com http
GET / HTTP/1.0
                                          <--- Observera två radmatningar här för att avsluta query-headern (finns ingen body efteråt)
HTTP/1.1 200 OK
Date: Tue, 10 Jun 2014 19:16:05 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze3
Vary: Accept-Encoding
Content-Length: 3226
Connection: close
Content-Type: text/html
                                          <--- Observera två radmatningar här för att avsluta response-headern (sedan kommer bodyn)
<html>
<head>
<title>Välkommen till Elektronikforumet.com</title>
<LINK REL="stylesheet" TYPE="text/css" HREF="/0_css/ef.css">
</head>
<body bgcolor="#ffffff" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
...
</body></html>
Connection to host lost.
C:\>
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Data TILL en webbsida

Inlägg av Icecap »

Den tomrad finns med, jag rensade bara bort den då jag kopierade in. Jag har även testat med att lägga en EOF (0x04) som sista tecken - men utan att det hjälpte. Nå, nu er det nattadags, har en lång bilfärd imorgon och en hel del jobb framför mig så det är viktigt att jag är utvilat.
Maalobs
Inlägg: 1299
Blev medlem: 3 februari 2005, 14:35:15
Ort: Stockholm

Re: Data TILL en webbsida

Inlägg av Maalobs »

Varför lägger du in skräptecken i HTTP-sessionen?
Vad tror du ska hända då, eller vad vill du ska hända?
Jag är förbryllad. :humm:

Du har fortfarande inte granskat specifikationen för HTTP, men ska man anta att du vill på något sätt signalera att TCP-sessionen ska avslutas?
Du behöver inte signalera något, du kan låta servern klippa TCP-sessionen tvärt med en TCP RST så fort den har flushat output-buffern på data, det är helt OK.
Om du verkligen vill signalera att TCP-sessionen ska avslutas, så finns det i HTTP 1.1 en response-header som heter Connection, som du kan ange med parameter close, då hintar du till browsern att TCP-sessionen inte ska persistas för fler HTTP-meddelanden.
Se sektion 14.10 i specifikationen för HTTP 1.1:
http://www.isi.edu/in-notes/rfc2616.txt

Du ser den även i mitt tidigare exempel med telnet mot elektronikforumet.com.

Ett stalltips; Alla Internet-protokollen använder ett 7-bittars textformat som heter NVT.
NVT är vad Telnet-klienten ska reverta till om inga IACs mottas från servern för att bestämma ett terminal-protokoll.
Därför kan man använda Telnet för att köra alla Internet-protokollen manuellt (HTTP, SMTP, POP3, osv), och om Microsoft inte hade fuckat upp en grundläggande funktion i öppna standarder, så hade deras telnet.exe i Windows haft local echo påslaget by default om NVT-läge uppnås.
nifelheim
Den första
Inlägg: 2325
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: Data TILL en webbsida

Inlägg av nifelheim »

I exempel programmen till Arduino WiFly biblioteket har dom gjort hälften av det du vill,

"Aim your browser at your WiFly address for a simple UTC time report.
Add /status to the URL to get battery voltage and RSSI.
or add /auto to get refreshes every 30 seconds."


kanske kan du sno lite kod där :) (eller iallafall få lite inspiration )


http://sourceforge.net/projects/arduinowifly/

Kod: Markera allt

/*
 * Web Server example for the WiFly showing the current time and some status items.
 *
 * Download Mikal Hart's Streaming and PString libraries from http://arduiniana.org
 *
 * Remember to set credentials to your local values.
 
 Aim your browser at your WiFly address for a simple UTC time report.
 Add /status to the URL to get battery voltage and RSSI.
 or add /auto to get refreshes every 30 seconds.
 
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.
 
 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.
 
 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 Copyright GPL 2.1 Tom Waldock 2011,2012
 */
#include <Arduino.h>
#include <Time.h>
#include <SoftwareSerial.h>
#include <Streaming.h>
#include <PString.h>
#include <WiFlySerial.h>
#include "MemoryFree.h"
#include "Credentials.h"


// Connect the WiFly TX pin to the Arduino RX pin  (Transmit from WiFly-> Receive into Arduino)
// Connect the WiFly RX pin to the Arduino TX pin  (Transmit from Arduino-> Receive into WiFly)
// 
// Connect the WiFly GND pin to an Arduino GND pin
// Finally, connect the WiFly BATT pin to the 3.3V pin (NOT the 5v pin)

#define ARDUINO_RX_PIN  2
#define ARDUINO_TX_PIN  3


prog_char s_WT_SETUP_000[] PROGMEM = "Arduino Rx Pin (connect to WiFly Tx):";  
prog_char s_WT_SETUP_001[] PROGMEM = "Arduino Tx Pin (connect to WiFly Rx):";  
prog_char s_WT_SETUP_01[] PROGMEM = "set u m 0x1";
prog_char s_WT_SETUP_02[] PROGMEM = "set comm remote 0";
prog_char s_WT_SETUP_03[] PROGMEM = "set comm idle 30";
prog_char s_WT_SETUP_04[] PROGMEM = "set comm time 1000";
prog_char s_WT_SETUP_05[] PROGMEM = "set comm size 128";
prog_char s_WT_SETUP_06[] PROGMEM = "set comm match 0x9";
prog_char s_WT_SETUP_07[] PROGMEM = "time";
prog_char s_WT_STATUS_SENSORS[] PROGMEM = "show q 0x177 ";
prog_char s_WT_STATUS_TEMP[] PROGMEM = "show q t ";
prog_char s_WT_STATUS_RSSI[] PROGMEM = "show rssi ";
prog_char s_WT_STATUS_BATT[] PROGMEM = "show battery ";
prog_char s_WT_MSG_JOIN[] PROGMEM = "Credentials Set, Joining ";
prog_char s_WT_MSG_LEAVE[] PROGMEM = "Leaving current wifi ... ";
prog_char s_WT_MSG_START_WEBTIME[] PROGMEM = "Starting WebTime - Please wait. ";
prog_char s_WT_MSG_RAM[] PROGMEM = "RAM :";
prog_char s_WT_MSG_START_WIFLY[] PROGMEM = "Started WiFly, :";
prog_char s_WT_MSG_WIFI[] PROGMEM = "Initial WiFi Settings :";
prog_char s_WT_MSG_APP_SETTINGS[] PROGMEM = "Configure WebTime Settings...";
prog_char s_WT_MSG_AIM_BROWSER[] PROGMEM = "Aim your browser at ( /status and /auto optional): ";
prog_char s_WT_MSG_HTTP_READY[] PROGMEM = "Ready for HTTP Requests. ";
prog_char s_WT_MSG_TIMEOUT[] PROGMEM = "Timed out waiting for next customer. ";
prog_char s_WT_HTML_HEAD_01[] PROGMEM = "HTTP/1.1 200 OK \r ";
prog_char s_WT_HTML_HEAD_02[] PROGMEM = "Content-Type: text/html;charset=UTF-8\r ";
prog_char s_WT_HTML_HEAD_03[] PROGMEM = " Content-Length: ";
prog_char s_WT_HTML_HEAD_04[] PROGMEM = "Connection: close \r\n\r\n ";
prog_char s_WT_HTML_HEAD_05[] PROGMEM = "<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"30\">";

#define IDX_WT_SETUP_000 0
#define IDX_WT_SETUP_001 1
#define IDX_WT_SETUP_01 IDX_WT_SETUP_001 +1
#define IDX_WT_SETUP_02 IDX_WT_SETUP_01 +1
#define IDX_WT_SETUP_03 IDX_WT_SETUP_02 +1
#define IDX_WT_SETUP_04 IDX_WT_SETUP_03 +1
#define IDX_WT_SETUP_05 IDX_WT_SETUP_04 +1
#define IDX_WT_SETUP_06 IDX_WT_SETUP_05 +1
#define IDX_WT_SETUP_07 IDX_WT_SETUP_06 +1

#define IDX_WT_STATUS_SENSORS    IDX_WT_SETUP_07 +1
#define IDX_WT_STATUS_TEMP       IDX_WT_STATUS_SENSORS +1
#define IDX_WT_STATUS_RSSI       IDX_WT_STATUS_TEMP +1
#define IDX_WT_STATUS_BATT       IDX_WT_STATUS_RSSI +1

#define IDX_WT_MSG_JOIN          IDX_WT_STATUS_BATT +1
#define IDX_WT_MSG_LEAVE         IDX_WT_MSG_JOIN +1
#define IDX_WT_MSG_START_WEBTIME IDX_WT_MSG_JOIN +2
#define IDX_WT_MSG_RAM           IDX_WT_MSG_JOIN +3
#define IDX_WT_MSG_START_WIFLY   IDX_WT_MSG_JOIN +4
#define IDX_WT_MSG_WIFI          IDX_WT_MSG_JOIN +5
#define IDX_WT_MSG_AIM_BROWSER   IDX_WT_MSG_JOIN +6
#define IDX_WT_MSG_HTTP_READY    IDX_WT_MSG_JOIN +7
#define IDX_WT_MSG_TIMEOUT       IDX_WT_MSG_JOIN +8
#define IDX_WT_MSG_APP_SETTINGS  IDX_WT_MSG_JOIN +9

#define IDX_WT_HTML_HEAD_01      IDX_WT_MSG_APP_SETTINGS + 1
#define IDX_WT_HTML_HEAD_02      IDX_WT_HTML_HEAD_01 + 1
#define IDX_WT_HTML_HEAD_03      IDX_WT_HTML_HEAD_01 + 2
#define IDX_WT_HTML_HEAD_04      IDX_WT_HTML_HEAD_01 + 3
#define IDX_WT_HTML_HEAD_05      IDX_WT_HTML_HEAD_01 + 4



PROGMEM const char *WT_string_table[] = 	   
{   
  s_WT_SETUP_000,
  s_WT_SETUP_001,
  s_WT_SETUP_01,
  s_WT_SETUP_02,
  s_WT_SETUP_03,
  s_WT_SETUP_04,
  s_WT_SETUP_05,
  s_WT_SETUP_06,
  s_WT_SETUP_07,
  s_WT_STATUS_SENSORS,
  s_WT_STATUS_TEMP,
  s_WT_STATUS_RSSI,
  s_WT_STATUS_BATT,
  s_WT_MSG_JOIN,
  s_WT_MSG_LEAVE,
  s_WT_MSG_START_WEBTIME,
  s_WT_MSG_RAM,
  s_WT_MSG_START_WIFLY,
  s_WT_MSG_WIFI,
  s_WT_MSG_AIM_BROWSER,
  s_WT_MSG_HTTP_READY,
  s_WT_MSG_TIMEOUT,
  s_WT_MSG_APP_SETTINGS,
  s_WT_HTML_HEAD_01,
  s_WT_HTML_HEAD_02,
  s_WT_HTML_HEAD_03,
  s_WT_HTML_HEAD_04,
  s_WT_HTML_HEAD_05
};

#define REQUEST_BUFFER_SIZE 80
#define HEADER_BUFFER_SIZE 120 
#define BODY_BUFFER_SIZE 180
#define TEMP_BUFFER_SIZE 80

char bufRequest[REQUEST_BUFFER_SIZE];
char bufTemp[TEMP_BUFFER_SIZE];
char chMisc;
int iRequest = 0;
int iTrack = 0;

WiFlySerial wifi(ARDUINO_RX_PIN ,ARDUINO_TX_PIN);

// WFSServer server(80);

// Function for setSyncProvider
time_t GetSyncTime() {
  time_t tCurrent = (time_t) wifi.getTime();
  wifi.exitCommandMode();
  return tCurrent;
}

// GetBuffer_P
// Returns pointer to a supplied Buffer, from PROGMEM based on StringIndex provided.
// based on example from http://arduino.cc/en/Reference/PROGMEM
// Reduced need with Arduino's 1.0 F().  

char* GetBuffer_P(const int StringIndex, char* pBuffer, int bufSize) { 
  strncpy_P(pBuffer, (char*)pgm_read_word(&(WT_string_table[StringIndex])), bufSize);  
  return pBuffer; 
}

// Reconnects to a wifi network.
// DHCP is enabled explicitly.
// You may need to add the MAC address to your MAC filter list.
// Static IP settings available if needed.
boolean Reconnect() {

  wifi.SendCommand(GetBuffer_P(IDX_WT_SETUP_01,bufTemp,TEMP_BUFFER_SIZE), ">",bufRequest, REQUEST_BUFFER_SIZE);
  wifi.setDHCPMode(WIFLY_DHCP_CACHE );
  wifi.SendCommand(GetBuffer_P(IDX_WT_SETUP_02,bufTemp,TEMP_BUFFER_SIZE),">",bufRequest, REQUEST_BUFFER_SIZE);
  Serial << GetBuffer_P(IDX_WT_MSG_LEAVE,bufTemp,TEMP_BUFFER_SIZE) << wifi.leave() << endl;
  // join
  wifi.setPassphrase(passphrase);    
  Serial << GetBuffer_P(IDX_WT_MSG_JOIN,bufTemp,TEMP_BUFFER_SIZE) << ssid << endl;
  wifi.join(ssid);

  // Set NTP server, update frequency, 
  wifi.setNTP(ntp_server); 
  wifi.setNTP_Update_Frequency(" 15");
  // don't send *HELLO* on http traffic
  // close idle connections after n seconds
  // give enough time for packet data to arrive
  // make data packet size sufficiently large
  // send data packet when a \t appears in stream
  //  force time resync.

  // Configure application-specific settings

  Serial << GetBuffer_P(IDX_WT_MSG_APP_SETTINGS, bufTemp, TEMP_BUFFER_SIZE) << endl;
  for (int i = 0; i< 7 ; i++) {
    wifi.SendCommand(GetBuffer_P(IDX_WT_SETUP_01 + i,bufTemp,TEMP_BUFFER_SIZE),">",bufRequest, REQUEST_BUFFER_SIZE);
  }

  wifi.getDeviceStatus();
  setTime( wifi.getTime() );
  delay(1000);
  setSyncProvider( GetSyncTime );

  // reboot if not working right yet.
  iTrack++;
  if ( iTrack > 5 ) {
    wifi.reboot();
    iTrack = 0;
  }

}

// Make Response Body
// Based on GET request string, generate a response.
int MakeReponseBody( char* pBody,  char* pRequest, const int sizeRequest ) {

  PString strBody( pBody, BODY_BUFFER_SIZE);

  if ( strstr(pRequest, "/status" ) ) {
    strBody << F("<html>WebTime Status:</br>Free RAM:") << freeMemory() << "</br>"
      << F("DateTime:") << year() << "-" << month() << "-" << day() << " " << _DEC(hour()) << ":" << minute() << ":" << second() << "</br>";
    strBody << F("Battery: ") << wifi.getBattery(bufTemp,TEMP_BUFFER_SIZE) << "</br>";    
    strBody << F("RSSI: ") << wifi.getRSSI(bufTemp,TEMP_BUFFER_SIZE) << "</br>";
    strBody << F("</html>\r\n\r\n");

    // need to exit command mode to be able to send data
    wifi.exitCommandMode();

  } else {
    if ( strstr(pRequest,"/auto") ) {
      strBody << GetBuffer_P(IDX_WT_HTML_HEAD_05,bufTemp,TEMP_BUFFER_SIZE);
    }
    strBody << F("<html>Current request:") << pRequest << F("</br>Millis:") << millis() << F(" Micros:") << micros()
      << F("</br>DateTime:") << year() << "-" << month() << "-" << day() << " " << hour() << ":" << minute() << ":" << second()
        << F("</html>");
    // No calls back to WiFly command mode; hence no need to exit Command mode that wasn't entered.
  }
  return strBody.length();
}

// MakeResponseHeader
// Form a HTML header, including length of body.
int MakeResponseHeader( char* pHeader, char* pBody ) {

  PString strHeader( pHeader, HEADER_BUFFER_SIZE);
  // send a standard http response header    

  strHeader << GetBuffer_P(IDX_WT_HTML_HEAD_01,bufTemp,TEMP_BUFFER_SIZE)
    << GetBuffer_P(IDX_WT_HTML_HEAD_02,bufTemp,TEMP_BUFFER_SIZE)
      << GetBuffer_P(IDX_WT_HTML_HEAD_03,bufTemp,TEMP_BUFFER_SIZE) << (int) strlen(pBody) << " \r"
        << GetBuffer_P(IDX_WT_HTML_HEAD_04,bufTemp,TEMP_BUFFER_SIZE);

  return strHeader.length();
}


// Arduino Setup routine.

void setup() {
  Serial.begin(9600);
 
  Serial << GetBuffer_P(IDX_WT_MSG_START_WEBTIME,bufTemp,TEMP_BUFFER_SIZE) << endl << GetBuffer_P(IDX_WT_MSG_RAM,bufTemp,TEMP_BUFFER_SIZE) << freeMemory() << endl
    << GetBuffer_P(IDX_WT_SETUP_000,bufTemp,TEMP_BUFFER_SIZE) << ARDUINO_RX_PIN << endl << GetBuffer_P(IDX_WT_SETUP_001,bufTemp,TEMP_BUFFER_SIZE) << ARDUINO_TX_PIN << endl;

  wifi.begin();
  Serial << GetBuffer_P(IDX_WT_MSG_START_WIFLY,bufTemp,TEMP_BUFFER_SIZE) <<  wifi.getLibraryVersion(bufTemp, TEMP_BUFFER_SIZE) << "  RAM:" << freeMemory() << endl;

  // get MAC
  Serial << F("MAC: ") << wifi.getMAC(bufRequest, REQUEST_BUFFER_SIZE) << endl;
  
  // Change these to fit your local situation
  
  wifi.setAuthMode( WIFLY_AUTH_WPA2_PSK);
  wifi.setJoinMode(  WIFLY_JOIN_AUTO );
  wifi.setDHCPMode( WIFLY_DHCP_ON );

  Reconnect();
  
  // Set timezone adjustment: PST is -8h.  Adjust to your local timezone.
  adjustTime( (long) (-8 * 60 * 60) );
  Serial << F("DateTime:") << year() << "-" << month() << "-" << day() << " " << hour() << ":" << minute() << ":" << second() << F(" PST") << endl;

  Serial << GetBuffer_P(IDX_WT_MSG_WIFI,bufTemp,TEMP_BUFFER_SIZE) << endl  
    << F("IP: ") << wifi.getIP(bufRequest, REQUEST_BUFFER_SIZE) << endl
    << F("Netmask: ") << wifi.getNetMask(bufRequest, REQUEST_BUFFER_SIZE) << endl
    << F("Gateway: ") << wifi.getGateway(bufRequest, REQUEST_BUFFER_SIZE) << endl
    << F("DNS: ") << wifi.getDNS(bufRequest, REQUEST_BUFFER_SIZE) << endl
    << F("RSSI: ") << wifi.getRSSI(bufRequest, REQUEST_BUFFER_SIZE) << endl
    << F("battery: ") <<  wifi.getBattery(bufRequest, REQUEST_BUFFER_SIZE) << endl;
 memset (bufRequest,'\0',REQUEST_BUFFER_SIZE);

  // close any open connections
  wifi.closeConnection();
  Serial << F("After Setup RAM:") << freeMemory() << endl ;
  Serial << GetBuffer_P(IDX_WT_MSG_AIM_BROWSER,bufTemp,TEMP_BUFFER_SIZE) << wifi.getIP(bufRequest, REQUEST_BUFFER_SIZE) << endl;
  
  //  wifi.setDebugChannel( (Print*) &Serial);

  // server.begin();
  

}


void loop() {

  memset (bufRequest,'\0',REQUEST_BUFFER_SIZE);
  Serial << F("Loop RAM:") << freeMemory() << endl ;

  // wifi.setDebugChannel( (Print*) &Serial);
  //  wifi.clearDebugChannel();
  
  wifi.getDeviceStatus();
  // if not connected restart link
  while (! wifi.isAssociated() ) {
    Reconnect();
  } // while not connected
//    wifi.clearDebugChannel();

//  Serial << "Clear leftovers" << endl;
  // read past the browser's header details
  while ((chMisc = wifi.read()) > -1) {
    Serial << chMisc;
  }
  
  Serial << GetBuffer_P(IDX_WT_MSG_HTTP_READY,bufTemp,TEMP_BUFFER_SIZE) << freeMemory() << endl ;
    
  iRequest = wifi.serveConnection();
  if (  iRequest  ) {
    memset (bufRequest,'\0',REQUEST_BUFFER_SIZE);
    //wifi.bWiFlyInCommandMode = false;
    Serial << F("Connected ") << endl;
    // analyse request for GET;
    wifi.ScanForPattern( bufRequest, REQUEST_BUFFER_SIZE, " HTTP/1.1", 1000 );
    Serial << F("GET request,  bytes: ") << strlen(bufRequest) << endl << bufRequest << endl;

    // read past the browser's header details
    while ((chMisc = wifi.read()) > -1)
      Serial << chMisc;

    char* pHeader = (char*) malloc(HEADER_BUFFER_SIZE);
    char* pBody = (char*) malloc(BODY_BUFFER_SIZE);

    // Form header and body of response
    MakeReponseBody(pBody,  bufRequest, REQUEST_BUFFER_SIZE);
    MakeResponseHeader( pHeader,  pBody);

    // send reply.  note the \t, whch is the end-of-packet signal for wifly, as set in SET MATCH 0x09 above.
    
    wifi << pHeader << pBody << "\r\n\r\n" << "\t";

    // give the web browser time to receive the data
    // NewSoftSerial will trickle data up to the WiFly in the background after print stmt completed.
    // settings are conservative ... more rapid responses possible by calcuguessing message length / (baudrate / bits/byte) x SomeFudgeFactor x milliseconds
    // baud bits/byte is >8 and < 10 by the time ecc figured in.
    // and subtract estimated time to send 'close' command (1000 ms?)
    // 
    int iDelay = ( ( (strlen(pHeader) + strlen(pBody))/ (9600/10) ) * 1000 ) - 1000;
    
    delay( ( iDelay < 0 ? 0 : iDelay) )  ;

    Serial << endl << F("Header:") << endl << pHeader << F("Body:") << pBody << endl;
    
    // close connection
    wifi.closeConnection();
    
    // release memory back to pool - even if freeMemory() doesn't recognize it.
    // Note: release AFTER connection closed and writing completed.

    free(pHeader);
    free(pBody);
    pHeader = NULL;
    pBody = NULL;

  } else {
    // Timout - no clients.  Do stuff, then go back to waiting.
    // A larger timeout value would be good as well.
    Serial << GetBuffer_P(IDX_WT_MSG_TIMEOUT,bufTemp,TEMP_BUFFER_SIZE)
        << year() << "-" << month() << "-" << day() << " " << hour() << ":" << minute() << ":" << second() << endl;
  }  // if Open connection found.
}


Maalobs
Inlägg: 1299
Blev medlem: 3 februari 2005, 14:35:15
Ort: Stockholm

Re: Data TILL en webbsida

Inlägg av Maalobs »

Fick du till det med webservern?
Sockets kan man programmera mot från många olika abstraktionslager beroende på vilka libbar man väljer.
Du är ju ganska hardcore så jag antar att du kör lågnivå, det finns en bok i tre volymer som heter TCP/IP Illustrated, som på ett bra och detaljerat sätt beskriver protokollen, implementationen och diverse verktyg för att jobba med sockets.
Alla volymerna finns säkert att hitta på nätet, och för en grundkurs i lowlevel socket-programming skulle jag rekommendera kapitel 15, 16, 17 samt introduktionen till Telnet-protokollet (som beskriver NVT) i volym 2, samt kapitel 13 i volym 3 som beskriver HTTP på ett bra sätt.
Jag läste mycket i de böckerna för ca 16-18 år sedan, det har varit oerhört nyttig kunskap i felsökningar i min karriär. :tumupp: :tumupp:
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Data TILL en webbsida

Inlägg av Icecap »

Jag har inte hunnit vidare med detta då andra uppgifter har varit mer prioriterade men jag ska försöka ta med råden när jag kommer igång igen.
MiaM
Inlägg: 9964
Blev medlem: 6 maj 2009, 22:19:19

Re: Data TILL en webbsida

Inlägg av MiaM »

Installera sniffer! *tjatar*
Skriv svar