ESP8266 WiFi 모듈 및 Arduino를 사용하여 HTTP 쿼리를 작성하는 라이브러리
마이크로 컨트롤러와 정보를 주고받는 간단한 방법은 정보를 웹 서버에 중앙 집중화하는 것입니다. 예를 들어 데이터베이스에 직접 액세스하는 것만큼 효율적인 방법은 아니지만 특히 마이크로 컨트롤러 기반 프로젝트를 고려하고 편재성(클라우드의 데이터)과 단순성(클라우드의 데이터)의 장점을 추가하는 경우 충분히 효과적입니다. 텍스트 정보 및 주문으로 처리될 수 있습니다.) 이 시스템을 사용하여 정보를 보내는 것은 HTTP POST 요청을 만들고 HTTP GET 요청에 대한 응답 내용을 분석하여 이를 받는 것으로 구성될 수 있습니다.
El ESP8266 WiFi 모듈 마이크로컨트롤러와 함께 사용하기에 매우 적합한 성능과 AT 명령 작업에 사용하기 매우 쉬운 매우 경제적인 옵션입니다.
HTTP 요청과 함께 사용을 체계화하기 위해 수면 관리 장치 프로젝트(SleepManager라고 함)의 요구 사항을 지원하는 작은 라이브러리를 개발했습니다. 이 프로젝트는 개체로 확장할 수 있는 웹 서버 기반 인프라를 기반으로 하기 때문입니다. 만약 IoT 으로 클라우드 서비스. 예를 들어 UDP 요청과 같은 다른 서비스를 라이브러리에 추가하는 것은 어렵지 않습니다. NTP를 통한 시간 동기화 하지만 링크된 텍스트에서 설명했듯이 이는 내 필요에 따라 중요하지 않으며 이 라이브러리 사용 예에서 보여주듯이 해당 목적을 위해 준비된 웹 페이지에 대한 HTTP 요청을 통해 문제를 적절하게 해결할 수 있습니다.
라이브러리의 작동은 장치를 사용할 수 있을 때 AT 명령을 보내고 오류가 발생할 경우 이를 반복(약간의 지연 포함)하는 것을 기반으로 합니다. 이는 예를 들어 WiFi 액세스 지점이나 테스트를 통해 가용성이 아닌 것으로 해석됩니다. 서버 상담 중입니다.
라이브러리는 ESP8266 WiFi 모듈이 데이터 수신에 대한 경고로 +IPD 코드를 반환하여 서버에서 반환한 정보로 작은 버퍼를 채우는 점을 활용합니다. 수면 관리 장치 프로젝트의 경우 서버에서 반환된 매우 적은 양의 데이터를 분석해야 하므로 절약하기 위해 이를 통해 실행되는 버퍼와 포인터가 특히 작습니다. 이는 더 많은 양의 데이터를 처리하기 위해 라이브러리를 재사용하기 위해 가장 먼저 변경해야 할 사항 중 하나입니다.
공개적으로 노출되는 함수를 사용하면 (1) 모듈의 상태를 알 수 있습니다. 모듈이 연결되어 있는지 여부, 버퍼에 데이터가 있는지, ESP8266 모듈이 요청된 작업을 완료했는지 여부, (2) DHCP 서버를 사용하여 네트워크의 WiFi 액세스 포인트에 연결하고 (3) HTTP GET 및 POST 요청을 수행합니다. 하지만 보시다시피 코드는 다른 항목을 매우 쉽게 추가할 수 있도록 설계되었습니다.
내부 기능과 관련하여 먼저 두 개의 행렬이 구축됩니다. 하나는 AT 명령이고 다른 하나는 성공 및 오류에 대한 예상 응답입니다. 그러면 라이브러리를 사용하는 프로그램이 수시로 함수를 호출해야 합니다.
사용 가능하고 바쁘지 않은 경우 모듈과 기능에 주문을 보내는 일을 담당합니다. ESP8266 모듈(및 해당되는 경우 이를 통해 HTTP 서버)의 응답을 처리합니다.신호 손실로 인해 모듈 연결이 끊어질 가능성이 있으므로 메인 프로그램은 ESP8266 모듈이 WiFi 액세스 포인트에 연결되어 있는지 확인할 수 있습니다(기능 사용).
) 그렇지 않으면 (함수를 사용하여) 연결을 시도하십시오 )요청한 작업이 완료되었는지 확인하기 위해 프로그램은 다음 기능을 사용할 수 있습니다.
이 경우 다른 것을 보내거나 함수가 사용되는 결과 데이터를 사용하십시오. , 작업이 완료될 때까지 ESP8266 모듈에 도착한 데이터로 채워져 있던 버퍼의 내용을 반환하는 함수와 서버가 전송될 것이라고 경고한 이 데이터의 양을 보고합니다(모듈 자체의 정보가 할인될 수 있도록). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 | //ESP8266.cpp #if defined(ARDUINO) && ARDUINO>=100 #include “Arduino.h” #else #include “WProgram.h” #endif // Para monitorizar (CONSOLA) a la vez que se comunica con el módulo por el puerto serie hace falta una placa Arduino con varios puertos (como Mega o Leonardo) en caso contrario hay que cambiar a MODULO_WIFI Serial y desactivar la depuración // No se inicializan las comunicaciones serie, es necesario inicializarlas desde el programa que usa la librería #define CONSOLA Serial #define MODULO_WIFI Serial1 #include “ESP8266.h” ESP8266::ESP8266(boolean depuracion) { constructor(depuracion); } ESP8266::ESP8266() { constructor(false); } ESP8266::~ESP8266() { } void ESP8266::constructor(boolean depuracion) { mostrar_salida=false; // Sin depuración para Arduino Uno //mostrar_salida=depuracion; estado_orden=ORDEN_OK; indicador_operacion_terminada=&ESP8266_operacion_terminada; *indicador_operacion_terminada=true; reiniciar_buffer(); mensaje_buscado[ORDEN_RECIBIENDO]=CODIGO_INICIO_RECEPCION; } void ESP8266::conectar_wifi ( String ssid, String clave, String ip, byte timeout ) { estado_orden=ORDEN_OK; pasos_operacion=0; paso_operacion=255; //Para poder incrementar al principio del proceso y que empiece en cero ESP8266_conectado=false; indicador_operacion_terminada=&ESP8266_conectado; *indicador_operacion_terminada=false; respuesta[pasos_operacion][ORDEN_KO]=“”; //reiniciar para descartar la configuración anterior que es desconocida respuesta[pasos_operacion][ORDEN_OK]=“ready”; comando[pasos_operacion++]=“AT+RST”; //reiniciar para descartar la configuración anterior que es desconocida //respuesta[pasos_operacion][ORDEN_KO]=”ERROR”; //Consultar el firmware //respuesta[pasos_operacion][ORDEN_OK]=”OK”; //comando[pasos_operacion++]=”AT+GMR”; //Consultar el firmware respuesta[pasos_operacion][ORDEN_KO]=“”; //Modo Sta (1|3) respuesta[pasos_operacion][ORDEN_OK]=“”; comando[pasos_operacion++]=“AT+CWMODE=1”; //Modo Sta = 1 (también es posible con 3, mixto) //respuesta[pasos_operacion][ORDEN_KO]=””; //Listado de puntos de acceso //respuesta[pasos_operacion][ORDEN_OK]=””; //comando[pasos_operacion++]=”AT+CWLAP”; //Listado de puntos de acceso respuesta[pasos_operacion][ORDEN_KO]=“”; respuesta[pasos_operacion][ORDEN_OK]=“”; comando[pasos_operacion++]=“ATE0”; //Desactivar el eco antes de mandar la clave respuesta[pasos_operacion][ORDEN_KO]=“FAIL”; //En el firmware original era “Error” respuesta[pasos_operacion][ORDEN_OK]=“OK”; comando[pasos_operacion++]=“AT+CWJAP=\””+ssid+“\”,\””+clave+“\””; //SSID y clave respuesta[pasos_operacion][ORDEN_KO]=“”; respuesta[pasos_operacion][ORDEN_OK]=“”; comando[pasos_operacion++]=“ATE1”; //Activar el eco antes de seguir respuesta[pasos_operacion][ORDEN_KO]=“”; respuesta[pasos_operacion][ORDEN_OK]=“\””+ssid+“\””; comando[pasos_operacion++]=“AT+CWJAP?”; //Comprobar que se ha conectado respuesta[pasos_operacion][ORDEN_KO]=“ERROR”; respuesta[pasos_operacion][ORDEN_OK]=ip.substring(0,ip.lastIndexOf(‘.’)+1); comando[pasos_operacion++]=“AT+CIFSR”; //Consultar la dirección IP respuesta[pasos_operacion][ORDEN_KO]=“ERROR”; respuesta[pasos_operacion][ORDEN_OK]=“AT+CIPMUX=0\r\r\n\r\nOK”; comando[pasos_operacion++]=“AT+CIPMUX=0”; //Conenexión simple } void ESP8266::http ( byte tipo_consulta_http, String direccion_servidor, unsigned int puerto, String nombre_servidor, String agente, String pagina, String texto_consulta, String respuesta_ko, String respuesta_ok ) { String consulta=“”; estado_orden=ORDEN_OK; pasos_operacion=0; paso_operacion=255; //Para poder incrementar al principio del proceso y que empiece en cero consultando_http=true; reiniciar_buffer(); indicador_operacion_terminada=&consultando_http; *indicador_operacion_terminada=false; switch(tipo_consulta_http) { case HTTP_GET: consulta+=“GET”; if(texto_consulta!=“”) { pagina+=“?”+texto_consulta; } break; case HTTP_POST: consulta+=“POST”; break; } consulta+=” /”+pagina+” HTTP/1.1″+“\r\n”; consulta+=“User-Agent: “+agente+“\r\n”; consulta+=“Host: “+nombre_servidor+“\r\n”; if(tipo_consulta_http==HTTP_POST) { consulta+=“Content-Type: application/x-www-form-urlencoded\r\n”; consulta+=“Content-Length: “+String(texto_consulta.length(),DEC)+“\r\n”; consulta+=“\r\n”; consulta+=texto_consulta; } consulta+=“\r\n”; respuesta[pasos_operacion][ORDEN_KO]=“ERROR”; //en el firmware anterior era “Error” respuesta[pasos_operacion][ORDEN_OK]=“OK”; //en el firmware anterior era “Linked” comando[pasos_operacion++]=“AT+CIPSTART=\”TCP\”,\””+direccion_servidor+“\”,”+String(puerto,DEC); respuesta[pasos_operacion][ORDEN_KO]=“Error”; respuesta[pasos_operacion][ORDEN_OK]=“>”; comando[pasos_operacion++]=“AT+CIPSEND=”+String(consulta.length(),DEC); respuesta[pasos_operacion][ORDEN_KO]=respuesta_ko; respuesta[pasos_operacion][ORDEN_OK]=respuesta_ok; //respuesta[pasos_operacion][ORDEN_OK]=”CLOSED”; //en el firmware anterior era “Unlink” comando[pasos_operacion++]=consulta; /* respuesta[pasos_operacion][ORDEN_KO]=””; respuesta[pasos_operacion][ORDEN_OK]=”OK”; comando[pasos_operacion++]=”AT+CIPCLOSE”; */ } void ESP8266::enviar() { if(!*indicador_operacion_terminada) { switch(estado_orden) { case ORDEN_OK: paso_operacion++; if(paso_operacion<pasos_operacion) { enviar_comando ( comando[paso_operacion], respuesta[paso_operacion][ORDEN_KO], respuesta[paso_operacion][ORDEN_OK] ); } else { *indicador_operacion_terminada=true; } break; case ORDEN_KO: paso_operacion—; estado_orden=ORDEN_OK; delay(ESPERA_REINTENTO); break; /* case ORDEN_RECIBIENDO: break; case ORDEN_ACTIVA: break; */ } } } //integrar en enviar void ESP8266::enviar_comando(String comando,String respuesta_ko,String respuesta_ok) { /* //Monitorizar las ordenes que se envian if(mostrar_salida) { CONSOLA.print(“\n”); CONSOLA.print(“(“+String(millis(),DEC)+”)”); //CONSOLA.print(“\n”); CONSOLA.print(String(paso_operacion+1,DEC)+”/”+String(pasos_operacion,DEC)+”> “); CONSOLA.print(comando); CONSOLA.print(” [“+respuesta_ko+”|”+respuesta_ok+”]”); CONSOLA.print(“\n”); } */ MODULO_WIFI.println(comando); mensaje_buscado[ORDEN_KO]=respuesta_ko; mensaje_buscado[ORDEN_OK]=respuesta_ok; if(respuesta_ok==“”) { estado_orden=ORDEN_OK; delay(ESPERA_ORDEN); } else { estado_orden=ORDEN_ACTIVA; reiniciar_busqueda_mensaje(); } } void ESP8266::reiniciar_buffer() { puntero_buffer=0; buffer_activo=false; longitud_ipd=0; } void ESP8266::reiniciar_busqueda_mensaje() { byte contador; buscando_mensaje=true; //estados=sizeof(mensaje_buscado)/sizeof(String); //Es posible generalizar calculando los estados for(contador=0;contador<ESTADOS_COMUNICACION;contador++) { puntero_mensaje[contador]=0; longitud_mensaje[contador]=mensaje_buscado[contador].length(); } } void ESP8266::recibir() { char lectura; while(MODULO_WIFI.available()>0) { lectura=MODULO_WIFI.read(); if(mostrar_salida) { CONSOLA.print(lectura); } if(buffer_activo) { if(longitud_ipd==0&&lectura==CODIGO_FIN_RECEPCION) { ESP8266_buffer[puntero_buffer]=0; longitud_ipd=atoi(ESP8266_buffer); puntero_buffer=0; } else { ESP8266_buffer[puntero_buffer++]=lectura; } } if(estado_orden==ORDEN_ACTIVA||estado_orden==ORDEN_RECIBIENDO) { estado_orden=buscar_mensaje(lectura,mensaje_buscado); if(estado_orden==ORDEN_RECIBIENDO) { buffer_activo=true; estado_orden=ORDEN_ACTIVA; buscando_mensaje=true; } } } } byte ESP8266::buscar_mensaje(char lectura,String *mensaje) { byte contador; byte numero_de_estado=0; while(numero_de_estado<ESTADOS_COMUNICACION–buffer_activo&&buscando_mensaje) { if(longitud_mensaje[numero_de_estado]) { if(lectura==mensaje[numero_de_estado].charAt(puntero_mensaje[numero_de_estado])) { puntero_mensaje[numero_de_estado]++; if(puntero_mensaje[numero_de_estado]==longitud_mensaje[numero_de_estado]) { buscando_mensaje=false; for(contador=0;contador<ESTADOS_COMUNICACION–buffer_activo;contador++) { puntero_mensaje[contador]=0; } } } else { puntero_mensaje[numero_de_estado]=0; } } numero_de_estado=numero_de_estado+buscando_mensaje; } if(buscando_mensaje) { return ORDEN_ACTIVA; } else { return numero_de_estado; } } char *ESP8266::leer_buffer() { reiniciar_buffer(); return ESP8266_buffer; } byte ESP8266::longitud_buffer() { return longitud_ipd; } boolean ESP8266::conectado() { return ESP8266_conectado; } boolean ESP8266::desconectado() { return ESP8266_conectado; } boolean ESP8266::consulta_ok() { return estado_orden==ORDEN_OK; } boolean ESP8266::operacion_terminada() { return *indicador_operacion_terminada; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | //ESP8266.h #if defined(ARDUINO) && ARDUINO>=100 #include “Arduino.h” #else #include “WProgram.h” #endif #define HTTP_CONNECT 0 //Codigos HTTP (en uso + reservados) #define HTTP_DELETE 1 #define HTTP_GET 2 #define HTTP_HEAD 3 #define HTTP_OPTIONS 4 #define HTTP_PATCH 5 #define HTTP_POST 6 #define HTTP_PUT 7 #define HTTP_TRACE 8 #define PASOS_HTTP 4 #define MAXIMO_PASOS_OPERACION 8 //+listar puntos de acceso +verificar firmware #define ESTADOS_COMUNICACION 3 //Estados que contienen mensajes que hay que atender #define ORDEN_KO 0 #define ORDEN_OK 1 #define ORDEN_RECIBIENDO 2 //debe ser el último de los estados para desactivarlo cuando se este rellenando el buffer #define ORDEN_ACTIVA 3 //debe ser igual a ESTADOS_COMUNICACION (uno más que el último estado) #define ESPERA_ORDEN 3000 //milisegundos despues de una orden AT sin respuesta #define ESPERA_REINTENTO 5000 //milisegundos antes de reintentar una orden AT #define MAX_BUFFER 256 //cambiar también el tipo de puntero_buffer si aumenta #define CODIGO_INICIO_RECEPCION “+IPD,” #define CODIGO_FIN_RECEPCION ‘:’ class ESP8266 { private: boolean ESP8266_conectado; boolean consultando_http; boolean ESP8266_operacion_terminada; boolean *indicador_operacion_terminada; boolean mostrar_salida; boolean datos_recibidos; byte paso_operacion; byte pasos_operacion; //boolean estado_operacion; String comando[MAXIMO_PASOS_OPERACION]; String respuesta[MAXIMO_PASOS_OPERACION][ESTADOS_COMUNICACION]; String mensaje_buscado[MAXIMO_PASOS_OPERACION]; byte puntero_mensaje[ESTADOS_COMUNICACION]; //ORDEN_KO->error (0/false), ORDEN_OK->acierto (1/true) byte longitud_mensaje[ESTADOS_COMUNICACION]; //longitudes la cadena de error y de la de acierto boolean buscando_mensaje; byte estado_orden; //boolean error_de_conexion; byte buscar_mensaje(char lectura,String *mensaje); void reiniciar_busqueda_mensaje(); char ESP8266_buffer[MAX_BUFFER]; boolean buffer_activo; byte puntero_buffer; byte longitud_ipd; void enviar_comando ( String comando, String respuesta_ok, String respuesta_ko ); protected: public: ESP8266(); ESP8266(boolean depuracion); ~ESP8266(); void conectar_wifi ( String ssid, String clave, String ip, byte timeout ); void constructor(boolean depuracion); void http ( byte tipo_consulta_http, String direccion_servidor, unsigned int puerto, String nombre_servidor, String agente, String pagina, String texto_consulta, String respuesta_ko, String respuesta_ok ); void reiniciar_buffer(); char *leer_buffer(); byte longitud_buffer(); void enviar(); void recibir(); boolean conectado(); boolean desconectado(); boolean consulta_ok(); boolean operacion_terminada(); }; |
아래 예에서는 ESP8266 WiFi 모듈과 함께 HTTP 쿼리 라이브러리를 사용하여 특정 시간 간격마다 서버에 데이터(아날로그 입력을 읽어 얻은 백분율)를 보냅니다. 어떤 응답도 받을 것으로 예상하지 않기 때문에 버퍼를 사용하지 않으며 작업이 올바르게 완료되는 데 충분합니다. 이 시스템은 센서 판독 결과를 서버에 저장하기 위해 수면 관리 장치 프로젝트에서 사용하는 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include “ESP8266.h” #define MODO_DEPURACION true #define PIN_LED_CONEXION 13 #define WIFI_VELOCIDAD 115200 #define WIFI_SSID “SleepManager” #define WIFI_CLAVE “****” #define CONSOLA_VELOCIDAD 115200 #define SERVIDOR_DIRECCION “192.168.1.22” #define SERVIDOR_PUERTO 80 #define SERVIDOR_PROTOCOLO “HTTP/1.1” #define SERVIDOR_NOMBRE “” #define SERVIDOR_AGENTE “sleepmanager-clinic-wifi” #define PAGINA_PRUEBA “pruebas/lectura_porcentaje.php” #define PARAMETRO_PRUEBA “porcentaje” #define CONSULTA_KO “” #define CONSULTA_OK “porcentaje recibido correctamente” #define TIMEOUT_CONEXION 30000 #define INTERVALO_LECTURAS_SENSOR 60000 float valor_sensor_analogico; String texto_consulta; unsigned long cronometro_lectura=0; ESP8266 conexion_wifi_servidor(MODO_DEPURACION); void setup() { Serial.begin(CONSOLA_VELOCIDAD); // Cambiar para que el puerto serie corresponda con el de la consola Serial1.begin(WIFI_VELOCIDAD); // Cambiar para que el puerto serie corresponda con el del módulo WiFi delay(5000); //Unos segundos para que el humano active la consola conexion_wifi_servidor.conectar_wifi ( WIFI_SSID, WIFI_CLAVE, SERVIDOR_DIRECCION, TIMEOUT_CONEXION ); } void loop() { if(conexion_wifi_servidor.operacion_terminada()) { if(conexion_wifi_servidor.conectado()) { digitalWrite(PIN_LED_CONEXION,HIGH); if(cronometro_lectura<millis()) { valor_sensor_analogico=analogRead(A0)*100.0/1023.0; texto_consulta=String(PARAMETRO_PRUEBA)+“=”+String(valor_sensor_analogico,DEC); cronometro_lectura=millis()+INTERVALO_LECTURAS_SENSOR; conexion_wifi_servidor.http ( HTTP_POST, SERVIDOR_DIRECCION, SERVIDOR_PUERTO, SERVIDOR_NOMBRE, SERVIDOR_AGENTE, PAGINA_PRUEBA, texto_consulta, CONSULTA_KO, CONSULTA_OK ); } } else { digitalWrite(PIN_LED_CONEXION,LOW); conexion_wifi_servidor.conectar_wifi ( WIFI_SSID, WIFI_CLAVE, SERVIDOR_DIRECCION, TIMEOUT_CONEXION ); } } else { conexion_wifi_servidor.enviar(); } conexion_wifi_servidor.recibir(); } |
다음 예에서는 HTTP GET 쿼리를 사용하여 서버의 시간을 쿼리하고 예상 응답 시간을 추가하여 마이크로 제어 장치의 시간과 동기화합니다. 실제로 장치의 시간이 서버의 시간보다 큰지 확인하고 장치의 일부인 실시간 시계의 시간이 올바른지 또는 다운로드로 인해 손실되었는지 쉽게 확인하기 위해 4~6초를 더 추가합니다. .배터리.
많은 테스트를 거쳐 이 시스템이 ESP8266 WiFi 모듈과 시간 동기화 그것은 내 요구에 충분히 정확합니다. 최악의 경우에는 10초 미만의 오류가 발생했는데 이는 제 경우에는 다소 관련이 없습니다.
코드에서 볼 수 있듯이 버퍼의 길이를 먼저 쿼리해야 합니다. 읽기를 하면 버퍼가 재설정되어 새 데이터를 저장할 수 있기 때문입니다.
버퍼의 내용을 읽고 나면 이 예에서는 시간을 얻기 위해 처리됩니다. 먼저 중괄호 사이의 텍스트가 선택됩니다(서버는 다음 명령을 사용하여 응답합니다). PHP )는 이를 "시간 객체"로 변환하고 인간 형식으로 날짜와 시간을 얻습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | #include <Time.h> #include “ESP8266.h” #define MODO_DEPURACION true #define PIN_LED_CONEXION 13 #define WIFI_VELOCIDAD 115200 #define WIFI_SSID “SleepManager” #define WIFI_CLAVE “****” #define CONSOLA_VELOCIDAD 115200 #define SERVIDOR_DIRECCION “192.168.1.22” #define SERVIDOR_PUERTO 80 #define SERVIDOR_PROTOCOLO “HTTP/1.1” #define SERVIDOR_NOMBRE “” #define SERVIDOR_AGENTE “sleepmanager-clinic-wifi” #define PAGINA_PRUEBA “pruebas/hora_servidor.php” #define CONSULTA_KO “” #define CONSULTA_OK “CLOSED” // Cuando se desconecte el servidor pasado el timeout #define TIMEOUT_CONEXION 3000 #define INTERVALO_LECTURAS_HORA 60000 String texto_consulta; unsigned long cronometro_lectura=0; ESP8266 conexion_wifi_servidor(MODO_DEPURACION); byte longitud_buffer; byte inicio_fecha; byte fin_fecha; char *buffer; time_t fecha_hora; void setup() { Serial.begin(CONSOLA_VELOCIDAD); // Cambiar para que el puerto serie corresponda con el de la consola Serial1.begin(WIFI_VELOCIDAD); // Cambiar para que el puerto serie corresponda con el del módulo WiFi delay(5000); //Unos segundos para que el humano active la consola conexion_wifi_servidor.conectar_wifi ( WIFI_SSID, WIFI_CLAVE, SERVIDOR_DIRECCION, TIMEOUT_CONEXION ); texto_consulta=“”; //no se envía información, solo se lee la pagina } void loop() { if(conexion_wifi_servidor.operacion_terminada()) { if(conexion_wifi_servidor.conectado()) { digitalWrite(PIN_LED_CONEXION,HIGH); if(cronometro_lectura<millis()) { cronometro_lectura=millis()+INTERVALO_LECTURAS_HORA; conexion_wifi_servidor.http ( HTTP_GET, SERVIDOR_DIRECCION, SERVIDOR_PUERTO, SERVIDOR_NOMBRE, SERVIDOR_AGENTE, PAGINA_PRUEBA, texto_consulta, CONSULTA_KO, CONSULTA_OK ); } else { longitud_buffer=conexion_wifi_servidor.longitud_buffer(); if(longitud_buffer) { buffer=conexion_wifi_servidor.leer_buffer(); inicio_fecha=String(buffer).indexOf(‘{‘); if(inicio_fecha<255) { fin_fecha=String(buffer).indexOf(‘}’); if(fin_fecha>0) { fecha_hora=String(buffer).substring(inicio_fecha+1,fin_fecha).toInt()+10; Serial.println ( “Fecha: “+ String(day(fecha_hora),DEC)+“/”+ String(month(fecha_hora),DEC)+“/”+ String(year(fecha_hora),DEC)+” “+ “Hora: “+ String(hour(fecha_hora),DEC)+“:”+ String(minute(fecha_hora),DEC)+“:”+ String(second(fecha_hora),DEC) ); } } } } } else { digitalWrite(PIN_LED_CONEXION,LOW); conexion_wifi_servidor.conectar_wifi ( WIFI_SSID, WIFI_CLAVE, SERVIDOR_DIRECCION, TIMEOUT_CONEXION ); } } else { conexion_wifi_servidor.enviar(); } conexion_wifi_servidor.recibir(); } |
사용자의 쿼리에서 영감을 얻은 다음 예제 프로그램은 서비스를 사용하여 공용 IP 주소를 찾는 데 사용됩니다. IP 확인 AWS(아마존 웹 서비스) 5분마다.
이전 예와 마찬가지로 사용된 네트워크 구성(예에서는 192.168.1.X), SSID 및 WiFi 키에 따라 변경되어야 하는 일련의 가정이 이루어졌습니다. IP 주소는 그다지 우아하지 않습니다. 보다 정통적인 방식으로 이를 수행하는 API가 있을 수 있지만 IP 주소는 HTTP GET 요청에 대한 응답의 마지막 줄이라고 가정합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include “ESP8266.h” #define MODO_DEPURACION true #define PIN_LED_CONEXION 13 #define WIFI_VELOCIDAD 115200 #define WIFI_SSID “SleepManager” #define WIFI_CLAVE “****” #define CONSOLA_VELOCIDAD 115200 #define RED_DIRECCION “192.168.1.X” #define SERVIDOR_DIRECCION “23.23.144.23” // ¡¡Mucho cuidado, puede cambiar la dirección IP!! (buscarla antes de usar el programa, por ejemplo, con ping checkip.amazonaws.com) #define SERVIDOR_PUERTO 80 #define SERVIDOR_PROTOCOLO “HTTP/1.1” #define SERVIDOR_NOMBRE “checkip.amazonaws.com” #define SERVIDOR_AGENTE “buscadordeipes” #define PAGINA_IP “” #define CONSULTA_KO “Error” #define CONSULTA_OK “\n\r\nOK” #define TIMEOUT_CONEXION 3000 #define INTERVALO_LECTURAS_IP 300000 //Leer la IP publica cada 5 minutos String texto_consulta; unsigned long cronometro_lectura=0; ESP8266 conexion_wifi_servidor(MODO_DEPURACION); byte longitud_buffer; byte inicio_ip; byte fin_ip; char *buffer; void setup() { Serial.begin(CONSOLA_VELOCIDAD); // Cambiar para que el puerto serie corresponda con el de la consola Serial1.begin(WIFI_VELOCIDAD); // Cambiar para que el puerto serie corresponda con el del módulo WiFi pinMode(PIN_LED_CONEXION,OUTPUT); digitalWrite(PIN_LED_CONEXION,LOW); delay(5000); //Unos segundos para que el humano active la consola conexion_wifi_servidor.conectar_wifi ( WIFI_SSID, WIFI_CLAVE, RED_DIRECCION, TIMEOUT_CONEXION ); texto_consulta=“”; //no se envia informacion, solo se lee la pagina } void loop() { if(conexion_wifi_servidor.operacion_terminada()) { if(conexion_wifi_servidor.conectado()) { digitalWrite(PIN_LED_CONEXION,HIGH); if(cronometro_lectura<millis()) { cronometro_lectura=millis()+INTERVALO_LECTURAS_IP; conexion_wifi_servidor.http ( HTTP_GET, SERVIDOR_DIRECCION, SERVIDOR_PUERTO, SERVIDOR_NOMBRE, SERVIDOR_AGENTE, PAGINA_IP, texto_consulta, CONSULTA_KO, CONSULTA_OK ); } else { longitud_buffer=conexion_wifi_servidor.longitud_buffer(); if(longitud_buffer) { buffer=conexion_wifi_servidor.leer_buffer(); inicio_ip=String(buffer).indexOf(“\r\n\r\n”)+4; fin_ip=String(buffer).indexOf(“\r\n”,inicio_ip)–1; Serial.println(“IP [“+String(buffer).substring(inicio_ip,fin_ip)+“]”); } } } else { digitalWrite(PIN_LED_CONEXION,LOW); conexion_wifi_servidor.conectar_wifi ( WIFI_SSID, WIFI_CLAVE, SERVIDOR_DIRECCION, TIMEOUT_CONEXION ); } } else { conexion_wifi_servidor.enviar(); } conexion_wifi_servidor.recibir(); } |
당신은 할 수 있습니다 Arduino Uno를 사용한 HTTP 쿼리용 ESP8266 라이브러리 다운로드 (콘솔 없이) 여기에서 다음을 수행할 수 있습니다. Arduino용 ESP8266 HTTP 쿼리 라이브러리를 다운로드하세요. 즉, 소프트웨어로 직렬 포트를 구현하거나 마더보드와 같은 하드웨어로 사용해야 합니다. 아두 이노 메가 o 아두 이노 레오나르도.
코멘트 남기기