How to stream using WebSockets (Links2004/arduinoWebSockets)
Posted: Fri Oct 09, 2015 11:59 am
I am trying to get streaming (of data, > 16 updates / sec) from an esp8266 working using the library at https://github.com/Links2004/arduinoWebSockets.
Using the server example and the html in the test subfolder, the updates (time messages) come in at 1 update every second. If I lower the html polling interval to <100ms it crashes with a message LmacRxBlk:1, which as I understand is a full buffer.
I can't figure out what is wrong. Any help appreciated!
The code:
Also the following html which waits for call back from esp8266 and issues a new setTimeout for new refresh (and thus avoids a new request while previous is not yet handled) gives same error.
Using the server example and the html in the test subfolder, the updates (time messages) come in at 1 update every second. If I lower the html polling interval to <100ms it crashes with a message LmacRxBlk:1, which as I understand is a full buffer.
I can't figure out what is wrong. Any help appreciated!
The code:
Code: Select all
// WebSocketServer.ino
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WebSocketsServer.h>
#include <Hash.h>
ESP8266WiFiMulti WiFiMulti;
WebSocketsServer webSocket = WebSocketsServer(81);
#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.printf("[%u] Disconnected!\n", num);
break;
case WStype_CONNECTED:
{
IPAddress ip = webSocket.remoteIP(num);
USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);
}
break;
case WStype_TEXT:
USE_SERIAL.printf("[%u] get Text: %s\n", num, payload);
// echo data back to browser
webSocket.sendTXT(num, payload, lenght);
// send data to all connected clients
//webSocket.broadcastTXT(payload, lenght);
break;
case WStype_BIN:
USE_SERIAL.printf("[%u] get binary lenght: %u\n", num, lenght);
hexdump(payload, lenght);
// echo data back to browser
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.printf("[SETUP] BOOT WAIT %d...\n", t);
USE_SERIAL.flush();
delay(1000);
}
WiFiMulti.addAP("ssid", "password");
while(WiFiMulti.run() != WL_CONNECTED) {
delay(100);
}
webSocket.begin();
webSocket.onEvent(webSocketEvent);
}
void loop() {
webSocket.loop();
}
Code: Select all
<html>
<head>
<script>
var connection = new WebSocket('ws://192.168.0.13:81/test', ['arduino']);
connection.onopen = function () {
connection.send('Message from Browser to ESP8266 yay its Working!! ' + new Date());
connection.send('ping');
};
connection.onerror = function (error) {
console.log('WebSocket Error ', error);
};
connection.onmessage = function (e) {
console.log('Server: ', e.data);
};
setInterval(function() {
connection.send('Time: ' + new Date());
}, 1000/16);
</script>
</head>
<body>
Test Websocket.
</body>
</html>
Also the following html which waits for call back from esp8266 and issues a new setTimeout for new refresh (and thus avoids a new request while previous is not yet handled) gives same error.
Code: Select all
<html>
<head>
<script>
var connection = new WebSocket('ws://192.168.0.13:81/test', ['arduino']);
connection.onopen = function () {
connection.send('Message from Browser to ESP8266 yay its Working!! ' + new Date());
connection.send('ping');
setTimeout(refresh,3000);
};
connection.onerror = function (error) {
console.log('WebSocket Error ', error);
};
connection.onmessage = function (e) {
console.log('Server: ', e.data);
};
function refresh(){
connection.send('Time: ' + new Date());
setTimeout(refresh,50);
}
</script>
</head>
<body>
Test Websocket.
</body>
</html>