Универсальный парсинг запросов
Добавлено: Чт мар 03, 2016 3:00 pm
Задача - парсить GET запросы по сетке в формате VALUENAME=VALUE и присваивать значения переменным с именем идентичным запросам. - Что бы потом было легко и понятно использовать их в любом месте программы.
Получилась вот такая штука:
enum_helper_pre.h
valuename.h
Тут указываем все переменные
enum_helper_post.h
Ну и сам запрос:
В итоге мы получаем массив глобальных переменных values[] значения которых можно можно вызывать просто по названию паременных которые мы парсили, например
values[LIGHT] будет равно полученному значению при парсинге $PARAM$LIGHT=1
+ можно выводить по индексу + можно выводить само название переменной
Serial.print(values);
Serial.print( valuename_strs);
Кто, что думает по этому поводу?_
Получилась вот такая штука:
enum_helper_pre.h
Код: Выделить всё
#ifndef delimiter
#define delimiter ,
#endif
#ifndef enumeration_begin
#define enumeration_begin(arg) enum arg {
#endif
#ifndef enumeration_end
#ifdef last_enumerator
#define enumeration_end delimiter last_enumerator }
#else
#define enumeration_end }
#endif
#endif
#ifndef declare_member
#define declare_member(arg) arg
#endif
#ifndef member_value
#define member_value(arg) = arg
#endif
Код: Выделить всё
#include "enum_helper_pre.h"
enumeration_begin(valuename)
declare_member(LIGHT) delimiter
declare_member(TEMP) delimiter
declare_member(DOOR) delimiter
declare_member(MAX_VAR)
enumeration_end;
#include "enum_helper_post.h"
enum_helper_post.h
Код: Выделить всё
#undef delimiter
#undef enumeration_begin
#undef enumeration_end
#undef last_enumerator
#undef declare_member
#undef member_value
Код: Выделить всё
#include <stdio.h>
#define enumeration_begin(arg) const char* const arg##_strs[]={
#define declare_member(arg) #arg
#include "valuename.h"
#include "valuename.h"
int values[MAX_VAR]; //глобальнай массив переменных
//Парсим полученные данные
else if (StrContains(HTTP_req, "GET /PARAM&")) {
sendXmlAnswer(cl);
strtok(HTTP_req, "$"); //вид запроса $PARAM$LIGHT=1
char* data = strtok(NULL, "$"); //второй параметр - наша пара
char* Valuename = strtok(data, "=");
const char *lp_ptr = strtok(NULL, "=");
int value = atoi(lp_ptr);
for (byte i = 0; i < MAX_VAR; i++) {//сравниваем Valuename c нашими переменными
if (!strcmp(Valuename, valuename_strs[i])) {
values[i] = Value; //присваиваем переменной с индексом == индекс enum , полученное значение
}
}
values[LIGHT] будет равно полученному значению при парсинге $PARAM$LIGHT=1
+ можно выводить по индексу + можно выводить само название переменной
Serial.print(values);
Serial.print( valuename_strs);
Кто, что думает по этому поводу?_
