Improved client handling. Added udp server.

This commit is contained in:
jancoow
2016-05-20 10:55:49 +02:00
parent d92f26636a
commit 80b74614da
+46 -57
View File
@@ -4,21 +4,37 @@ extern "C" {
} }
#include <Wire.h> #include <Wire.h>
#include <ESP8266WiFi.h> #include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#define MAX_CLIENTS 4 #define MAX_CLIENTS 4
#define SSIDVISIBLE 0
#define SSIDHIDDEN 1
String WifiSSIDPrefix = "CrystalPoint"; String WifiSSIDPrefix = "CrystalPoint";
char WifiPassword[10]; char WifiPassword[10];
char WifiSSID[17]; char WifiSSID[17];
uint8_t NumberOfConnectedControllers = 0;
ip_addr ConnectionList[MAX_CLIENTS] = {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){ void setup(void){
Serial.begin(115200); Serial.begin(115200);
Serial.println();
WiFi.onEvent(WiFiEvent);
//LED //LED
pinMode(4,OUTPUT); pinMode(4,OUTPUT);
@@ -27,65 +43,37 @@ void setup(void){
//BUTTON //BUTTON
pinMode(5,INPUT); pinMode(5,INPUT);
Udp.begin(udpPort);
delay(100); delay(100);
setupWifi(); setupWifi();
} }
int SSIDVisibleTimeout = 0; int SSIDVisibleTimeout = 0;
char SSIDVisible = 0; char SSIDVisible = 0;
int NumCurrentConnections = 0;
char ChangeInConnections = 0;
int ChangedConnectionsTimeout = 0;
char DeleteOrAdd = 0;
void loop(void){ void loop(void){
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
NumCurrentConnections = WiFi.softAPgetStationNum(); // display the packet contents in HEX
for (int i=1;i<=noBytes;i++){
if(NumberOfConnectedControllers != NumCurrentConnections){ Serial.printf("%c", packetBuffer[i-1]);
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);
} }
Serial.println();
} }
if(ChangeInConnections == 1 && ChangedConnectionsTimeout > 1000) if(SSIDVisible == 1 && (SSIDVisibleTimeout + 30000) < millis())
{
ChangeInConnections = 0;
ChangedConnectionsTimeout = 0;
}
if(SSIDVisible == 1)
{
SSIDVisibleTimeout++;
}
if(SSIDVisible == 1 && SSIDVisibleTimeout > 2000)
{ {
SSIDVisibleTimeout = 0; SSIDVisibleTimeout = 0;
ToggleWifiVisibility(0); ToggleWifiVisibility(0);
@@ -94,22 +82,21 @@ void loop(void){
if(digitalRead(5) == 1 && SSIDVisible == 0) if(digitalRead(5) == 1 && SSIDVisible == 0)
{ {
Serial.println("Button Pressed"); Serial.println("Button Pressed");
SSIDVisibleTimeout = millis();
ToggleWifiVisibility(1); ToggleWifiVisibility(1);
} }
delay(100);
} }
void ToggleWifiVisibility(char v) void ToggleWifiVisibility(char v)
{ {
if(v == 1){ if(v == 1){
SSIDVisible = 1; SSIDVisible = 1;
WiFi.softAP(WifiSSID, WifiPassword, 6, SSIDVISIBLE); WiFi.softAP(WifiSSID, WifiPassword, 6, 0);
digitalWrite(4, HIGH); digitalWrite(4, HIGH);
Serial.println("Wifi Visible"); Serial.println("Wifi Visible");
}else if(v == 0){ }else if(v == 0){
SSIDVisible = 0; SSIDVisible = 0;
WiFi.softAP(WifiSSID, WifiPassword, 6, SSIDHIDDEN); WiFi.softAP(WifiSSID, WifiPassword, 6, 1);
digitalWrite(4, LOW); digitalWrite(4, LOW);
Serial.println("Wifi Hidden"); Serial.println("Wifi Hidden");
} }
@@ -136,7 +123,8 @@ void RepopulateConnectionList(char n)
//str += IPAddress((stat_info->ip).addr).toString(); //str += IPAddress((stat_info->ip).addr).toString();
stat_info = STAILQ_NEXT(stat_info, next); 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. //Ip NOT found; This controller is gone.
ConnectionList[missingIP].addr = 0; ConnectionList[missingIP].addr = 0;
Serial.printf("Controller %d disconnected \n\r", missingIP); Serial.printf("Controller %d disconnected \n\r", missingIP);
@@ -181,7 +169,7 @@ void setupWifi(void){
generateWiFiSSID(); generateWiFiSSID();
generateWiFiPassword(); generateWiFiPassword();
WiFi.softAP(WifiSSID, WifiPassword, 6, SSIDVISIBLE); WiFi.softAP(WifiSSID, WifiPassword, 6, 1);
} }
void generateWiFiSSID() void generateWiFiSSID()
@@ -213,3 +201,4 @@ void generateWiFiPassword()
Serial.print("Wifi password: "); Serial.print("Wifi password: ");
Serial.println(WifiPassword); Serial.println(WifiPassword);
} }