Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ATmega - working on Arduino MKR1000 #278

Open
wants to merge 6 commits into
base: ATmega
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,8 @@
*.out
*.app
/tests/webSocketServer/node_modules

.DS_Store
*/.DS_Store
*/**/.DS_Store

108 changes: 108 additions & 0 deletions examples/WebSocketServerMKR1000/WebSocketServerMKR1000.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
/*
* WebSocketServer.ino
*
* Created on: 22.05.2015
*
*/

#include <Arduino.h>

#include <SPI.h>
#include <WiFi101.h>
#include <WebSocketsServer.h>


char ssid[] = ""; // your network SSID (name)
char pass[] = ""; // your network password
int keyIndex = 0;

WebSocketsServer webSocket = WebSocketsServer(8003);

#define USE_SERIAL Serial

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght) {

switch(type) {
case WStype_DISCONNECTED:
// USE_SERIAL.print(num);
// USE_SERIAL.println(" Disconnected!\n");
break;
case WStype_CONNECTED:
{
//IPAddress ip = webSocket.remoteIP(num);
//USE_SERIAL.println("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);
USE_SERIAL.println("connected");
// send message to client
webSocket.sendTXT(num, "Connected");
}
break;
case WStype_TEXT:
USE_SERIAL.print((char*)payload);
USE_SERIAL.println(" received");

// send message to client
// webSocket.sendTXT(num, "message here");

// send data to all connected clients
// webSocket.broadcastTXT("message here");
break;
case WStype_BIN:
USE_SERIAL.println("got some binary");
// USE_SERIAL.println("[%u] get binary lenght: %u\n", num, lenght);
// hexdump(payload, lenght);

// send message to client
// webSocket.sendBIN(num, payload, lenght);
break;
}

}

void setup() {
// USE_SERIAL.begin(921600);
USE_SERIAL.begin(115200);

//Serial.setDebugOutput(true);
// USE_SERIAL.setDebugOutput(true);

USE_SERIAL.println();
USE_SERIAL.println();
USE_SERIAL.println();

for(uint8_t t = 4; t > 0; t--) {
USE_SERIAL.print(t);
USE_SERIAL.println(" ... [SETUP] BOOT WAIT ...\n");
USE_SERIAL.flush();
delay(1000);
}
///CONNECT TO WIFI
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("NOT PRESENT");
return; // don't continue
}
Serial.println("WIFI MODULE DETECTED");
// attempt to connect to Wifi network:
while ( WiFi.status() != WL_CONNECTED) {

Serial.print("Attempting to connect to Network named: ");
Serial.println(ssid); // print the network name (SSID);

// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
Serial.print("Connected to ");
Serial.print(ssid);
Serial.print(" with IP:");
IPAddress ip = WiFi.localIP();
Serial.println(ip);
webSocket.begin();
webSocket.onEvent(webSocketEvent);
}

void loop() {
webSocket.loop();
delay(200);
}

145 changes: 108 additions & 37 deletions src/WebSockets.cpp
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,16 @@ extern "C" {
* @param reason
* @param reasonLen
*/
void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) {
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] clientDisconnect code: %u\n", client->num, code);
void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) {
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] clientDisconnect code: %u\n", client->num, code);
#else
DEBUG_WEBSOCKETS("[WS][");
DEBUG_WEBSOCKETS( client->num);
DEBUG_WEBSOCKETS("][handleWebsocket] clientDisconnect code:");
DEBUG_WEBSOCKETS(code);
DEBUG_WEBSOCKETS("\n");
#endif
if(client->status == WSC_CONNECTED && code) {
if(reason) {
sendFrame(client, WSop_close, (uint8_t *) reason, reasonLen);
Expand All @@ -82,21 +90,48 @@ void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * rea
*/
void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool mask, bool fin, bool headerToPayload) {

if(client->tcp && !client->tcp->connected()) {
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num);
if(client->tcp && !client->tcp->connected()) {
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num);
#else
DEBUG_WEBSOCKETS("[WS][");
DEBUG_WEBSOCKETS( client->num);
DEBUG_WEBSOCKETS("][sendFrame] not Connected!?\n");
#endif
return;
}

if(client->status != WSC_CONNECTED) {
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num);
if(client->status != WSC_CONNECTED) {
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not in WSC_CONNECTED state!?\n", client->num);
#else
DEBUG_WEBSOCKETS("[WS][");
DEBUG_WEBSOCKETS( client->num);
DEBUG_WEBSOCKETS("][sendFrame] not in WSC_CONNECTED state!?\n");
#endif

return;
}

DEBUG_WEBSOCKETS("[WS][%d][sendFrame] ------- send massage frame -------\n", client->num);
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] fin: %u opCode: %u mask: %u length: %u headerToPayload: %u\n", client->num, fin, opcode, mask, length, headerToPayload);

if(opcode == WSop_text) {
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0)));
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] ------- send massage frame -------\n", client->num);
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] fin: %u opCode: %u mask: %u length: %u headerToPayload: %u\n", client->num, fin, opcode, mask, length, headerToPayload);
#else
DEBUG_WEBSOCKETS("[WS][");
DEBUG_WEBSOCKETS( client->num);
DEBUG_WEBSOCKETS("][sendFrame] ------- send massage frame -------\n");
#endif


if(opcode == WSop_text) {
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] text: %s\n", client->num, (payload + (headerToPayload ? 14 : 0)));
#else
DEBUG_WEBSOCKETS("[WS][");
DEBUG_WEBSOCKETS( client->num);
DEBUG_WEBSOCKETS("][sendFrame] text:");
//DEBUG_WEBSOCKETS(String(payload + (headerToPayload ? 14 : 0)));
DEBUG_WEBSOCKETS("\n");
#endif
}

uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 };
Expand Down Expand Up @@ -125,7 +160,14 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay
// only for ESP since AVR has less HEAP
// try to send data in one TCP package (only if some free Heap is there)
if(!headerToPayload && ((length > 0) && (length < 1400)) && (ESP.getFreeHeap() > 6000)) {
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num);
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num);
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] pack to one TCP package...\n", client->num);
#else
DEBUG_WEBSOCKETS("[WS][");
DEBUG_WEBSOCKETS( client->num);
DEBUG_WEBSOCKETS("][sendFrame] pack to one TCP package...\n");
#endif
uint8_t * dataPtr = (uint8_t *) malloc(length + WEBSOCKETS_MAX_HEADER_SIZE);
if(dataPtr) {
memcpy((dataPtr + WEBSOCKETS_MAX_HEADER_SIZE), payload, length);
Expand Down Expand Up @@ -226,9 +268,16 @@ void WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay
client->tcp->write(&payloadPtr[0], length);
}
}

#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][sendFrame] sending Frame Done (%uus).\n", client->num, (micros() - start));

#else
DEBUG_WEBSOCKETS("[WS][");
DEBUG_WEBSOCKETS( client->num);
DEBUG_WEBSOCKETS("][sendFrame] sending Frame Done (");
DEBUG_WEBSOCKETS((micros() - start));
DEBUG_WEBSOCKETS("\n");
#endif

#ifdef WEBSOCKETS_USE_BIG_MEM
if(useInternBuffer && payloadPtr) {
free(payloadPtr);
Expand Down Expand Up @@ -257,8 +306,14 @@ void WebSockets::handleWebsocket(WSclient_t * client) {

uint8_t * payload = NULL;

DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num);


#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ------- read massage frame -------\n", client->num);
#else
DEBUG_WEBSOCKETS("[WS][");
DEBUG_WEBSOCKETS(client->num);
DEBUG_WEBSOCKETS("][handleWebsocket] ------- read massage frame -------\n");
#endif
if(!readWait(client, buffer, 2)) {
//timeout
clientDisconnect(client, 1002);
Expand Down Expand Up @@ -297,12 +352,14 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
payloadLen = buffer[4] << 24 | buffer[5] << 16 | buffer[6] << 8 | buffer[7];
}
}

DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n", client->num, fin, rsv1, rsv2, rsv3, opCode);
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] mask: %u payloadLen: %u\n", client->num, mask, payloadLen);

if(payloadLen > WEBSOCKETS_MAX_DATA_SIZE) {
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload to big! (%u)\n", client->num, payloadLen);
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] fin: %u rsv1: %u rsv2: %u rsv3 %u opCode: %u\n", client->num, fin, rsv1, rsv2, rsv3, opCode);
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] mask: %u payloadLen: %u\n", client->num, mask, payloadLen);
#endif
if(payloadLen > WEBSOCKETS_MAX_DATA_SIZE) {
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] payload to big! (%u)\n", client->num, payloadLen);
#endif
clientDisconnect(client, 1009);
return;
}
Expand All @@ -319,14 +376,18 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
// if text data we need one more
payload = (uint8_t *) malloc(payloadLen + 1);

if(!payload) {
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, payloadLen);
if(!payload) {
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] to less memory to handle payload %d!\n", client->num, payloadLen);
#endif
clientDisconnect(client, 1011);
return;
}

if(!readWait(client, payload, payloadLen)) {
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num);
if(!readWait(client, payload, payloadLen)) {
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] missing data!\n", client->num);
#endif
free(payload);
clientDisconnect(client, 1002);
return;
Expand All @@ -343,8 +404,10 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
}

switch(opCode) {
case WSop_text:
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload);
case WSop_text:
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload);
#endif
// no break here!
case WSop_binary:
messageRecived(client, opCode, payload, payloadLen);
Expand All @@ -353,21 +416,29 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
// send pong back
sendFrame(client, WSop_pong, payload, payloadLen);
break;
case WSop_pong:
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload);
case WSop_pong:
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload);
#endif
break;
case WSop_close:
{
uint16_t reasonCode = 1000;
if(payloadLen >= 2) {
reasonCode = payload[0] << 8 | payload[1];
}

DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d", client->num, reasonCode);
if(payloadLen > 2) {
DEBUG_WEBSOCKETS(" (%s)\n", (payload+2));
} else {
DEBUG_WEBSOCKETS("\n");
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d", client->num, reasonCode);
#endif

if(payloadLen > 2) {
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS(" (%s)\n", (payload+2));
#endif
} else {
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
DEBUG_WEBSOCKETS("\n");
#endif
}
clientDisconnect(client, 1000);
}
Expand Down
Loading