{"id":4483,"date":"2025-04-13T20:58:50","date_gmt":"2025-04-14T00:58:50","guid":{"rendered":"https:\/\/dft.wiki\/?p=4483"},"modified":"2026-07-07T22:38:14","modified_gmt":"2026-07-08T02:38:14","slug":"programming-esp32-wifi-with-arduino-ide","status":"publish","type":"post","link":"https:\/\/dft.wiki\/?p=4483","title":{"rendered":"Programming ESP32 Wifi with Arduino IDE"},"content":{"rendered":"<p><strong>COMMANDS<\/strong><\/p>\n<pre>~\/Downloads\/arduino-ide_2.3.4_Linux_64bit.AppImage &amp;&gt; \/dev\/null\r\nsudo apt install python3-pip\r\npip3 install pyserial\r\nsudo usermod -aG userName dialout\r\nsudo chmod a+rw \/dev\/ttyUSB0<\/pre>\n<hr \/>\n<p><strong>EXAMPLES<\/strong><\/p>\n<p><strong>(1)<\/strong> HTTP API Endpoints with JSON<\/p>\n<pre>\/\/ ESP32-WROOM-32U\r\n\r\n#include &lt;WiFi.h&gt;\r\n#include &lt;WebServer.h&gt;\r\n#include &lt;ArduinoJson.h&gt;\r\n#include &lt;HTTPClient.h&gt;\r\n\r\n\/\/ WiFi credentials\r\nconst char* ssid = \"<strong>wifi_name<\/strong>\";\r\nconst char* password = \"<strong>wifi_password<\/strong>\";\r\n\r\n\/\/ Create a WebServer object on port 80\r\nWebServer server(80);\r\n\r\n\/\/ Handler for \"\/\"\r\nvoid handleRoot() {\r\n  String body = \"&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;ESP32&lt;\/title&gt;&lt;\/head&gt;&lt;body&gt;\";\r\n  body += \"&lt;h1&gt;ESP32 HTTP Server!&lt;\/h1&gt;\\n\\n\";\r\n  body += \"&lt;a href=\\\"\/status\\\"&gt;Show Status&lt;\/a&gt;&lt;br&gt;\\n\";\r\n  body += \"&lt;a href=\\\"\/push\\\"&gt;Push Status&lt;\/a&gt;&lt;br&gt;\\n\";\r\n  body += \"&lt;a href=\\\"\/serial\\\"&gt;Output Status&lt;\/a&gt;&lt;br&gt;\\n\";\r\n  body += \"&lt;\/body&gt;&lt;\/html&gt;\";\r\n  server.send(200, \"text\/html\", body);\r\n  Serial.println(\"Client IP: \" + server.client().remoteIP().toString());\r\n}\r\n\r\nString getStatusJson() {\r\n  StaticJsonDocument&lt;512&gt; jsonData;\r\n  jsonData[\"wifi_connected\"] = String(WiFi.status() == WL_CONNECTED ? \"true\" : \"false\");\r\n  jsonData[\"signal_strength\"] = String(WiFi.RSSI());\r\n  jsonData[\"ssid\"] = WiFi.SSID();\r\n  jsonData[\"ip\"] = WiFi.localIP().toString();\r\n  jsonData[\"uptime\"] = String(millis() \/ 1000);\r\n  jsonData[\"free_heap\"] = String(ESP.getFreeHeap());\r\n  jsonData[\"chip_model\"] = String(ESP.getChipModel());\r\n  jsonData[\"flash_size\"] = String(ESP.getFlashChipSize());\r\n  String jsonString;\r\n  serializeJson(jsonData, jsonString);\r\n  return jsonString;\r\n}\r\n\r\nvoid pushNotification(const String &amp;message = \"\") {\r\n  if (WiFi.status() == WL_CONNECTED) {\r\n    HTTPClient http;\r\n    http.begin(\"http:\/\/ntfy.sh\/<strong>subscription_topic<\/strong>\");\r\n    http.addHeader(\"Content-Type\", \"application\/json\");\r\n\r\n    String payload;\r\n    if (message.length() &gt; 0) {\r\n      payload = message;\r\n    } else {\r\n      payload = getStatusJson();\r\n    }\r\n\r\n    int httpResponseCode = http.POST(payload);\r\n    if (httpResponseCode == 200) {\r\n      Serial.println(\"Push notification succeeded!\");\r\n    } else {\r\n      Serial.println(\"Push failed with error: \" + String(httpResponseCode));\r\n    }\r\n\r\n    http.end();\r\n  }\r\n}\r\n\r\n\/\/ Handler for \"\/status\"\r\nvoid handleStatus() {\r\n  server.send(200, \"application\/json\", getStatusJson());\r\n}\r\n\r\n\/\/ Handler for \"\/push\"\r\nvoid handlePush() {\r\n  pushNotification();\r\n  server.send(200, \"text\/plain\", \"\");\r\n}\r\n\r\n\/\/ Handler for \"\/serial\"\r\nvoid handleSerial() {\r\n  Serial.println(getStatusJson());\r\n  server.send(200, \"text\/plain\", \"\");\r\n}\r\n\r\n\/\/ Handler for 404\r\nvoid handleNotFound() {\r\n  server.send(404, \"text\/plain\", \"404: Not Found\");\r\n}\r\n\r\nvoid setup() {\r\n  Serial.begin(115200);\r\n  delay(1000);\r\n\r\n  Serial.println(\"\");\r\n  Serial.println(\"Serial Started\");\r\n\r\n  Serial.println(\"Starting WiFi\");\r\n  WiFi.begin(ssid, password);\r\n  while (WiFi.status() != WL_CONNECTED) {\r\n    delay(500);\r\n    Serial.println(\"Connecting...\");\r\n  }\r\n  Serial.println(\"Connected to WiFi!\");\r\n  Serial.println(\"IP Address: \" + WiFi.localIP().toString());\r\n\r\n  \/\/ Define URL routes\r\n  server.on(\"\/\", handleRoot);\r\n  server.on(\"\/status\", handleStatus);\r\n  server.on(\"\/push\", handlePush);\r\n  server.on(\"\/serial\", handleSerial);\r\n  server.onNotFound(handleNotFound);\r\n\r\n  \/\/ Start the server\r\n  server.begin();\r\n  Serial.println(\"HTTP server started\");\r\n\r\n  \/\/ Send push notification with IP address\r\n  StaticJsonDocument&lt;48&gt; jsonData;\r\n  jsonData[\"ip\"] = WiFi.localIP().toString();\r\n  String jsonString;\r\n  serializeJson(jsonData, jsonString);\r\n  pushNotification(jsonString);\r\n}\r\n\r\nvoid loop() {\r\n  server.handleClient();\r\n}<\/pre>\n<p><strong>(2)<\/strong> A TCP\/UDP Honey-Pot named <strong>Albedu0<\/strong><\/p>\n<p>Albedo is the property of a material to absorb or reflect radiation. So, when the albedo value is close to 1, it reflects almost the totality. When close to zero, it does not reflect anything.<\/p>\n<p>Analogously, this honey-pot does not respond on the application layer (after the TCP 3-way handshake) but instead notifies the network administrator that someone is probing it.<\/p>\n<pre>\/\/ ESP32-WROOM-32U - Albedu0\r\n\r\n#include &lt;WiFi.h&gt;\r\n#include &lt;WiFiUdp.h&gt;\r\n#include &lt;HTTPClient.h&gt; \r\n\r\nconst char* ssid     = \"<strong>wifi_name<\/strong>\";\r\nconst char* password = \"<strong>wifi_password<\/strong>\";\r\nconst char* ntfyUrl  = \"http:\/\/ntfy.sh\/<strong>subscription_topic<\/strong>\";\r\n\r\nconst uint16_t tcpPorts[] = {21, 22, 23, 80, 445, 3389, 8080};\r\nconst uint16_t udpPorts[] = {53, 123, 161, 1900};\r\nconstexpr size_t N_TCP = sizeof(tcpPorts) \/ sizeof(tcpPorts[0]);\r\nconstexpr size_t N_UDP = sizeof(udpPorts) \/ sizeof(udpPorts[0]);\r\n\r\nWiFiServer* tcpSrv[N_TCP];\r\nWiFiUDP     udpSrv[N_UDP];\r\nuint32_t    hitCount = 0;\r\n\r\nString toHex(const uint8_t* b, size_t n) {\r\n  String s;\r\n  for (size_t i = 0; i &lt; n; i++) {\r\n    if (b[i] &lt; 0x10) s += '0';\r\n    s += String(b[i], HEX);\r\n    if (i + 1 &lt; n) s += ' ';\r\n  }\r\n  return s;\r\n}\r\n\r\nString toAscii(const uint8_t* b, size_t n) {\r\n  String s;\r\n  for (size_t i = 0; i &lt; n; i++) s += (b[i] &gt;= 32 &amp;&amp; b[i] &lt; 127) ? (char)b[i] : '.'; return s; } void snitch(const String&amp; proto, const IPAddress&amp; src, uint16_t sport, uint16_t dport, const uint8_t* data, size_t len) { hitCount++; String body; body += \"proto=\" + proto + \"\\n\"; body += \"src=\" + src.toString() + \":\" + String(sport) + \"\\n\"; body += \"dst=\" + WiFi.localIP().toString() + \":\" + String(dport) + \"\\n\"; body += \"bytes=\" + String(len) + \"\\n\"; if (len &gt; 0) {\r\n    body += \"hex=\"   + toHex(data, len)   + \"\\n\";\r\n    body += \"ascii=\" + toAscii(data, len) + \"\\n\";\r\n  }\r\n  body += \"rssi=\"   + String(WiFi.RSSI()) + \"dBm\\n\";\r\n  body += \"uptime=\" + String(millis() \/ 1000) + \"s\\n\";\r\n  body += \"hit#\"    + String(hitCount);\r\n\r\n  Serial.println(\"---- HIT ----\");\r\n  Serial.println(body);\r\n\r\n  if (WiFi.status() == WL_CONNECTED) {\r\n    HTTPClient http;\r\n    http.begin(ntfyUrl);\r\n    http.addHeader(\"Title\", \"Honeypot \" + proto + \" :\" + String(dport));\r\n    http.addHeader(\"Tags\", \"warning\");\r\n    http.addHeader(\"Priority\", \"high\");\r\n    int code = http.POST(body);\r\n    Serial.println(\"ntfy -&gt; \" + String(code));\r\n    http.end();\r\n  }\r\n}\r\n\r\n\/\/ TCP\r\nvoid pollTcp() {\r\n  for (size_t i = 0; i &lt; N_TCP; i++) { WiFiClient c = tcpSrv[i]-&gt;accept();\r\n    if (!c) continue;\r\n\r\n    IPAddress src = c.remoteIP();\r\n    uint16_t sport = c.remotePort();\r\n\r\n    uint8_t buf[64];\r\n    size_t len = 0;\r\n    unsigned long t0 = millis();\r\n    while (millis() - t0 &lt; 80 &amp;&amp; len &lt; sizeof(buf)) {\r\n      while (c.available() &amp;&amp; len &lt; sizeof(buf)) buf[len++] = c.read();\r\n      if (!c.connected()) break;\r\n      delay(5);\r\n    }\r\n    c.stop();\r\n\r\n    snitch(\"TCP\", src, sport, tcpPorts[i], buf, len);\r\n  }\r\n}\r\n\r\n\/\/ UDP\r\nvoid pollUdp() {\r\n  for (size_t i = 0; i &lt; N_UDP; i++) {\r\n    int sz = udpSrv[i].parsePacket();\r\n    if (sz &lt;= 0) continue;\r\n\r\n    IPAddress src = udpSrv[i].remoteIP();\r\n    uint16_t sport = udpSrv[i].remotePort();\r\n\r\n    uint8_t buf[64];\r\n    int len = udpSrv[i].read(buf, sizeof(buf));\r\n    if (len &lt; 0) len = 0;\r\n\r\n    snitch(\"UDP\", src, sport, udpPorts[i], buf, len);\r\n  }\r\n}\r\n\r\nvoid setup() {\r\n  Serial.begin(115200);\r\n  delay(1000);\r\n  Serial.println(\"\\nHoneypot booting\");\r\n\r\n  WiFi.begin(ssid, password);\r\n  while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(\".\"); }\r\n  Serial.println(\"\\nWiFi up: \" + WiFi.localIP().toString());\r\n\r\n  for (size_t i = 0; i &lt; N_TCP; i++) { tcpSrv[i] = new WiFiServer(tcpPorts[i]); tcpSrv[i]-&gt;begin();\r\n    tcpSrv[i]-&gt;setNoDelay(true);\r\n  }\r\n  for (size_t i = 0; i &lt; N_UDP; i++) udpSrv[i].begin(udpPorts[i]);\r\n\r\n  if (WiFi.status() == WL_CONNECTED) {\r\n    HTTPClient http;\r\n    http.begin(ntfyUrl);\r\n    http.addHeader(\"Title\", \"Honeypot online\");\r\n    http.POST(\"watching \" + WiFi.localIP().toString());\r\n    http.end();\r\n  }\r\n  Serial.println(\"Listening.\");\r\n}\r\n\r\nvoid loop() {\r\n  if (WiFi.status() != WL_CONNECTED) { WiFi.reconnect(); delay(500); return; }\r\n  pollTcp();\r\n  pollUdp();\r\n}<\/pre>\n<hr \/>\n<p><strong>DOCUMENTATION<\/strong><\/p>\n<ul>\n<li>ESP32 WebServer [<a href=\"https:\/\/github.com\/espressif\/arduino-esp32\/blob\/master\/libraries\/WebServer\/src\/WebServer.h\">Link<\/a>]<\/li>\n<li>ESP32 HTTPClient [<a href=\"https:\/\/github.com\/espressif\/arduino-esp32\/blob\/master\/libraries\/HTTPClient\/src\/HTTPClient.h\">Link<\/a>]<\/li>\n<li>ArduinoJson [<a href=\"https:\/\/github.com\/bblanchon\/ArduinoJson\/blob\/7.x\/ArduinoJson.h\">Link<\/a>]<\/li>\n<\/ul>\n<hr \/>\n<p><strong>ONLINE SERVICES<\/strong><\/p>\n<p><strong>ntfy<\/strong> (pronounced &#8220;notify&#8221;) is a simple HTTP-based pub-sub notification service that sends alerts to your phone or desktop [<a href=\"https:\/\/ntfy.sh\/\">Link<\/a>]. It is open-source and can be self-hosted [<a href=\"https:\/\/github.com\/binwiederhier\/ntfy\">Link<\/a>].<\/p>\n<p><strong>healthchecks.io<\/strong> is an open-source, HTTP-based monitoring tool that collects events from multiple sources, displays them in a single dashboard, and sends notifications for failures or missing events [<a href=\"https:\/\/github.com\/healthchecks\/healthchecks\">Link<\/a>]. Read more about self-hosting it at [<a href=\"https:\/\/dft.wiki\/?p=2456#healthchecks\">Link<\/a>].<\/p>\n","protected":false},"excerpt":{"rendered":"<p>COMMANDS ~\/Downloads\/arduino-ide_2.3.4_Linux_64bit.AppImage &amp;&gt; \/dev\/null sudo apt install python3-pip pip3 install pyserial sudo usermod -aG userName [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-4483","post","type-post","status-publish","format-standard","hentry","category-general"],"_links":{"self":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/4483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4483"}],"version-history":[{"count":12,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/4483\/revisions"}],"predecessor-version":[{"id":5965,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/4483\/revisions\/5965"}],"wp:attachment":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}