As explained in this webpage, the WebSocket protocol allows full-duplex, bi-directional communications between a server and clients.
In this tutorial, we will be using a public server provided by mbed for testing purposes.
So you just have to program your mbed!
If you want more information regarding the server side code, see Websockets Server
This tutorial is divided into three parts:
You may wish to skip to the relevant section after you have chosen whether you are using WiFi or Ethernet
The url format to establish a connection with the server is: ws://sockets.mbed.org/ws/<channel>/<mode> (Don't try and go here, it will not work)
The WebSockets are divided into channels.
There are 3 connection modes:
When the server receives a message from a client in a certain channel who is not in 'ro' mode:
This code is very similar to the one presented in second part of this tutorial.
You can skip this section if you don't want to write yourself the javascript code.
We present this code for you to modify as you wish, but if you want to just go to the webpage of your own channel:
For instance, to view all messages on the 'samux' channel, visit:
http://sockets.mbed.org/samux/viewer.
If you adapt the last part of the previous url, you can see the activity on your own channel ;)
<!doctype html>
<html>
<head>
<style type="text/css">
body {
text-align: center;
min-width: 500px;
}
</style>
<script src="http://code.jquery.com/jquery.min.js"></script>
<script>
function log(m) {
d = document.getElementById("log");
d.innerHTML = m + "<br/>" + d.innerHTML;
}
$(document).ready(function () {
$("#open").click(function(evt) {
evt.preventDefault();
var channel = $("#channel").val();
var ws = new WebSocket("ws://sockets.mbed.org/ws/" + $("#channel").val() + "/rw");
ws.onopen = function(evt) {
$("#channel").css("background", "#00ff00");
document.getElementById("title").innerHTML = "Websockets streaming on channel: " + $("#channel").val();
};
ws.onmessage = function(evt) { log("message: " + evt.data); };
ws.onclose = function(evt) { log("socket closed"); };
});
});
</script>
</head>
<body>
<h1 id="title">Websockets Streaming</h1>
<label for="channel">channel:</label>
<input type="text" id="channel" style="background:#ff0000;"/><br />
<input type="submit" id="open" value="open" />
<div id="log"></div>
</body>
</html>
On this webpage, you must associate your connection with a 'channel'. In this example, I will use the channel samux, but I could use anything. So I fill in the channel field and press open
If the connection is established:
For this part you need to import these libraries:
You may wish to skim the page on the WiFly module.
The main code:
#include "mbed.h"
#include "Wifly.h"
#include "Websocket.h"
DigitalOut l1(LED1);
//Here, we create an instance, with pins 9 and 10 connecting to the
//WiFly's TX and RX pins, and pin 21 to RESET. We are connecting to the
//"mbed" network, password "password", and we are using WPA.
Wifly wifly(p9, p10, p21, "mbed", "password", true);
//Here, we create a Websocket instance in 'rw' (read-write) mode
//on the 'samux' channel
Websocket ws("ws://sockets.mbed.org/ws/samux/rw", &wifly);
int main() {
char recv[40];
while (1) {
//we connect the network
while (!wifly.join()) {
wifly.reset();
}
//we connect to the websocket server
while (!ws.connect());
while (1) {
wait(0.5);
//Send Hello world
ws.send("Hello World! over Wifi");
// if a message is available, print it
if (ws.read(recv)) {
// show that we receive messages
l1 = !l1;
}
}
}
}
Websocket Hello World over a wifi network
This code is very simple:
Don't forget to adapt:
You can join the server, create your own channel, send and view messages over your channel just by visiting:
If you are using the javascript code presented at the beginning of this document, you should be able to see the messages on your channel
You can also check that all is working by visiting the webpage of your own channel: http://sockets.mbed.org/your_own_channel/viewer
For instance: http://sockets.mbed.org/samux/viewer
On the mbed side, you can see all messages received (only with the mbed LPC1768):
Et Voilà! We are able to send data on our webpage over a wifi network!
For this part you need to import these libraries:
The main code:
#include "mbed.h"
#include "Websocket.h"
Serial pc(USBTX, USBRX);
Timer tmr;
//Here, we create a Websocket instance in 'rw' (write) mode
//on the 'samux' channel
Websocket ws("ws://sockets.mbed.org/ws/samux/rw");
int main() {
char recv[128];
while (1) {
while (!ws.connect())
pc.printf("cannot connect websocket, retrying\r\n");
tmr.start();
while (1) {
if (tmr.read() > 0.5) {
ws.send("Hello World! over Ethernet");
if (ws.read(recv)) {
pc.printf("recv: %s\r\n", recv);
}
tmr.start();
}
Net::poll();
}
}
}
Websocket Hello World over an ethernet network
This code is very simple:
Note that the WebSocket API is the same for using a WiFi module or an Ethernet connection
Don't forget to edit:
You can join the server, create your own channel, send and view messages over your channel just by visiting:
If you are using the javascript code presented above in this document, you should be able to see the messages on your channel
You can also check that all is working by visiting the webpage of your own channel: http://sockets.mbed.org/your_own_channel/viewer
For instance: http://sockets.mbed.org/samux/viewer
On the mbed side, you should see all messages received:
Et Voilà! We are able to see on our webpage Hello World over an Ethernet network!
Now, if you want, you can write your own webpage to process and display the data coming in on your channel whichever way you wish!
After this tutorial, you are able to send messages to every webpage connected to a websocket server. You can imagine sending data from sensors and print or display values received in the webpage. Sensors are now accessible all over the world. You can take a look to the Internet Of Things project where data are sent and displayed in real time using another HTML5 feature: canvas.
No tags
|
11 comments
Please login to post comments.
Hello, I must say this is absolutely nice piece of work which solve big problem with connecting to mbed which obtains IP from DHCP. This IP may vary and reachability is limited to reading this IP assigned to mbed from DHCP on terminal or display attached to mbed. But if mbed has no display and is not possible to check IP every time if mbed connected to LAN via cable or wirelessly this is what You will love.
And now comes my question. Because I can see there are 3 connection modes and one of them is named read and write, I would like to ask if there is any plan about adding ability to write data to mbed from internet browser. I think something easy like field to write text with button named "send to mbed" or simple button which will command mbed to send data or stop sending data.
I think websockets opens absolutely new world to every aplication used on mbed where is required any user interface. Because I wanted to add user interface to command mbed I was thinking about any software to write for PC side and use USB connection. But Websockets changes everything.
You can make own server with Tornado and then You have ability to command mbed not only from PC (USB connection limits to have mbed still connected) but from every device with ability to display web pages and it means not only PC but also tablets, smartphones, TVs...
And as I think it is easier to make web page on server then to create program for PC. So I see mbed with endless options at (not only) home automation with not only sensing data but with capability to be commanded and if I add plus like no need to know IP of mbed and beauty user interface...
I must say that this is AWESOME