esp-open-rtos/examples/http_server/fsdata/fs/websockets.html
2017-02-02 12:17:53 +06:00

130 lines
4.2 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no">
<link rel="stylesheet" type="text/css" href="css/siimple.min.css">
<link rel="stylesheet" type="text/css" href="css/style.css">
<link rel="shortcut icon" href="img/favicon.png">
<title>HTTP Server</title>
</head>
<body>
<ul class="navbar">
<li><a href="/">Home</a></li>
<li><a class="active" href="websockets">WebSockets</a></li>
<li><a href="about">About</a></li>
</ul>
<div class="grid main">
<h1>WebSockets Demo</h1>
<div id="status_box" class="alert alert-info">Loading..</div>
<p>This page is similar to the home page but uses WebSockets for real-time updates.</p>
<div class="cover" align="center">
<canvas id="chartCanvas" width="512" height="100"></canvas>
<p/>
<p>LED Control</p>
<div class="onoffswitch">
<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="led-switch" onclick="gpio()">
<label class="onoffswitch-label" for="led-switch">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
</div>
<h1>Server Status</h1>
<table class="table table-striped">
<tr>
<td><b>Uptime:</b></td>
<td id="uptime"></td>
</tr>
<tr>
<td><b>Free heap:</b></td>
<td id="heap"></td>
</tr>
<tr>
<td><b>LED state:</b></td>
<td id="led"></td>
</tr>
</table>
<h1>How it works</h1>
<p>This demo uses 2 WebScokets. Status parameters are streamed by the server in JSON format every 2 seconds.
A <code>websocket_task</code> is created each time a specific URI is requested.</p>
<p>ADC values are being continuously polled by the client (i.e. your browser).
Each time a WebSocket frame is received on the server side, <code>websocket_cb</code> function is being called.</p>
</div>
<script type="text/javascript" src="js/smoothie_min.js"></script>
<script>
var ws;
var retries;
var series = new TimeSeries();
window.onload = function() {
wsOpen();
startPolling();
}
function setMsg(cls, text) {
sbox = document.getElementById('status_box');
sbox.className = "alert alert-" + cls;
sbox.innerHTML = text;
console.log(text);
}
function startPolling() {
var chart = new SmoothieChart({millisPerPixel:11,grid:{fillStyle:'#ffffff',strokeStyle:'#ffffff',borderVisible:false},
labels:{fillStyle:'#000000'},maxValue:1024,minValue:0});
chart.addTimeSeries(series, {lineWidth:2,strokeStyle:'#03a9f4',fillStyle:'#f1f5fa'});
chart.streamTo(document.getElementById("chartCanvas"), 500);
setInterval(function() { wsWrite('A'); }, 500);
}
function onMessage(evt) {
retries = 0;
var dv = new DataView(evt.data);
var val = dv.getUint16(0);
if (val == 0xBEEF || val == 0xDEAD)
console.log("LED switched");
else
series.append(new Date().getTime(), val);
}
function wsOpen() {
if (ws === undefined || ws.readyState != 0) {
if (retries)
setMsg("error", "WebSocket timeout, retrying..");
else
setMsg("info", "Opening WebSocket..");
ws = new WebSocket("ws://" + location.host);
ws.binaryType = 'arraybuffer';
ws.onopen = function(evt) { retries = 0; setMsg("done", "WebSocket is open."); };
ws.onerror = function(evt) { setMsg("error", "WebSocket error!"); };
ws.onmessage = function(evt) { onMessage(evt); };
wsOpenStream();
retries = 0;
}
}
function wsOpenStream() {
var uri = "/stream"
var ws = new WebSocket("ws://" + location.host + uri);
ws.onmessage = function(evt) {
console.log(evt.data);
var stats = JSON.parse(evt.data);
console.log(stats);
document.getElementById('uptime').innerHTML = stats.uptime + ' seconds';
document.getElementById('heap').innerHTML = stats.heap + ' bytes';
document.getElementById('led').innerHTML = (stats.led == 1) ? 'On' : 'Off';
};
}
function wsWrite(data) {
if (ws.readyState == 3 || retries++ > 5)
wsOpen();
else if (ws.readyState == 1)
ws.send(data);
}
function gpio() {
if (document.getElementById('led-switch').checked)
wsWrite('E');
else
wsWrite('D');
}
</script>
</body>
</html>