Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Web Parms

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Передача и анализ параметров[1]

Этот пример демонстрирует, как при помощи библиотеки Webduino сделать осуществить передачу и анализ данных, вводимых пользователем через браузерный интерфейс.

Код

  1. /* Передача и анализ параметров (Webduino) */
  2.  
  3. /*
  4.  * Этот скетч служит для тестирования и отладки библиотеки,
  5.  * но может быть и своеобразным шаблоном для нового скетча.
  6.  *
  7.  * Чтобы использовать его, введите в браузер один из URL’ов ниже.
  8.  * Замените «host» на IP-адрес, присвоенный вашей Arduino.
  9.  *
  10.  * http://host/
  11.  * http://host/index.html
  12.  *
  13.  * Эти URL возвращают HTTP-заголовок, сообщающий об успешном
  14.  * подключении, а также показывают параметры (если они есть),
  15.  * передавая их в виде одной строки. При этом анализ параметров не
  16.  * выполняется. Все это осуществляется вызовом команды defaultCmd.
  17.  *  
  18.  * http://host/raw.html
  19.  *
  20.  * Делает примерно то же самое, что и index.html, но выполняется командой rawCmd.
  21.  *
  22.  * http://host/parsed.html
  23.  *
  24.  * Вызывает команду parsedCmd, которая показывает «сырую» строку с параметрами. Также анализирует отдельные параметры при помощи функции nextURLparam(), а затем показывает их.
  25.  */
  26.  
  27.  
  28. #define WEBDUINO_FAIL_MESSAGE "<h1>Request Failed</h1>"
  29. #include "SPI.h"
  30. #include "avr/pgmspace.h"
  31. #include "Ethernet.h"
  32. #include "WebServer.h"
  33.  
  34. #define VERSION_STRING "0.1"
  35.  
  36. /* ПОСТАВЬТЕ ЗДЕСЬ СОБСТВЕННОЕ ЗНАЧЕНИЕ. MAC-адрес должен отличаться
  37.  * от других девайсов в сети. Если MAC-адрес Ethernet-модуля совпадет
  38.  * с другим MAC-адресом, это повлечет проблемы с получением пакетов.
  39.  */
  40. static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  41.  
  42. /* ВЫСТАВЬТЕ ТУТ ЗНАЧЕНИЕ, СООТВЕТСТВУЮЩЕЕ СЕТИ ВАШЕГО ХОСТА.
  43.  * Большинство сетей находятся в диапазонах 192.168.0.XXX
  44.  * или 192.168.1.XXX. Выберите адрес, который не используется
  45.  * и не присваивается автоматически DHCP-сервисом, к которому
  46.  * подключен ваш роутер. */
  47. static uint8_t ip[] = { 192, 168, 1, 210 };
  48.  
  49. // ROM-сообщения, используемые скетчем. Они нужны, чтобы сэкономить
  50. // место на RAM-памяти.
  51.  
  52. P(Page_start) = "<html><head><title>Web_Parms_1 Version "
  53. VERSION_STRING "</title></head><body>\n";
  54. P(Page_end) = "</body></html>";
  55. P(Get_head) = "<h1>GET from ";  //  "запрос GET от "
  56. P(Post_head) = "<h1>POST to ";  //  "запрос POST на "
  57. P(Unknown_head) = "<h1>UNKNOWN request for ";  //  "запрос UNKNOWN для "
  58. P(Default_head) = "unidentified URL requested.</h1><br>\n";  //  "запрошен неопределенный URL."
  59. P(Raw_head) = "raw.html requested.</h1><br>\n";  //  "запрошен raw.html"
  60. P(Parsed_head) = "parsed.html requested.</h1><br>\n";  //  "запрошен parsed.html"
  61. P(Good_tail_begin) = "URL tail = '";  //  "хвостик URL = "
  62. P(Bad_tail_begin) = "INCOMPLETE URL tail = '";  //  "НЕЗАКОНЧЕННЫЙ хвостик URL = "
  63. P(Tail_end) = "'<br>\n";
  64. P(Parsed_tail_begin) = "URL parameters:<br>\n";  //  "параметры URL:"
  65. P(Parsed_item_separator) = " = '";
  66. P(Params_end) = "End of parameters<br>\n";  //  "конец параметров:"
  67. P(Post_params_begin) = "Parameters sent by POST:<br>\n";  //  "параметры, отправленные POST"
  68. P(Line_break) = "<br>\n";
  69.  
  70. /* Это создает экземпляр веб-сервера. Как PREFIX указываем "",
  71.  * благодаря чему все страницы будут в корне сервера. */
  72. #define PREFIX ""
  73. WebServer webserver(PREFIX, 80);
  74.  
  75. /* Команды – это функции, вызываемые веб-сервером. Они могут считывать
  76. // любые данные, опубликованные клиентом, и передавать их обратно от
  77. // сервера к браузеру.
  78. void helloCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
  79. {
  80.   /* отправляем стандартное сообщение, что запрос был успешным. */  server.httpSuccess();
  81.  
  82.   /* Если получили GET или POST, то показываем данные.
  83.      Если получили HEAD request, останавливаемся после
  84.      показа заголовков */
  85.   if (type == WebServer::HEAD)
  86.     return;
  87.  
  88.   server.printP(Page_start);
  89.   switch (type)
  90.     {
  91.     case WebServer::GET:
  92.         server.printP(Get_head);
  93.         break;
  94.     case WebServer::POST:
  95.         server.printP(Post_head);
  96.         break;
  97.     default:
  98.         server.printP(Unknown_head);
  99.     }
  100.  
  101.     server.printP(Default_head);
  102.     server.printP(tail_complete ? Good_tail_begin : Bad_tail_begin);
  103.     server.print(url_tail);
  104.     server.printP(Tail_end);
  105.     server.printP(Page_end);
  106.  
  107. }
  108.  
  109.  
  110. void rawCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
  111. {
  112.   /* эта строчка отправляет браузеру стандартное сообщение, что запрос был успешным.*/
  113.   server.httpSuccess();
  114.  
  115.   /* эта строчка отправляет браузеру стандартное сообщение, что запрос был успешным.*/
  116.   if (type == WebServer::HEAD)
  117.     return;
  118.  
  119.   server.printP(Page_start);
  120.   switch (type)
  121.     {
  122.     case WebServer::GET:
  123.         server.printP(Get_head);
  124.         break;
  125.     case WebServer::POST:
  126.         server.printP(Post_head);
  127.         break;
  128.     default:
  129.         server.printP(Unknown_head);
  130.     }
  131.  
  132.     server.printP(Raw_head);
  133.     server.printP(tail_complete ? Good_tail_begin : Bad_tail_begin);
  134.     server.print(url_tail);
  135.     server.printP(Tail_end);
  136.     server.printP(Page_end);
  137.  
  138. }
  139.  
  140. #define NAMELEN 32
  141. #define VALUELEN 32
  142.  
  143. void parsedCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
  144. {
  145.   URLPARAM_RESULT rc;
  146.   char name[NAMELEN];
  147.   char value[VALUELEN];
  148.  
  149.   /* эта строчка отправляет браузеру стандартное сообщение, что запрос был успешным.*/
  150.   server.httpSuccess();
  151.  
  152.   /* Если получили GET или POST, то показываем данные.
  153.      Если получили HEAD request, останавливаемся после
  154.      показа заголовков */
  155.   if (type == WebServer::HEAD)
  156.     return;
  157.  
  158.   server.printP(Page_start);
  159.   switch (type)
  160.     {
  161.     case WebServer::GET:
  162.         server.printP(Get_head);
  163.         break;
  164.     case WebServer::POST:
  165.         server.printP(Post_head);
  166.         break;
  167.     default:
  168.         server.printP(Unknown_head);
  169.     }
  170.  
  171.     server.printP(Parsed_head);
  172.     server.printP(tail_complete ? Good_tail_begin : Bad_tail_begin);
  173.     server.print(url_tail);
  174.     server.printP(Tail_end);
  175.  
  176.   if (strlen(url_tail))
  177.     {
  178.     server.printP(Parsed_tail_begin);
  179.     while (strlen(url_tail))
  180.       {
  181.       rc = server.nextURLparam(&url_tail, name, NAMELEN, value, VALUELEN);
  182.       if (rc == URLPARAM_EOS)
  183.         server.printP(Params_end);
  184.        else
  185.         {
  186.         server.print(name);
  187.         server.printP(Parsed_item_separator);
  188.         server.print(value);
  189.         server.printP(Tail_end);
  190.         }
  191.       }
  192.     }
  193.   if (type == WebServer::POST)
  194.   {
  195.     server.printP(Post_params_begin);
  196.     while (server.readPOSTparam(name, NAMELEN, value, VALUELEN))
  197.     {
  198.       server.print(name);
  199.       server.printP(Parsed_item_separator);
  200.       server.print(value);
  201.       server.printP(Tail_end);
  202.     }
  203.   }
  204.   server.printP(Page_end);
  205.  
  206. }
  207.  
  208. void my_failCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
  209. {
  210.   /* Эта строчка отправляет браузеру стандартный HTTP-заголовок «HTTP 400 Bad Request» */
  211.   server.httpFail();
  212.  
  213.   /* Если получили GET или POST, то показываем данные.
  214.      Если получили запрос HEAD, останавливаемся после
  215.      показа заголовков */
  216.   if (type == WebServer::HEAD)
  217.     return;
  218.  
  219.   server.printP(Page_start);
  220.   switch (type)
  221.     {
  222.     case WebServer::GET:
  223.         server.printP(Get_head);
  224.         break;
  225.     case WebServer::POST:
  226.         server.printP(Post_head);
  227.         break;
  228.     default:
  229.         server.printP(Unknown_head);
  230.     }
  231.  
  232.     server.printP(Default_head);
  233.     server.printP(tail_complete ? Good_tail_begin : Bad_tail_begin);
  234.     server.print(url_tail);
  235.     server.printP(Tail_end);
  236.     server.printP(Page_end);
  237.  
  238. }
  239.  
  240.  
  241.  
  242.  
  243. void setup()
  244. {
  245.   /* Инициализируем Ethernet-модуль */
  246.   Ethernet.begin(mac, ip);
  247.  
  248.   /* задаем команду, которая будет вызываться по умолчанию,
  249.   /* когда пользователь будет запрашивать доступ к корню сервера
  250.   */
  251.   webserver.setDefaultCommand(&helloCmd);
  252.  
  253.   /* задаем команду, которая будет вызываться по умолчанию,
  254.   /* когда пользователь запросит доступ к несуществующей странице
  255.   */
  256.   webserver.setFailureCommand(&my_failCmd);
  257.  
  258.   /* запускаем команду indexHTML, если пользователь пытается загрузить страницу /index.html */
  259.   webserver.addCommand("index.html", &helloCmd);
  260.  
  261.   /* эта команда вызывается, когда пользователь пытается загрузить /raw.html */
  262.   webserver.addCommand("raw.html", &rawCmd);
  263.   webserver.addCommand("parsed.html", &parsedCmd);
  264.  
  265.   /* Запускаем веб-сервер */
  266.   webserver.begin();
  267. }
  268.  
  269. void loop()
  270. {
  271.   char buff[64];
  272.   int len = 64;
  273.  
  274.   /* Вечно обрабатываем входящие соединения (одновременно может обрабатываться только одно соединение) */  
  275.   webserver.processConnection(buff, &len);
  276. }

См.также

Внешние ссылки

  1. github.com - Web_Parms.ino