Go Down

Topic: No puedo obtener variables de un string (Read 316 times) previous topic - next topic

mathias1994

Jul 06, 2018, 12:58 am Last Edit: Jul 06, 2018, 02:20 am by mathias1994 Reason: Titulo editado
Hola a todos necesito que me ayuden a poder tener 2 variables de un string ya que e buscado las funciones pero no las entiendo muy bien.
Yo quiero que a partir de un string pueda sacar 2 variables con nombre de usuario y contraseña que son variables.

string: setting?ssid=mathias&passwd=12345

quiero obtener esto
variable1:mathias
variable2:12345

e intentado con indexOf pero me devuelve -1 les dejo el codigo


Code: [Select]
void cliente(){
WiFiClient client = server.available();
if (!client) {
  return;
}

if (client)                                  // En caso afirmativo
    {  boolean currentLineIsBlank = true;
       while (client.connected())
         { if (client.available())           // Hay algo pendiente de leer
             { char c = client.read();
              if (readString.length() < 100) {  //almacena caracteres en string          
                     readString += c;
                    int nombre = readString.indexOf('?'+4);
                    int pass = readString.indexOf('&'+6);
                    int signo = readString.indexOf('=');
                    String ssid = readString.substring(nombre,signo);
                    String passwd = readString.substring(pass);
                    }    
                     if (c == '\n') {      //si HTTP a terminado
                   
                     }

       client.print("<!DOCTYPE HTML>\r\n<html>pagina de configuracion de conexion wifi");
      client.println("<p>");
      client.println(st);
      client.println("</p><form method='get' action='setting'><label>SSID: </label><input name='ssidd' length=32><input name='passs' length=64><input type='submit'></form>");
      client.print("</html>");
      break;  
      if (c == '\n')
                    currentLineIsBlank = true;
               else if (c != '\r')
                    currentLineIsBlank = false;
            } // if (client.available
         }   // WHile
      delay(40);      // dar tiempo
    }
}


sino una manera de poder leer el textbox y guardarlo en una variable char. espero que me ayuden muchas gracias.

surbyte


Kike_GL

Deberias usar el motodo substring(). Consulta arduwiki para saber mas
Saludos, Kike_GL

ArduMyth

#3
Jul 11, 2018, 05:13 pm Last Edit: Jul 11, 2018, 05:14 pm by ArduMyth
En cualquier lenguaje indexOf retorna -1 si no encuentra dicha coincidencia, es decir no puede devolverte la posición donde se encuentra ese caracter porque no existe.

La manera en la que "spliteas" (perdón por el spanglish) la cadena está mal.
Tu base es correcta, obtienes el índice con indexOf y separas son Substring.
Pero lo haces mal.

Primero lee la cadena al completo, no vayas caracter a caracter. Luego es cuando separas.
Y la posición no es ni con ? ni con & los parámetros siempre están (en tu caso obsoleto) tras los =

Eso sí, deberás comprobar antes que dicho signo sea precedido de un ? o de un &.

Ahora bien :) si usaras url amigables ¿Sabes lo fácil que sería para ti obtener esos parámetros?
Los ejemplos de Arduino + parte web son horribles. No son personas acostumbradas a la parte de frontEnd y backEnd, quiero decir que ya sea por falta de conocimientos en la parte web o por ir directos a la parte de Arduino, la parte web es basura.
Así que no te guíes por sus métodos arcaicos e igual que aprendes a hacer Arduino bien, lo mismo con el resto.

Al hacer copiar y pegar de esos errores ustedes se siguen complicando. Es taan fácil tener un .htaccess en la carpeta (Es que hay webs que te los crean [modo vago] )

No es complicado, sería aún más simple con expresiones regulares, peeeero, eso no existe en Arduino :)
Por tanto lo dicho, cadena completa, indexOf() y después separas.
Recuerda las cadenas son una colección de char, luego puedes separar y concatenar también usando el String con los índices a modo de Array.

Saludos.

mathias1994

Muchas gracias a todos por contestar, estuve leyendo indexof, substring y eso pero no puedo hacer el código me podrían poner uno de ejemplo a si lo miro y  veo como es muchas gracias.

surbyte

google: Arduino substring o arduino indexof y tendras tus ejemplos.

mathias1994

OK muchas gracias! ya hace rato que vengo buscando en google y en todos esos lados si opte por estar en este foro es porque necesito ayuda de ustedes, pero igual muchas gracias por tu enorme cooperación !!!! @surbyte!!!!
creo que no cuesta nada dar un ejemplo a un novato y explicar bien las cosas!!

_jose_

Muchas gracias a todos por contestar, estuve leyendo indexof, substring y eso pero no puedo hacer el código me podrían poner uno de ejemplo a si lo miro y  veo como es muchas gracias.
El problema es que lo quereis todo "masticado" y asi no vas a aprender nada ni demuestras estar intentandolo.Que es lo que no has entendido exactamente de indexOf() y subString() ?

ArduMyth

#8
Jul 12, 2018, 09:42 pm Last Edit: Jul 12, 2018, 09:45 pm by ArduMyth
El problema es que lo quereis todo "masticado" [...]
Exacto. Y cuando se da en ocasiones ni lo miran, sólo copian.

Voy a poner un ejemplo (Ya que veo que últimamente la gente está empeñada en usar los parámetros así, todo un error en la parte web) y ver cómo se puede hacer el split con los parámetros en url a la antigua.

No me preocupa que copien peguen pues si intentan meter los valores en un array de String por ejemplo vendrán sorpresas, pero pueden ver el uso del substring e indexof().


En cuanto a qué es el # dentro de la url, quien no sepa que busque, pero dado que se coloca al final de la url quise tener en cuenta quitarlo de la ruta para que no se añadiera al valor de un parámetro.

Code: [Select]

String url = "https://ejemplo.com/foro.php?lenguaje=arduino&seccion=software&pagina=3&mensaje=holamundo#footer";
bool buscar = true;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if( buscar ){
   
    int indiceIds = url.indexOf('#');
    if(indiceIds != -1){
      url = url.substring(0,indiceIds);
    }
   
    int i = (url.indexOf('?') != -1) ? url.indexOf('?') : url.indexOf('&');

    if( i != -1){
      int j = url.indexOf('=');
      Serial.print("Parametro: " + url.substring(i+1,j));
      url = url.substring(j+1,url.length());
      int k = url.indexOf('&');
      Serial.println(" => " + ((k != -1) ? url.substring(0,k) : url));
    }
    else{
      buscar = false;
    }   
  }
}

url:
https://ejemplo.com/foro.php?lenguaje=arduino&seccion=software&pagina=3&mensaje=holamundo#footer

Resultado:
Parametro: lenguaje => arduino
Parametro: seccion => software
Parametro: pagina => 3
Parametro: mensaje => holamundo

Saludos.

surbyte

#9
Jul 13, 2018, 01:52 am Last Edit: Jul 13, 2018, 01:59 am by surbyte
OK muchas gracias! ya hace rato que vengo buscando en google y en todos esos lados si opte por estar en este foro es porque necesito ayuda de ustedes, pero igual muchas gracias por tu enorme cooperación !!!! @surbyte!!!!
creo que no cuesta nada dar un ejemplo a un novato y explicar bien las cosas!!
Veamos tu comodidad y como nos mientes y esperas que nos sintamos culpables porque has buscado y no te ponemos un ejemplo, mira como la mentira tiene patas cortas.



Ese segundo que te marco es este link

Arduino -String substring Function

Y en el ves tus ejemplos

Ejemplo 1
Code: [Select]
String stringOne = "Content-Type: text/html";

  // substring(index) looks for the substring from the index position to the end:
  if (stringOne.substring(19) == "html") {
   }



Ejemplo 2

Code: [Select]
 String stringOne = "Content-Type: text/html";

  // you can also look for a substring in the middle of a string:
  if (stringOne.substring(14,18) == "text") {

  }


Ejemplo 3 con código completo

Code: [Select]
*
  String substring()

  Examples of how to use substring in a String

  created 27 Jul 2010,
  modified 2 Apr 2012
  by Zach Eveland

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/StringSubstring
*/

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // send an intro:
  Serial.println("\n\nString  substring():");
  Serial.println();
}

void loop() {
  // Set up a String:
  String stringOne = "Content-Type: text/html";
  Serial.println(stringOne);

  // substring(index) looks for the substring from the index position to the end:
  if (stringOne.substring(19) == "html") {
    Serial.println("It's an html file");
  }
  // you can also look for a substring in the middle of a string:
  if (stringOne.substring(14, 18) == "text") {
    Serial.println("It's a text-based file");
  }

  // do nothing while true:
  while (true);
}



Ahora dime que parte buscaste?
Lleva 1 segundo encontrarlo suponiendo que elijas primero el anterior que no conduce a nada.


Te acabo de demostrar que no lo hiciste.


Para terminar una aclaración:
Eres nuevo, si. Y por eso se te debe tener consideración especial, sinceramente no se porque deba ser el caso.

Que dicen las normas del foro. Antes de preguntar busca en Google

3. Buscar antes de postear

Intenta solucionar tu problema, o responde tu pregunta por ti mismo. Por ejemplo si te estas preguntando como conectar una serie de LED's a un registro 74HC595, intenta buscar en Google exactamente eso (agrega la palabra "Arduino" para obtener mejores resultados):



El ejemplo anterior arroja muchos resultados; tanto referencias a la documentación oficial (ingles) e imágenes que se pueden entender bien, como diagramas.  Lee algunos de ellos y tal vez logres responder tus dudas.
Si no te has molestado en hacer algo tan simple, y tus preguntas son tan comunes que indican que no te has tomado la molestia de buscar un poco por tu cuenta, no te sorprendas que alguien te mande a buscar en google y a que vengas a leer este hilo completo.
Si eres novato y crees haber  encontrado algo que no acabas de entender,  ve a la sección de documentación, donde encontrarás información para novatos y no tan novatos, como tutoriales, herramientas, publicaciones de libros, referencias, vídeo tutoriales, u otro tipo de material didáctico. Todos estos recursos publicados por miembros del foro en español completamente en español.

Go Up