Capire chi si connette al tuo sito [RISOLTO]

come posso capire chi si collega al sito creato da un arduino, via wifi? mi serve per far rispondere in maniera diversa in base al dispositivo...

Ma ti interessa solo capire quale tipo di dispositivo (ossia di browser) o proprio la postazione?
Perché nel primo caso ti potrebbe bastare analizzare le intestazioni inviate con la request ed analizzare la riga "User-Agent" (puoi trovare tutte le info in rete sul formato dello user agent) in base alla quale puoi avere varie informazioni come browser, sistema operativo ed altro, mentre nel secondo caso potresti utilizzare i "cookie" (sai cosa sono e come si usano?) anche se ci sojono alcune limitazioni. Ossia se il browser del visitatore non ha un tuo particolare cookie (che so, "ArduinoServer") ne generi uno, lo memorizzi, e lo invii nella risposta.

Quindi direi spiega meglio in pratica cosa cerchi di fare, così possiamo darti risposte più precise.

grazie per la risposta!!!
il dispositivo è quello che mi interessa, volevo fare in modo che l'Arduino rispondesse in maniera diversa in base al dispositivo che si connette...
grazie :slight_smile:

mi servirebbe poter rispondere in maniera diversa in base a chi si collega... tramite l'arduino uno wifi rev 2

Sbaglio o l'Arduino che usi utilizza la libreria WiFiNINA? E non ti basta il metodo client.remoteIP() così da avere l'IP di chi si collega e poterlo identificare? Saprai bene l'IP dei vari dispositivi che si collegano ... :roll_eyes:

Guglielmo

1 Like

La richiesta è un po' ambigua... Vuoi distinguere tra

  • uno che si collega con pc rispetto a uno che si collega da dispositivo mobile?
  • tua zia rispetto a tua cugina?

Te l'ho scritto, devi usare i cookie, se applicabili, altrimenti in generale non hai alcun modo di identificare univocamente "chi si collega".
Intanto questi client cosa sono? Altri apparati (quali?) nella stessa rete? O solo browser di PC in casa? Hanno IP statico o usano il DHCP? Oppure sono (anche?) connessioni provenienti (anche) da internet?

Tra l'altro non conoscendo l'ambito di applicazione non sappiamo se l'IP, che ti ha consigliato Guglielmo, sia sufficiente. I PC locali spesso sono in DHCP quindi non è detto che abbiano sempre lo stesso IP, se poi chi si collega proviene da internet è possibile che "remoteIP" ti dia l'IP del router (quindi stesso IP per tutti i device della sottostante rete privata) o del proxy (ad esempio se il visitatore è una azienda, in tal caso devi esaminare altri header, come "X-ForwardedFor").

1 Like

la seconda...

ok, il wifi è privato e non credo che cambi l'indirizzo IP...

grazie... Appena riesco provo

Normalmente ogni dispositivo a un MAC univoco (che il router riconosce) e, quasi tutti, i router permettono di asseganre sempre lo stesso IP ad un determinato dispositivo. :wink:

Guglielmo

ok, grazie! Ora provo...

non riesco a far cambiare quello che fa in base al dispositivo, ma sul sito vedo l'IP

Scusa, non ho capito cosa non riesci a fare ... :roll_eyes:

Guglielmo

Non è detto che l'assegnazione in base al MAC (il "lease") sia per un tempo ("lease time") indefinito, magari è relativamente lungo (es. 60 giorni) ma non indefinito, quindi potrebbe ad un certo momento cambiare. Io preferisco impostare assegnazioni MAC-IP fisse ossia senza scadenza, o al limite impostare i device con IP statico (ed esterno al range del DHCP).

Ma hai letto quello che ho scritto? :open_mouth:

Ho detto che ci sono router, come i Fritz!box che permettono di assegnare SEMPRE lo stesso IP ad un dispositivo, NON che lo lasci fare dinamicamente.

Guglielmo

Certo che ho letto, ma mi spiace dissentire, per vari motivi.
Primo, "ci sono router" non significa "tutti i router del mondo" e non sapendo il nostro amico cosa abbia e come l'abbia impostato, non si può fare questa affermazione.
Secondo, il mio Fritz!Box 7530 ha come valore predefinito di lease time (Rete, Impostazioni di rete, Impostazioni ipv4, Validità) 10 giorni, per cui non è vero che TUTTI i Fritz!Box assegnano sempre lo stesso IP indefinitamente.
Terzo, l'assegnazione per un tempo "infinito" può significare prima o poi l'esaurimento degli indirizzi IP disponibili nel range previsto per il DHCP, e non è molto utile né a mio avviso consigliabile.

Quindi ripeto, per le periferiche (soprattutto quelle IoT come Arduino, smart devices, eccetera) che devono essere raggiungibili staticamente meglio assegnare un IP fisso tramite mappatura del MAC, ossia (per il Fritz!box) andare nelle connessioni di rete, modificare il device interessato e selezionare l'opzione "Assegnare a questo dispositivo di rete sempre lo stesso indirizzo IPv4" e QUEL client avrà sempre lo stesso IP.

EDIT: tra l'altro per semplificare le configurazioni io uso i broadcast UDP per "chiedere" quali dei miei device ci sono, e quali sono i relativi indirizzi IP, e regolarmi di conseguenza in modo dinamico, ma questa è un'altra storia...

1 Like

E nulla, continuni a NON leggere ...
... HO DETTO CHE E' UN OPZIONE CHE SI PUÒ IMPOSTARE NON CHE LO HA COME VALORE PREDEFINITO !!!

Dopo di che ... ci sono oltre 250 indirizzi IP in una rete privata, hai voglia ...

Guglielmo

1 Like

il codice è il seguente:

/*

  WiFi Web Server LED Blink

  A simple web server that lets you blink an LED via the web.

  This sketch will create a new access point (with no password).

  It will then launch a new server and print out the IP address

  to the Serial monitor. From there, you can open that address in a web browser

  to turn on and off the LED on pin 13.

  If the IP address of your board is yourAddress:

    http://yourAddress/H turns the LED on

    http://yourAddress/L turns it off

  created 25 Nov 2012

  by Tom Igoe

  adapted to WiFi AP by Adafruit

 */
 int mostra_info=1;
 int giri=0;
 int potenza=0;
 int valore_ventilatore=0;
 int ventilatore;
#include <CapacitiveSensor.h>
CapacitiveSensor capSensor = CapacitiveSensor(4,2);
#include <SPI.h>
#include <WiFiNINA.h>
#include "arduino_secrets.h"
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0;                // your network key Index number (needed only for WEP)
int status = WL_IDLE_STATUS;
int connessi =0;
WiFiServer server(80);

void setup() {

  //Initialize serial and wait for port to open:

  Serial.begin(9600);

  while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only

  }

  Serial.println("Access Point Web Server");

  pinMode(5, OUTPUT);      // set the LED pin mode

  // check for the WiFi module:

  if (WiFi.status() == WL_NO_MODULE) {

    Serial.println("Communication with WiFi module failed!");

    // don't continue

    while (true);

  }

  String fv = WiFi.firmwareVersion();

  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {

    Serial.println("Please upgrade the firmware");

  }

  // by default the local IP address of will be 192.168.4.1

  // you can override it with the following:

  // WiFi.config(IPAddress(10, 0, 0, 1));

  // print the network name (SSID);

  Serial.print("Creating access point named: ");

  Serial.println(ssid);

  // Create open network. Change this line if you want to create an WEP network:

  status = WiFi.beginAP(ssid, pass);

  if (status != WL_AP_LISTENING) {

    Serial.println("Creating access point failed");

    // don't continue

    while (true);

  }

  // wait 10 seconds for connection:

  delay(10000);
status = WiFi.beginAP(ssid, pass);
while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }
 
  // wait 10 seconds for connection:


  // start the web server on port 80

  server.begin();

  // you're connected now, so print out the status

  printWiFiStatus();
}

void loop() {

    

  if(ventilatore==0){
    digitalWrite(5, LOW);
  }
    if(ventilatore==1){
    digitalWrite(5, HIGH);
  }




  
  //analogWrite(5, ventilatore);
  // compare the previous status to the current status

  if (status != WiFi.status()) {

    // it has changed update the variable

    status = WiFi.status();

    if (status == WL_AP_CONNECTED) {

      // a device has connected to the AP

      Serial.println("Device connected to AP");

    } else {

      // a device has disconnected from the AP, and we are back in listening mode

      Serial.println("Device disconnected from AP");

    }

  }



  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,

    Serial.println("new client");           // print a message out the serial port

    String currentLine = "";                // make a String to hold incoming data from the client

    while (client.connected()) {            // loop while the client's connected

      if (client.available()) {             // if there's bytes to read from the client,

        char c = client.read();             // read a byte, then

        Serial.write(c);                    // print it out the serial monitor

        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.

          // that's the end of the client HTTP request, so send a response:
int connessi=client.available();
          if (currentLine.length() == 0) {

            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)

            // and a content-type so the client knows what's coming, then a blank line:

            client.println("HTTP/1.1 200 OK");

            client.println("Content-type:text/html");


            // the content of the HTTP response follows the header:
              //client.println("Refresh: 2");
              client.println();
              client.print(client.remoteIP());
              if(client.remoteIP() == "192.168.1.145"){
                client.print("<a href=\"/on\">on</a>-<a href=\"/off\">off</a> valore corrente: ");
                if(ventilatore==1){
  client.print("on<br>");
}
if(ventilatore==0){
  client.print("off<br>");
}
client.print("comandi avanzati: <a href=\"/mostra_info\">mostra_info</a>-<a href=\"/nascondi_info\">nascondi_info</a> stato corrente: ");
if(mostra_info==1){
  client.print("visibili");
}
if(ventilatore==0){
  client.print("nascoste");
}
  

              }
              else{
                             if(mostra_info==1){
              client.print("<a href=\"/on\">on</a>-<a href=\"/off\">off</a> valore corrente: ");
             
//<br>
if(ventilatore==1){
  client.print("on");
}
if(ventilatore==0){
  client.print("off");
}
              }
              }
 


                       client.println();

            // break out of the while loop:

            break;

          }

          else {      // if you got a newline, then clear currentLine:

            currentLine = "";

          }

        }

        else if (c != '\r') {    // if you got anything else but a carriage return character,

          currentLine += c;      // add it to the end of the currentLine

        }

        // Check to see if the client request was "GET /H" or "GET /L":

        if (currentLine.endsWith("GET /on")) {
ventilatore=1;        
}
        if (currentLine.endsWith("GET /off")) {
ventilatore=0;        
}
         if (currentLine.endsWith("GET /mostra_info")) {
mostra_info=1;        
}       
        if (currentLine.endsWith("GET /nascondi_info")) {
mostra_info=0;        
}
 

      }

    }

    // close the connection:

    client.stop();

    Serial.println("client disconnected");

  }


}

void printWiFiStatus() {

  // print the SSID of the network you're attached to:

  Serial.print("SSID: ");

  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:

  IPAddress ip = WiFi.localIP();

  Serial.print("IP Address: ");

  Serial.println(ip);

  // print where to go in a browser:

  Serial.print("To see this page in action, open a browser to http://");

  Serial.println(ip);

}

dovrebbe rispondere in maniera diversa al dispositivo (il mio pc) che ha l'indirizzo IP 192.168.1.145... invece sul sito vedo l'indirizzo IP del dispositivo (192.168.1.145), ma mi risponde sempre nello stesso modo, come dovrebbe rispondere agli altri dispositivi...
ovviamente sul sito vedo anche altro...

Stiamo dicendo allora la stessa cosa ma in modi diversi...