2019-05-17 08:29:48 +00:00
|
|
|
#include <Arduino.h>
|
|
|
|
#include <ESPmDNS.h>
|
2019-05-17 16:31:54 +00:00
|
|
|
#include <WebSocketsClient.h>
|
2019-05-17 08:29:48 +00:00
|
|
|
|
|
|
|
#define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT
|
|
|
|
#define ETH_PHY_POWER 12
|
|
|
|
|
|
|
|
#include <ETH.h>
|
|
|
|
|
2019-05-17 16:31:54 +00:00
|
|
|
#define blinkDuration 500
|
|
|
|
#define connectDuration 1000
|
|
|
|
|
2019-05-17 16:50:14 +00:00
|
|
|
#define lampOutputPin 5
|
2019-05-17 16:31:54 +00:00
|
|
|
bool isBlinking = false;
|
|
|
|
bool lampState = false;
|
2019-05-17 08:29:48 +00:00
|
|
|
|
2019-05-17 16:31:54 +00:00
|
|
|
long blinkTimer = 0;
|
|
|
|
long connectTimer = 0;
|
|
|
|
|
|
|
|
bool foundIp = false;
|
2019-05-18 13:56:56 +00:00
|
|
|
IPAddress ip; // = IPAddress(192, 168, 0, 111); // FIXME:
|
2019-05-17 16:31:54 +00:00
|
|
|
|
|
|
|
WebSocketsClient webSocket;
|
2019-05-17 08:29:48 +00:00
|
|
|
|
|
|
|
static bool eth_connected = false;
|
|
|
|
|
|
|
|
const char *PARAM_MESSAGE = "message";
|
|
|
|
|
|
|
|
void WiFiEvent(WiFiEvent_t event) {
|
|
|
|
switch (event) {
|
|
|
|
case SYSTEM_EVENT_ETH_START:
|
|
|
|
Serial.println("ETH Started");
|
|
|
|
// set eth hostname here
|
|
|
|
ETH.setHostname("a2clight");
|
|
|
|
break;
|
|
|
|
case SYSTEM_EVENT_ETH_CONNECTED:
|
|
|
|
Serial.println("ETH Connected");
|
|
|
|
break;
|
|
|
|
case SYSTEM_EVENT_ETH_GOT_IP:
|
|
|
|
Serial.print("ETH MAC: ");
|
|
|
|
Serial.print(ETH.macAddress());
|
|
|
|
Serial.print(", IPv4: ");
|
|
|
|
Serial.print(ETH.localIP());
|
|
|
|
if (ETH.fullDuplex()) {
|
|
|
|
Serial.print(", FULL_DUPLEX");
|
|
|
|
}
|
|
|
|
Serial.print(", ");
|
|
|
|
Serial.print(ETH.linkSpeed());
|
|
|
|
Serial.println("Mbps");
|
|
|
|
eth_connected = true;
|
|
|
|
break;
|
|
|
|
case SYSTEM_EVENT_ETH_DISCONNECTED:
|
|
|
|
Serial.println("ETH Disconnected");
|
|
|
|
eth_connected = false;
|
|
|
|
break;
|
|
|
|
case SYSTEM_EVENT_ETH_STOP:
|
|
|
|
Serial.println("ETH Stopped");
|
|
|
|
eth_connected = false;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-17 16:31:54 +00:00
|
|
|
void blinkLamp() { isBlinking = true; }
|
|
|
|
|
|
|
|
void noBlinkLamp() {
|
|
|
|
isBlinking = false;
|
|
|
|
lampState = false;
|
|
|
|
digitalWrite(lampOutputPin, LOW);
|
|
|
|
}
|
|
|
|
|
|
|
|
void webSocketEvent(WStype_t type, uint8_t *payload, size_t length) {
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case WStype_DISCONNECTED:
|
|
|
|
Serial.println("[WSc] Disconnected!");
|
2019-05-18 13:56:56 +00:00
|
|
|
foundIp = false;
|
2019-05-17 16:31:54 +00:00
|
|
|
break;
|
|
|
|
case WStype_CONNECTED: {
|
|
|
|
Serial.print("[WSc] Connected to controller");
|
|
|
|
webSocket.sendTXT("event: con lamp: 1");
|
2019-05-18 13:56:56 +00:00
|
|
|
foundIp = true;
|
2019-05-17 16:31:54 +00:00
|
|
|
} break;
|
|
|
|
case WStype_TEXT:
|
|
|
|
Serial.print("[WSc] get text:");
|
|
|
|
Serial.println((char *)payload);
|
|
|
|
if (strcmp((char *)payload, "blinkLamp") == 0) {
|
|
|
|
blinkLamp();
|
|
|
|
Serial.println("Enable Blinking!");
|
|
|
|
} else if (strcmp((char *)payload, "noBlinkLamp") == 0) {
|
|
|
|
noBlinkLamp();
|
|
|
|
Serial.println("Disable Blinking!");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2019-05-17 08:29:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void setup() {
|
|
|
|
Serial.begin(115200);
|
2019-05-17 16:31:54 +00:00
|
|
|
pinMode(lampOutputPin, OUTPUT);
|
|
|
|
|
2019-05-17 08:29:48 +00:00
|
|
|
WiFi.onEvent(WiFiEvent);
|
|
|
|
ETH.begin();
|
|
|
|
|
|
|
|
while (!eth_connected) {
|
|
|
|
delay(1000);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!MDNS.begin("a2clight")) {
|
2019-05-17 16:31:54 +00:00
|
|
|
Serial.println("Error setting up MDNS responder!");
|
2019-05-17 08:29:48 +00:00
|
|
|
while (1) {
|
|
|
|
delay(1000);
|
|
|
|
}
|
|
|
|
}
|
2019-05-17 16:31:54 +00:00
|
|
|
}
|
2019-05-17 08:29:48 +00:00
|
|
|
|
2019-05-17 16:31:54 +00:00
|
|
|
void browseService(const char *service, const char *proto) {
|
|
|
|
Serial.printf("Browsing for service _%s._%s.local. ... ", service, proto);
|
|
|
|
int n = MDNS.queryService(service, proto);
|
|
|
|
if (n == 0) {
|
|
|
|
Serial.println("no services found");
|
|
|
|
} else {
|
|
|
|
Serial.print(n);
|
|
|
|
Serial.println(" service(s) found");
|
|
|
|
for (int i = 0; i < n; ++i) {
|
|
|
|
// Print details for each service found
|
|
|
|
Serial.print(" ");
|
|
|
|
Serial.print(i + 1);
|
|
|
|
Serial.print(": ");
|
|
|
|
Serial.print(MDNS.hostname(i));
|
|
|
|
Serial.print(" (");
|
|
|
|
Serial.print(MDNS.IP(i));
|
|
|
|
Serial.print(":");
|
|
|
|
Serial.print(MDNS.port(i));
|
|
|
|
Serial.println(")");
|
|
|
|
|
2019-05-17 16:50:14 +00:00
|
|
|
if (MDNS.hostname(i).startsWith("a2clcontroller")) {
|
2019-05-17 16:31:54 +00:00
|
|
|
Serial.println("Trying to connect");
|
|
|
|
Serial.println(MDNS.IP(i));
|
|
|
|
|
|
|
|
foundIp = true;
|
|
|
|
ip = MDNS.IP(i);
|
2019-05-17 16:50:14 +00:00
|
|
|
webSocket.begin(ip.toString(), 80, "/ws");
|
2019-05-17 16:31:54 +00:00
|
|
|
webSocket.onEvent(webSocketEvent);
|
|
|
|
// webSocket.setAuthorization("user", "Password");
|
|
|
|
webSocket.setReconnectInterval(3000);
|
2019-05-18 13:56:56 +00:00
|
|
|
webSocket.enableHeartbeat(15000, 3000, 2);
|
2019-05-17 16:31:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Serial.println();
|
|
|
|
}
|
2019-05-17 08:29:48 +00:00
|
|
|
|
2019-05-17 16:31:54 +00:00
|
|
|
void loop() {
|
|
|
|
if (!foundIp && eth_connected && ((millis() - connectTimer) > connectDuration)) {
|
2019-05-17 16:50:14 +00:00
|
|
|
browseService("http", "tcp");
|
|
|
|
/*
|
2019-05-17 16:31:54 +00:00
|
|
|
ip = MDNS.queryHost("a2clcontroller");
|
|
|
|
Serial.println(ip);
|
|
|
|
foundIp = true;
|
|
|
|
webSocket.begin(ip, 80, "/ws");
|
|
|
|
webSocket.onEvent(webSocketEvent);
|
|
|
|
// webSocket.setAuthorization("user", "Password");
|
|
|
|
webSocket.setReconnectInterval(3000);
|
2019-05-17 16:50:14 +00:00
|
|
|
*/
|
2019-05-17 16:31:54 +00:00
|
|
|
connectTimer = millis();
|
|
|
|
}
|
2019-05-17 08:29:48 +00:00
|
|
|
|
2019-05-17 16:50:14 +00:00
|
|
|
if (foundIp)
|
|
|
|
webSocket.loop();
|
2019-05-17 08:29:48 +00:00
|
|
|
|
2019-05-17 16:50:14 +00:00
|
|
|
if (isBlinking && millis() - blinkTimer > blinkDuration) {
|
2019-05-17 16:31:54 +00:00
|
|
|
lampState = !lampState;
|
|
|
|
digitalWrite(lampOutputPin, lampState);
|
|
|
|
blinkTimer = millis();
|
|
|
|
}
|
2019-05-17 08:29:48 +00:00
|
|
|
}
|