{"id":5578,"date":"2023-03-06T16:58:08","date_gmt":"2023-03-06T15:58:08","guid":{"rendered":"https:\/\/arduino.net.pl\/?p=5578"},"modified":"2023-03-08T16:12:39","modified_gmt":"2023-03-08T15:12:39","slug":"flask-i-rest-api","status":"publish","type":"post","link":"https:\/\/arduino.net.pl\/index.php\/flask-i-rest-api\/","title":{"rendered":"Serwer Flask, Arduino client i REST API"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/arduino.net.pl\/wp-content\/uploads\/2023\/03\/obraz.png\"><img loading=\"lazy\" decoding=\"async\" width=\"419\" height=\"164\" src=\"https:\/\/arduino.net.pl\/wp-content\/uploads\/2023\/03\/obraz.png\" alt=\"\" class=\"wp-image-5607\" srcset=\"https:\/\/arduino.net.pl\/wp-content\/uploads\/2023\/03\/obraz.png 419w, https:\/\/arduino.net.pl\/wp-content\/uploads\/2023\/03\/obraz-300x117.png 300w\" sizes=\"auto, (max-width: 419px) 100vw, 419px\" \/><\/a><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/flask.palletsprojects.com\/en\/2.2.x\/\" title=\"\">https:\/\/flask.palletsprojects.com\/en\/2.2.x\/<\/a><\/figcaption><\/figure>\n\n\n\n<p>O <strong>REST API<\/strong> <a href=\"https:\/\/chat.openai.com\/chat\" target=\"_blank\" rel=\"noopener\" title=\"\">sztuczna inteligencja<\/a> napisa\u0142a tak: &#8222;<em>REST API (Representational State Transfer Application Programming Interface) to styl architektury sieciowej oraz zestaw regu\u0142, kt\u00f3re pozwalaj\u0105 na tworzenie interfejs\u00f3w programowania aplikacji, umo\u017cliwiaj\u0105cych komunikacj\u0119 mi\u0119dzy r\u00f3\u017cnymi systemami lub us\u0142ugami internetowymi. REST API umo\u017cliwia klientom na zapytanie serwera o dane lub na wykonanie akcji poprzez standardowe protoko\u0142y internetowe, takie jak HTTP i protok\u00f3\u0142 SSL\/TLS, zazwyczaj zwracaj\u0105c dane w formacie JSON lub XML. REST API jest cz\u0119sto stosowany w aplikacjach internetowych, takich jak sklepy internetowe, media spo\u0142eczno\u015bciowe, systemy p\u0142atno\u015bci online, a tak\u017ce w aplikacjach mobilnych.<\/em>&#8222;<\/p>\n\n\n\n<p>Poni\u017cej kod napisany w Arduino, kt\u00f3rym p\u0142ytka ESP32 kontaktuje si\u0119 z serwerem napisanym w pythonie z u\u017cyciem modu\u0142u flask. Musia\u0142em u\u017cy\u0107 Arduino, zamiast prostszego Micropython, bo jak dot\u0105d brak dobrej biblioteki dla mojego wy\u015bwietlacza e-Paper 4.2&#8243; w tym j\u0119zyku. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Arduino IDE, ESP32 klient <\/h4>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\n\/*\n *  Arduino IDE, ESP32 klient \n *\/\n\n#include &lt;WiFi.h&gt;\n\nconst char* ssid     = &quot;******&quot;;\nconst char* password = &quot;*******&quot;;\n\nconst char* host = &quot;*******&quot;; \/\/ wpisz adres serwera z kt\u00f3rym si\u0119 \u0142\u0105czysz na przyk\u0142ad &quot;192.168.1.23&quot;\n\nvoid setup()\n{\n    Serial.begin(115200);\n    delay(10);\n\n    \/\/ We start by connecting to a WiFi network\n\n    Serial.println();\n    Serial.println();\n    Serial.print(&quot;Connecting to &quot;);\n    Serial.println(ssid);\n\n    WiFi.begin(ssid, password);\n\n    while (WiFi.status() != WL_CONNECTED) {\n        delay(500);\n        Serial.print(&quot;.&quot;);\n    }\n\n    Serial.println(&quot;&quot;);\n    Serial.println(&quot;WiFi connected&quot;);\n    Serial.println(&quot;IP address: &quot;);\n    Serial.println(WiFi.localIP());\n}\n\nint value = 0;\n\nvoid loop()\n{\n    delay(20000);\n    ++value;\n\n    Serial.print(&quot;connecting to &quot;);\n    Serial.println(host);\n\n    \/\/ Use WiFiClient class to create TCP connections\n    WiFiClient client;\n    const int httpPort = ****; \/\/ wpisa\u0107 numer portu serwera z kt\u00f3rym si\u0119 komunikujemy\n    if (!client.connect(host, httpPort)) {\n        Serial.println(&quot;connection failed&quot;);\n        return;\n    }\n\n    String url = &quot;\/epd&quot;;    \/\/ \u015bcie\u017cka do strony. je\u015bli kierujemy na g\u0142\u00f3wn\u0105 piszemy &quot;\/&quot;\n\n    Serial.print(&quot;Requesting URL: &quot;);\n    Serial.println(url);\n\n    \/\/ This will send the request to the server\n    client.print(String(&quot;POST &quot;) + url + &quot; HTTP\/1.1\\r\\n&quot; +\n                 &quot;Host: &quot; + host + &quot;\\r\\n&quot; +\n                 &quot;Connection: close\\r\\n\\r\\n&quot;);\n    unsigned long timeout = millis();\n    while (client.available() == 0) {\n        if (millis() - timeout &gt; 5000) {\n            Serial.println(&quot;&gt;&gt;&gt; Client Timeout !&quot;);\n            client.stop();\n            return;\n        }\n    }\n\n    \/\/ Read all the lines of the reply from server and print them to Serial\n    while(client.available()) {\n        String line = client.readStringUntil(&#039;\\r&#039;);\n        Serial.print(line);\n    }\n\n    Serial.println();\n    Serial.println(&quot;closing connection&quot;);\n}\n\n\n<\/pre><\/div>\n\n\n<p>Drugi przyk\u0142ad, tym razem ESP8266 z Arduino. Zamiast j\u0119zyka MicroPython u\u017cy\u0142em Arduino, poniewa\u017c mia\u0142em problem z komunikacj\u0105 mi\u0119dzy czujnikiem balkonowym dzia\u0142aj\u0105cym w oparciu o procesor <strong>ATmega328<\/strong> i modu\u0142 radiowy <strong>nrf24L01<\/strong>, a esp8266 na MicroPythonie, kt\u00f3ry odbiera\u0142by dane i przekazywa\u0142 do serwera. Za diab\u0142a nie chcia\u0142y si\u0119 widzie\u0107. Poni\u017cej kod wysy\u0142aj\u0105cy JSON do serwera oparty o bibliotek\u0119 <code>ESP8266HTTPClient.h<\/code>. Cz\u0119\u015b\u0107 odpowiadaj\u0105c\u0105 za nRF24 i tworzenie obiektu JSON pomin\u0105\u0142em. Zwr\u00f3\u0107cie uwag\u0119, \u017ce zastosowa\u0142em metod\u0119 POST, kt\u00f3ra pozwala wysy\u0142a\u0107 dane na serwer w dyskretny spos\u00f3b.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Arduino IDE, ESP8266 HTTP klient &#8212;> flask serwer<\/h4>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\n\/**\n   PostHTTPClient.ino\n\n    Created on: 21.11.2016\n\n    https:\/\/www.bot-thoughts.com\/2021\/11\/make-esp8266-wifi-temperature-sensor.html\n\n\n*\/\n\n#include &amp;lt;ESP8266WiFi.h&gt;\n#include &amp;lt;ESP8266HTTPClient.h&gt;\n\n#define SERVER_IP &quot;192.168.1.104:8080&quot; \/\/ adres mojego lokalnego serwera flask\n\n#ifndef STASSID\n#define STASSID &quot;*******&quot;\n#define STAPSK &quot;********&quot;\n#endif\n\nvoid setup() {\n\n  Serial.begin(115200);\n\n  Serial.println();\n  Serial.println();\n  Serial.println();\n\n  WiFi.begin(STASSID, STAPSK);\n\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n    Serial.print(&quot;.&quot;);\n  }\n  Serial.println(&quot;&quot;);\n  Serial.print(&quot;Connected! IP address: &quot;);\n  Serial.println(WiFi.localIP());\n}\n\nvoid loop() {\n  \/\/ wait for WiFi connection\n  if ((WiFi.status() == WL_CONNECTED)) {\n\n    WiFiClient client;\n    HTTPClient http;\n\n    Serial.print(&quot;&#x5B;HTTP] begin...\\n&quot;);\n    \/\/ configure traged server and url\n    http.begin(client, &quot;http:\/\/&quot; SERVER_IP &quot;\/balkon&quot;);  \/\/ HTTP\n    http.addHeader(&quot;Content-Type&quot;, &quot;application\/json&quot;);\n\n    Serial.print(&quot;&#x5B;HTTP] POST...\\n&quot;);\n    \/\/ start connection and send HTTP header and body\n    int httpCode = http.POST(&quot;{\\&quot;temp\\&quot;:\\&quot;22.30\\&quot;, \\&quot;humi\\&quot;:\\&quot;55\\&quot;}&quot;);\n\n    \/\/ httpCode will be negative on error\n    if (httpCode &gt; 0) {\n      \/\/ HTTP header has been send and Server response header has been handled\n      Serial.printf(&quot;&#x5B;HTTP] POST... code: %d\\n&quot;, httpCode);\n\n      \/\/ file found at server\n      if (httpCode == HTTP_CODE_OK) {\n        const String&amp;amp; payload = http.getString();\n        Serial.println(&quot;received payload:\\n&amp;lt;&amp;lt;&quot;);\n        Serial.println(payload);\n        Serial.println(&quot;&gt;&gt;&quot;);\n      }\n    } else {\n      Serial.printf(&quot;&#x5B;HTTP] POST... failed, error: %s\\n&quot;, http.errorToString(httpCode).c_str());\n    }\n\n    http.end();\n  }\n\n  delay(10000);\n}\n\n<\/pre><\/div>\n\n\n<h4 class=\"wp-block-heading\">Serwer flask, kod:<\/h4>\n\n\n\n<p>Sztuczna inteligencja o flask-u pisze tak: &#8222;Flask to lekki i minimalistyczny framework dla j\u0119zyka Python, kt\u00f3ry umo\u017cliwia tworzenie aplikacji webowych i API z \u0142atwo\u015bci\u0105 i szybko\u015bci\u0105. Flask dostarcza wiele wbudowanych funkcjonalno\u015bci, takich jak routing, obs\u0142uga formularzy, autoryzacja, obs\u0142uga baz danych oraz wsparcie dla r\u00f3\u017cnych rozszerze\u0144. Dzi\u0119ki swojej prostocie i elastyczno\u015bci, Flask jest bardzo popularnym narz\u0119dziem w \u015bwiecie programowania webowego.&#8221;<\/p>\n\n\n\n<p>Poni\u017cej kod najprostszego serwera flask. U mnie dzia\u0142a nawet na starym Mac-u z 2009 roku. Oczywi\u015bcie \u017ceby wsp\u00f3\u0142dzia\u0142a\u0142 z ESP32 i kodem zapisanym wy\u017cej nale\u017ca\u0142oby doda\u0107 <code>@app.route('\/epd', methods=['POST'])<\/code> z funkcj\u0105 co\u015b zwracaj\u0105c\u0105.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\n# Podzi\u0119kowania dla tw\u00f3rc\u00f3w za filmy na YouTube:\n# https:\/\/youtu.be\/9sG0xjGwIMM\n# https:\/\/www.youtube.com\/watch?v=zT8FrCVjKjU&amp;t=8s\n\nfrom flask import Flask, jsonify, render_template, request\n\napp = Flask(__name__)\n\n\n@app.route(&#039;\/balkon&#039;, methods=&#x5B;&#039;GET&#039;, &#039;POST&#039;])\ndef balkon():\n    if request.method == &#039;GET&#039;:\n        return jsonify(&#039;witaj na stronie!&#039;)\n    else:\n        data = request.get_json()\n        print(data)    \n    return jsonify(&#039;flask pozdrawia!&#039;)\n\n@app.route(&#039;\/epd&#039;, methods=&#x5B;&#039;GET&#039;, &#039;POST&#039;])\ndef epd():\n    print(&quot;EPD&quot;)\n    temp = 3.20\n    time_stamp = &#039;12:30&#039;\n    hum = 55\n    return jsonify(f&#039;Temp. {temp} st.C, Wilgotnosc {hum} %, Czas {time_stamp}&#039;)\n\n\nif __name__ == &#039;__main__&#039;:\n    app.run(host=&#039;192.168.1.104&#039;, port=8080, debug=True) \n<\/pre><\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>O REST API sztuczna inteligencja napisa\u0142a tak: &#8222;REST API (Representational State Transfer Application Programming Interface) to styl architektury sieciowej oraz zestaw regu\u0142, kt\u00f3re pozwalaj\u0105 na tworzenie interfejs\u00f3w programowania aplikacji, umo\u017cliwiaj\u0105cych&#8230;<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[2,153,80,59],"tags":[154,158],"class_list":["post-5578","post","type-post","status-publish","format-standard","hentry","category-arduino","category-arduino-ide","category-esp32","category-python","tag-flask","tag-rest-api"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/5578","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/comments?post=5578"}],"version-history":[{"count":9,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/5578\/revisions"}],"predecessor-version":[{"id":5610,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/5578\/revisions\/5610"}],"wp:attachment":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/media?parent=5578"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/categories?post=5578"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/tags?post=5578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}