Advertisement
RuiViana

MeshServerV 11

Dec 16th, 2018
388
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.53 KB | None | 0 0
  1. //=============================( INCLUINDO DEFININDO E CONFIGURANDO BIBLIOTECAS )=============================
  2. //#define Debug
  3. #define   LED  2                                      // GPIO number of connected LED, ON ESP-12 IS GPIO2
  4. #define   bot  4                                      // GPIO botao, ON ESP-12 IS GPIO4
  5.  
  6. #include "setting.h"
  7. #include "IPAddress.h"
  8. #include "painlessMesh.h"
  9.  
  10. #ifdef ESP8266
  11. #include "Hash.h"
  12. #include <ESPAsyncTCP.h>
  13. #else
  14. #include "SPIFFS.h"
  15. #include <AsyncTCP.h>
  16. #endif
  17. #include <ESPAsyncWebServer.h>
  18.  
  19. //------------( CONFIGURANDO SSID, PASSWORD E PORT DA REDE MESH )-----------//
  20. #define   MESH_PREFIX     "whateverYouLike"
  21. #define   MESH_PASSWORD   "somethingSneaky"
  22. #define   MESH_PORT       5555
  23.  
  24. //--------( CONFIGURANDO SSID, PASSWORD E NOME DO HOST DA REDE WIFI )-------//
  25. #define   STATION_SSID     ssid
  26. #define   STATION_PASSWORD password
  27. #define   HOSTNAME "HTTP_BRIDGE"
  28.  
  29. void receivedCallback( const uint32_t &from, const String &msg );
  30.  
  31. SimpleList<uint32_t> nodes;
  32.  
  33. IPAddress getlocalIP();
  34.  
  35. painlessMesh  mesh;
  36. AsyncWebServer server(80);
  37. IPAddress myIP(0, 0, 0, 0);
  38. IPAddress myAPIP(0, 0, 0, 0);
  39. //==============================(     DECLARA VARIAVEIS GLOBAIS DE SISTEMA      )=============================
  40. String payLoad = "";                                  // String de js
  41. String nodID = "";                                    // Identificacao do no da rede mesh
  42. String nodMAC[16][12];                                // Matriz para guardar os MACs em HEX e parametros
  43. bool existe = 0;                                      // Controle de no na matriz
  44. int qtdeNos = 0;                                      // Nos identificados na rede
  45. bool stLED = 1;                                       // Status do LED  1 = Ligado
  46. //----------------------------------------------------------
  47. void listaNodes()
  48. {
  49. nodes = mesh.getNodeList();
  50.   SimpleList<uint32_t>::iterator node = nodes.begin();
  51.   while (node != nodes.end()) {
  52.     Serial.printf(" %u", *node);
  53.     node++;
  54.   }
  55.   Serial.println(" ");
  56. }
  57. //=============================(   VOID SETUP CONFIGURANDO SOFTWARE E HARDWARE  )=============================
  58. void setup() {
  59.   for (int i = 0; i < 16; i++)                        // Carrega vago em toda a matriz dos nos
  60.   {
  61.     nodMAC[i][0] = "vago";
  62.   }
  63.   Serial.begin(115200);
  64.   pinMode(LED, OUTPUT);
  65.   pinMode(bot, INPUT_PULLUP);
  66.   if (!SPIFFS.begin()) {
  67.     Serial.println("An Error has occurred while mounting SPIFFS");
  68.     return;
  69.   }
  70.   //---------------( CONFIGURANDO E INICIALIZANDO A REDE MESH )---------------//
  71.  
  72.   mesh.init( MESH_PREFIX, MESH_PASSWORD, MESH_PORT, WIFI_AP_STA, 6 );
  73.  
  74.   mesh.onReceive(&receivedCallback);
  75.   mesh.stationManual(STATION_SSID, STATION_PASSWORD);
  76.   mesh.setHostname(HOSTNAME);
  77.   myAPIP = IPAddress(mesh.getAPIP());
  78.   Serial.println("My AP IP is " + myAPIP.toString());
  79.  
  80.   uint32_t  myID =  mesh.getNodeId();
  81.   String master = "|1|";                              // ESP model ESP8266 = 0 ESP32 = 1
  82.   master += "1|";                                     // status ESP
  83.   master += "1|";                                     // Bot
  84.   master += stLED;                                    // Status LED
  85.   master += "|";                                      // Sepaarador
  86.   master += "1020";                                   // Valor analogico
  87.   master += "*";                                      // EOM
  88.   qtdeNos++;
  89.   extraiDados(myID, master);
  90.  
  91.   carregaPagina();
  92.  
  93.   /*
  94.     mesh.onNewConnection([](size_t nodeId) {
  95.       Serial.printf("New %u\n", nodeId);
  96.     });
  97.  
  98.     mesh.onDroppedConnection([](size_t nodeId) {
  99.       Serial.printf("Drop %u\n", nodeId);
  100.     });
  101.   */
  102. }
  103. //=============================(      VOID LOOP ROTINA PRINCIPAL DO SISTEMA     )=============================
  104. void loop() {
  105.   mesh.update();
  106.   if (myIP != getlocalIP()) {
  107.     myIP = getlocalIP();
  108.     Serial.println("My IP is " + myIP.toString());
  109.   }
  110.   if (digitalRead(bot) == LOW)                        // Se botao esta pressionado
  111.   {
  112.     delay(30);                                        // Debouncing
  113.     if (digitalRead(bot) == LOW)                      // Se botao continua pressionado
  114.     {
  115.       digitalWrite(LED, !digitalRead(LED));           // Inverte status LED
  116.     }
  117.   }
  118.   if (digitalRead(LED) == HIGH)
  119.     stLED = 1;
  120.   else
  121.     stLED = 0;
  122. }
  123. //===============( VOID receivedCallback RETORNA O ID E A MENSSAGEM DO NÓ ENVIADA PARA O ROOT )==============
  124. void receivedCallback( const uint32_t &from, const String &msg ) {
  125.   extraiDados(from, msg);
  126. }
  127. //------------------------------------------------------------------
  128. void extraiDados(uint32_t from, String msg)           // Extrai dados da msg e verifica se existe no na tabela
  129. {
  130.   nodID = String(from, HEX);                          // Transfor from em Strinf no formato HEX
  131.   nodID.toUpperCase();                                // Maiusculas
  132.   String b0, b1, b2, b3 = " " ;                       // variaveis de trabalho
  133.   b0 = nodID.substring(0, 2);                         // Separa os bytes
  134.   b1 = nodID.substring(2, 4);
  135.   b2 = nodID.substring(4, 6);
  136.   b3 = nodID.substring(6, 8);
  137.   nodID = b0 + ": " + b1 + ": " + b2 + ": " + b3;     // Junta no formato  XX:XX:XX:XX
  138.  
  139.   for (int i = 0; i < 16; i++) {                      // Matriz de 0 a 15
  140.     if (nodID == nodMAC[i][0]) {                      // Verifica se ja registrou o MAC do no
  141.       existe = 1;                                     // Se tiver, indica
  142.       refresh(msg, i);                                // Refresh nos parametros
  143.       break;                                          // Sai do for
  144.     }
  145.   }
  146.   if (existe == 0) {                                  // Se nao existe
  147.     for (int i = 0; i < 16; i++) {                    // Procura uma celula não ocupada = 0xFFFFFFFF
  148.       if (nodMAC[i][0] == "vago")                     // Se encontrou
  149.       {
  150.         selectMAC(from, msg, i);                      // Chama rotina pra transformar valor em HEX
  151.         existe = 1;                                   // Indica que existe
  152.         qtdeNos++;                                    // Invrementa numero de nos
  153.         break;                                        // Sai do for
  154.       }
  155.       if ( i >= 16)                                   // Se não tem posicao livre
  156.         Serial.println("Buffer cheio");               // imprime
  157.     }
  158.   }
  159.   existe = 0;                                         // Desabilita existe pra permitir proxima pesquisa
  160. }
  161. //===============================(   FUNÇÃO QUE REQUISITA O IP MESH DO ROOT   )==============================
  162. IPAddress getlocalIP() {
  163.   return IPAddress(mesh.getStationIP());
  164. }
  165. //===========( VOID carregaPagina SERVE AS FOLHAS HTML JQUERY BOOTSTRAP E JAVASCRIPT PARA O CLIENT )==========
  166. void carregaPagina() {
  167.   //--------------------(   SERVE O ARQUIVO index.htm    )--------------------//
  168.   server.on("/htm", HTTP_GET, [](AsyncWebServerRequest * request) {
  169.     request->send(SPIFFS, "/index.htm", "text/html");
  170.         listaNodes();
  171.   });
  172.  
  173.   //--------------------(  SERVE O ARQUIVO javascript.js )--------------------//
  174.   server.on("/javascript.js", HTTP_GET, [](AsyncWebServerRequest * request) {
  175.     request->send(SPIFFS, "/javascript.js", "application/javascript.js");
  176.   });
  177.  
  178.   //------------------( SERVE O ARQUIVO jquery-3.3.1.min.js )-----------------//
  179.   server.on("/jquery-3.3.1.min.js", HTTP_GET, [](AsyncWebServerRequest * request) {
  180.     request->send(SPIFFS, "/jquery-3.3.1.min.js", "application/javascript.js");
  181.   });
  182.  
  183.   //------------------(   SERVE O ARQUIVO bootstrap.min.js  )-----------------//
  184.   server.on("/bootstrap.min.js", HTTP_GET, [](AsyncWebServerRequest * request) {
  185.     request->send(SPIFFS, "/bootstrap.min.js", "application/javascript.js");
  186.   });
  187.  
  188.   //-----------------(   SERVE O ARQUIVO bootstrap.min.css  )-----------------//
  189.   server.on("/bootstrap.min.css", HTTP_GET, [](AsyncWebServerRequest * request) {
  190.     request->send(SPIFFS, "/bootstrap.min.css", "text/css");
  191.   });
  192.  
  193.   //-----------------(   SERVE O ARQUIVO bootstrap.min.css  )-----------------//
  194.   server.on("/estilo.css", HTTP_GET, [](AsyncWebServerRequest * request) {
  195.     request->send(SPIFFS, "/estilo.css", "text/css");
  196.   });
  197.  
  198.   //---------------------(      SERVE O ARQUIVO teste      )------------------//
  199.   server.on("/teste", HTTP_GET, [](AsyncWebServerRequest * request) {
  200.     payLoad = "";                                     // Limpa a mensagem da tela
  201.     for ( int i = 0; i <= qtdeNos; i++) {
  202.       payLoad += nodMAC[i][0];
  203.       payLoad += "|";
  204.       payLoad += nodMAC[i][1];
  205.       payLoad += "|1|0|";
  206.       payLoad += nodMAC[i][4];
  207.       payLoad += "|";
  208.       payLoad += nodMAC[i][5];
  209.       if (i < qtdeNos)
  210.         payLoad += "*";
  211.     }
  212.     request->send(200, "text / plain", payLoad);
  213.   });
  214.   //--------------------(      SERVE O ARQUIVO ligarLed      )----------------//
  215.   server.on("/ligarLed", HTTP_GET, [](AsyncWebServerRequest * request) {
  216.     if (request->hasArg("btnRoot")) {                 // No root
  217.       digitalWrite(LED, !digitalRead(LED));           // Inverte status do LED
  218.       String master = "|1|";                          // ESP model ESP8266 = 0 ESP32 = 1
  219.       master += "1|";                                 // status ESP
  220.       master += "1|";                                 // Bot
  221.       master += stLED;                                // Status LED
  222.       master += "|";                                  // Sepaarador
  223.       master += "1020";                               // Valor analogico
  224.       master += "*";                                  // EOM
  225.       refresh(master, 0);                             // Refresh nos parametros
  226.     }
  227.     if (request->hasArg("btnNode1")) {                // Primeiro no
  228.       String msg = request->arg("btnNode1");
  229.       msg += mesh.getNodeId();
  230.       msg += " 1";
  231.       uint32_t node = nodMAC[1][11].toInt();          // Identifica MAC do no
  232.       mesh.sendSingle(node, msg);                     // Envia msg para o no
  233.     }
  234.     if (request->hasArg("btnNode2")) {                // Segundo no
  235.       String msg = request->arg("btnNode2");
  236.       msg += mesh.getNodeId();
  237.       msg += " 1";
  238.       uint32_t node = nodMAC[2][11].toInt();          // Identifica MAC do no
  239.       mesh.sendSingle(node, msg);                     // Envia msg para o no
  240.     }
  241.  
  242.     request->send(200, "text / plain", payLoad);
  243.   });
  244.   server.begin();
  245. }
  246. //------------------------------------------------------------------
  247. void selectMAC( uint32_t from, String msg, uint8_t i) // Seleciona e salva valores recebidos de um novo no
  248. {
  249.   nodMAC[i][0] = nodID;
  250.   nodMAC[i][4] = msg.substring(7, 8);                 // Separa o valor do status do LED
  251.   nodMAC[i][5] = msg.substring(9, 13);                // Separa o valor analog
  252.   nodMAC[i][5] = nodMAC[i][5].toInt();                // Remove o * do final se for mmeno que 4 digitos
  253.   nodMAC[i][1] = msg.substring(1, 2);                 // Separa o valor do modelo do ESP
  254.   if (nodMAC[i][1] == "0")                            // Se for 0 é ESP3266
  255.     nodMAC[i][1] = "ESP8266";                         // Salva ESP8266
  256.   else                                                // Se for 1 é ESP32
  257.     nodMAC[i][1] =  "ESP32";                          // Salva ESP32
  258.   nodMAC[i][11] = String(from);                       // Salva MAC integral
  259.   listaMatris();                                      // Lista para Debug
  260. }
  261. //------------------------------------------------------------------
  262. void refresh(String msg, uint8_t i)                   // Atualiza os valores de parametro de um no
  263. {
  264.   nodMAC[i][4] = msg.substring(7, 8);                 // Separa o valor do status do LED
  265.   nodMAC[i][5] = msg.substring(9, 13);                // Separa o valor analog
  266.   nodMAC[i][5] = nodMAC[i][5].toInt();                // Remove o * do final se for mmeno que 4 digitos
  267.   listaMatris();                                      // Lista para Debug
  268. }
  269. //------------------------------------------------------------------
  270. void listaMatris()                                    // Lista matriz de nos
  271. {
  272. #ifdef Debug
  273.   for (int i = 0; i < 16; i++) {                      // Matriz de 0 a 15
  274.     if ((nodMAC[i][0]) == "vago") {                   // Testa s está vago
  275.       Serial.println(" ");                            // Imprime
  276.       break;                                          // Se for vago sai do for
  277.     }
  278.     for (int j = 0; j < 12; j++) {                    // Elemento de 0 a 11
  279.       Serial.print(nodMAC[i][j]);                     // Imprime
  280.     }
  281.     Serial.println(" ");                              // Imprime
  282.   }
  283. #endif
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement