Improved client handling. Added udp server.
This commit is contained in:
@@ -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){
|
||||
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();
|
||||
|
||||
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);
|
||||
// display the packet contents in HEX
|
||||
for (int i=1;i<=noBytes;i++){
|
||||
Serial.printf("%c", packetBuffer[i-1]);
|
||||
}
|
||||
|
||||
if(ActualConnections == NumberOfConnectedControllers)
|
||||
{
|
||||
Serial.println("Connections match");
|
||||
ChangeInConnections = 0;
|
||||
ChangedConnectionsTimeout = 0;
|
||||
RepopulateConnectionList(DeleteOrAdd);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user