-->
Page 1 of 1

How to stream using WebSockets (Links2004/arduinoWebSockets)

PostPosted: Fri Oct 09, 2015 11:59 am
by NardJ
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:
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>

Re: How to stream using WebSockets (Links2004/arduinoWebSock

PostPosted: Tue Jul 26, 2016 7:07 am
by kira
any solution? same problem here...