ControllerBaseStation.ino 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. extern "C" {
  2. #define LWIP_OPEN_SRC
  3. #include "user_interface.h"
  4. }
  5. #include <Wire.h>
  6. #include <ESP8266WiFi.h>
  7. #include <WiFiUdp.h>
  8. #define MAX_CLIENTS 4
  9. String WifiSSIDPrefix = "CrystalPoint";
  10. char WifiPassword[10];
  11. char WifiSSID[17];
  12. ip_addr ConnectionList[MAX_CLIENTS] = {0};
  13. //UDP server (receiving) setup
  14. unsigned int udpPort = 2730;
  15. byte packetBuffer[512]; //udp package buffer
  16. WiFiUDP Udp;
  17. void WiFiEvent(WiFiEvent_t event) {
  18. switch(event) {
  19. case WIFI_EVENT_SOFTAPMODE_STACONNECTED:
  20. Serial.println("NEW CONNECTED");
  21. break;
  22. case WIFI_EVENT_SOFTAPMODE_STADISCONNECTED:
  23. Serial.println("DISCONNECTED");
  24. break;
  25. }
  26. }
  27. void setup(void){
  28. Serial.begin(115200);
  29. Serial.println();
  30. WiFi.onEvent(WiFiEvent);
  31. //LED
  32. pinMode(2,OUTPUT);
  33. digitalWrite(2,LOW);
  34. //BUTTON
  35. pinMode(0,INPUT);
  36. Udp.begin(udpPort);
  37. delay(100);
  38. setupWifi();
  39. }
  40. int SSIDVisibleTimeout = 0;
  41. char SSIDVisible = 0;
  42. void loop(void){
  43. int noBytes = Udp.parsePacket();
  44. if ( noBytes ) {
  45. Serial.print(millis() / 1000);
  46. Serial.print(":Packet of ");
  47. Serial.print(noBytes);
  48. Serial.print(" received from ");
  49. Serial.print(Udp.remoteIP());
  50. Serial.print(":");
  51. Serial.print(Udp.remotePort());
  52. Serial.print(" - ");
  53. // We've received a packet, read the data from it
  54. Udp.read(packetBuffer,noBytes); // read the packet into the buffer
  55. // display the packet contents in HEX
  56. for (int i=1;i<=noBytes;i++){
  57. Serial.printf("%c", packetBuffer[i-1]);
  58. }
  59. Serial.println();
  60. }
  61. if(SSIDVisible == 1 && (SSIDVisibleTimeout + 30000) < millis())
  62. {
  63. SSIDVisibleTimeout = 0;
  64. ToggleWifiVisibility(0);
  65. }
  66. if(digitalRead(0) == 0 && SSIDVisible == 0)
  67. {
  68. Serial.println("Button Pressed");
  69. SSIDVisibleTimeout = millis();
  70. ToggleWifiVisibility(1);
  71. }
  72. }
  73. void ToggleWifiVisibility(char v)
  74. {
  75. if(v == 1){
  76. SSIDVisible = 1;
  77. WiFi.softAP(WifiSSID, WifiPassword, 6, 0);
  78. digitalWrite(2, HIGH);
  79. Serial.println("Wifi Visible");
  80. }else if(v == 0){
  81. SSIDVisible = 0;
  82. WiFi.softAP(WifiSSID, WifiPassword, 6, 1);
  83. digitalWrite(2, LOW);
  84. Serial.println("Wifi Hidden");
  85. }
  86. }
  87. void RepopulateConnectionList(char n)
  88. {
  89. struct station_info *stat_info;
  90. stat_info = wifi_softap_get_station_info();
  91. //Controller disconnected
  92. if(n == 0){
  93. Serial.println("Old controller disconnected..");
  94. for(char i=0; i < MAX_CLIENTS; i++){
  95. char missingIP = 0;
  96. while (stat_info != NULL) {
  97. if(ip_addr_cmp(&ConnectionList[i], &stat_info->ip)){
  98. missingIP = 255;
  99. break;
  100. }else{
  101. missingIP = i;
  102. }
  103. //str += IPAddress((stat_info->ip).addr).toString();
  104. stat_info = STAILQ_NEXT(stat_info, next);
  105. }
  106. if(missingIP != 255 && ConnectionList[missingIP].addr != 0){
  107. //Ip NOT found; This controller is gone.
  108. ConnectionList[missingIP].addr = 0;
  109. Serial.printf("Controller %d disconnected \n\r", missingIP);
  110. }
  111. }
  112. }
  113. //new controller
  114. else if(n == 1){
  115. Serial.println("New controller connected..");
  116. while (stat_info != NULL){
  117. Serial.println(IPAddress((stat_info->ip).addr).toString());
  118. char addedIP = 0;
  119. for(char i=0; i < MAX_CLIENTS; i++){
  120. Serial.println(ip_addr_cmp(&ConnectionList[i], &stat_info->ip));
  121. if(ip_addr_cmp(&ConnectionList[i], &stat_info->ip)){
  122. addedIP = 255;
  123. break;
  124. }else{
  125. addedIP = i;
  126. }
  127. }
  128. if(addedIP != 255){
  129. //Ip NOT found; This controller is new.
  130. for(char i=0; i < MAX_CLIENTS; i++){
  131. if(ConnectionList[i].addr == 0){
  132. ConnectionList[i] = stat_info->ip;
  133. Serial.printf("Controller connect, place of index: %d \n\r", i);
  134. break;
  135. }
  136. }
  137. }
  138. Serial.println("---");
  139. stat_info = STAILQ_NEXT(stat_info, next);
  140. }
  141. }
  142. }
  143. void setupWifi(void){
  144. WiFi.disconnect(true);
  145. WiFi.mode(WIFI_AP);
  146. generateWiFiSSID();
  147. generateWiFiPassword();
  148. WiFi.softAP(WifiSSID, WifiPassword, 6, 1);
  149. }
  150. void generateWiFiSSID()
  151. {
  152. //Last 4 digits mac adress
  153. uint8_t mac[WL_MAC_ADDR_LENGTH];
  154. WiFi.softAPmacAddress(mac);
  155. String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) +
  156. String(mac[WL_MAC_ADDR_LENGTH - 1], HEX);
  157. macID.toUpperCase();
  158. WifiSSIDPrefix += macID;
  159. memset(WifiSSID, 0, WifiSSIDPrefix.length() + 1);
  160. for (int i=0; i<WifiSSIDPrefix.length(); i++)
  161. WifiSSID[i] = WifiSSIDPrefix.charAt(i);
  162. }
  163. void generateWiFiPassword()
  164. {
  165. String WifiStringPassword;
  166. for(char i=0; i < 17; i++){
  167. String s = String(WifiSSID[i], HEX);
  168. WifiStringPassword = s + WifiStringPassword;
  169. }
  170. for (int i=0; i < 10; i++)
  171. WifiPassword[i] = WifiStringPassword.charAt(i);
  172. WifiPassword[9] = '\0';
  173. Serial.print("Wifi password: ");
  174. Serial.println(WifiPassword);
  175. }