Selaa lähdekoodia

Improved client handling. Added udp server.

jancoow 9 vuotta sitten
vanhempi
commit
80b74614da
1 muutettua tiedostoa jossa 48 lisäystä ja 59 poistoa
  1. 48 59
      ControllerBaseStation/ControllerBaseStation.ino

+ 48 - 59
ControllerBaseStation/ControllerBaseStation.ino

@@ -4,21 +4,37 @@ extern "C" {
 }
 #include <Wire.h>
 #include <ESP8266WiFi.h>
+#include <WiFiUdp.h>
 
 #define MAX_CLIENTS 4
-#define SSIDVISIBLE 0
-#define SSIDHIDDEN 1
 
 String WifiSSIDPrefix = "CrystalPoint";
 char WifiPassword[10];
 char WifiSSID[17];
 
-uint8_t NumberOfConnectedControllers = 0;
-
 ip_addr ConnectionList[MAX_CLIENTS] = {0};
 
+//UDP server (receiving) setup
+unsigned int udpPort = 2730;
+byte packetBuffer[512]; //udp package buffer
+WiFiUDP Udp;
+
+void WiFiEvent(WiFiEvent_t event) {
+    switch(event) {
+        case WIFI_EVENT_SOFTAPMODE_STACONNECTED:
+            Serial.println("NEW CONNECTED");
+            break;
+        case WIFI_EVENT_SOFTAPMODE_STADISCONNECTED:
+            Serial.println("DISCONNECTED");
+            break;
+    }
+}
+
 void setup(void){
   Serial.begin(115200);
+  Serial.println();
+
+  WiFi.onEvent(WiFiEvent);
 
   //LED
   pinMode(4,OUTPUT);
@@ -26,6 +42,8 @@ void setup(void){
 
   //BUTTON
   pinMode(5,INPUT);
+
+  Udp.begin(udpPort);
   
   delay(100);
   setupWifi();
@@ -33,59 +51,29 @@ void setup(void){
 
 int SSIDVisibleTimeout = 0;
 char SSIDVisible = 0;
-int NumCurrentConnections = 0;
-
-char ChangeInConnections = 0;
-int ChangedConnectionsTimeout = 0;
-char DeleteOrAdd = 0;
 
 void loop(void){
-
-  NumCurrentConnections = WiFi.softAPgetStationNum();
-
-  if(NumberOfConnectedControllers != NumCurrentConnections){
-      Serial.println("Connections differ");
-      ChangeInConnections = 1;
-      DeleteOrAdd = NumberOfConnectedControllers < NumCurrentConnections ? 1 : 0;
-      NumberOfConnectedControllers = NumCurrentConnections;
-  }
-
-  if(ChangeInConnections == 1)
-  {
-    ChangedConnectionsTimeout++;
-  }
-
-  if(ChangeInConnections == 1 && ChangedConnectionsTimeout % 10 == 0)
-  {
-    int ActualConnections = 0;
-    struct station_info *stat_info;
-    stat_info = wifi_softap_get_station_info();
-    while (stat_info != NULL) {
-      ActualConnections++;
-      stat_info = STAILQ_NEXT(stat_info, next);
-    }
-
-    if(ActualConnections == NumberOfConnectedControllers)
-    {
-      Serial.println("Connections match");
-      ChangeInConnections = 0;
-      ChangedConnectionsTimeout = 0;
-      RepopulateConnectionList(DeleteOrAdd);
+  int noBytes = Udp.parsePacket();
+  if ( noBytes ) {
+    Serial.print(millis() / 1000);
+    Serial.print(":Packet of ");
+    Serial.print(noBytes);
+    Serial.print(" received from ");
+    Serial.print(Udp.remoteIP());
+    Serial.print(":");
+    Serial.print(Udp.remotePort());
+    Serial.print(" - ");
+    // We've received a packet, read the data from it
+    Udp.read(packetBuffer,noBytes); // read the packet into the buffer
+
+    // display the packet contents in HEX
+    for (int i=1;i<=noBytes;i++){
+      Serial.printf("%c", packetBuffer[i-1]); 
     }
-  }
-
-  if(ChangeInConnections == 1 && ChangedConnectionsTimeout > 1000)
-  {
-    ChangeInConnections = 0;
-    ChangedConnectionsTimeout = 0;
-  }
+    Serial.println();
+  }  
   
-  if(SSIDVisible == 1)
-  {
-    SSIDVisibleTimeout++;
-  }
-
-  if(SSIDVisible == 1 && SSIDVisibleTimeout > 2000)
+  if(SSIDVisible == 1 && (SSIDVisibleTimeout + 30000) < millis())
   {
     SSIDVisibleTimeout = 0;
     ToggleWifiVisibility(0);
@@ -94,22 +82,21 @@ void loop(void){
   if(digitalRead(5) == 1 && SSIDVisible == 0)
   {
     Serial.println("Button Pressed");
+    SSIDVisibleTimeout = millis();
     ToggleWifiVisibility(1);
   }
-
-  delay(100);
 }
 
 void ToggleWifiVisibility(char v)
 {
   if(v == 1){
     SSIDVisible = 1;
-    WiFi.softAP(WifiSSID, WifiPassword, 6, SSIDVISIBLE); 
+    WiFi.softAP(WifiSSID, WifiPassword, 6, 0); 
     digitalWrite(4, HIGH);
     Serial.println("Wifi Visible");
   }else if(v == 0){
     SSIDVisible = 0;
-    WiFi.softAP(WifiSSID, WifiPassword, 6, SSIDHIDDEN); 
+    WiFi.softAP(WifiSSID, WifiPassword, 6, 1); 
     digitalWrite(4, LOW);
     Serial.println("Wifi Hidden");
   }
@@ -136,7 +123,8 @@ void RepopulateConnectionList(char n)
         //str += IPAddress((stat_info->ip).addr).toString();
         stat_info = STAILQ_NEXT(stat_info, next);
       }
- if(missingIP != 255 && ConnectionList[missingIP].addr != 0){
+
+      if(missingIP != 255 && ConnectionList[missingIP].addr != 0){
         //Ip NOT found; This controller is gone. 
         ConnectionList[missingIP].addr = 0;
         Serial.printf("Controller %d disconnected \n\r", missingIP);
@@ -181,7 +169,7 @@ void setupWifi(void){
   generateWiFiSSID();
   generateWiFiPassword();
 
-  WiFi.softAP(WifiSSID, WifiPassword, 6, SSIDVISIBLE);  
+  WiFi.softAP(WifiSSID, WifiPassword, 6, 1);  
 }
 
 void generateWiFiSSID()
@@ -213,3 +201,4 @@ void generateWiFiPassword()
   Serial.print("Wifi password: ");  
   Serial.println(WifiPassword);
 }
+