IOT Lock using WebSocket and Bluetooth
This is a small project using Websocket and Bluetooth to control a lock. The servo is used as a demonstration for a lock as it functionality is similar. There are 4 components in this project: the mbed, ethernet, bluetooth, and servo with external power. The main program uses two threads to handle bluetooth and internet signal. The Websocket address must match to the server address.
| MBED | Bluetooth |
|---|---|
| gnd | gnd |
| VU(5v) | Vin |
| nc | RTS |
| Gnd | CTS |
| p14 (Serial RX) | TXO |
| p13 (Serial TX) | RXI |
| MBED | Servo | External Power(5V) |
|---|---|---|
| p21 | Signal line (yellow) | |
| nc | Red line | Vin(5V) |
| GND | Black line | GND |
| MBED | LED |
|---|---|
| p17 | RED |
| p19 | GREEN |

Control the servo via Websock and Bluetooth
#include "mbed.h"
#include "EthernetInterface.h"
#include "Websocket.h"
#include "Servo.h"
#include "rtos.h"
Servo myservo(p21);
Serial pc(USBTX, USBRX);
Serial Blue(p13,p14);
DigitalOut myled(LED1);
DigitalOut myled4(LED4);
DigitalOut close(p17);
DigitalOut open(p19);
float position = 0;
void bluetooth(void const *args)
{
while (1){
if (Blue.getc()=='!') {
if (Blue.getc()=='B') { //button data
char bnum = Blue.getc(); //button number
if (bnum == '1') {
position = 1;
}else
if (bnum == '2'){
position = 0;
}
}
}
}
}
int main() {
Thread thread1(bluetooth);
char recv[30];
EthernetInterface eth;
eth.init(); //Use DHCP
eth.connect();
printf("IP Address is %s\n\r", eth.getIPAddress());
Websocket ws("ws://192.168.43.154:8888/ws");
ws.connect();
ws.send(new char('0'));
while (1) {
if (ws.read(recv)) {
sscanf(recv,"%f",&position);
}
if (myservo != position){
ws.send(new char(position + '0'));
}
myservo = position;
open = (position > 0);
close = (position == 0);
}
}
The servo is run by NodeJS with ws module package with can be installed by the command
npm install ws
<</code>
The server is at port 8888 for this code
<<code title=NodeJS servo to control send data between the Web and mbed>>
var WebSocketServer = require('ws').Server
, wss = new WebSocketServer({port: 8888});
wss.on('connection', function(ws) {
console.log(wss.clients.length);
ws.on('message', function(message) {
console.log(wss.clients.length, message);
wss.clients.forEach(function each(client) {
if (client !== ws) client.send(message);
});
});
ws.send('Connected');
});
<</code>>
User use browser to control the lock to either lock or unlock
<<code title=Webpage to control the lock>>
<!doctype html>
<html>
<head>
<title>Wireless lock</title>
<meta charset="utf-8" />
<style type="text/css">
body {
text-align: center;
min-width: 500px;
}
</style>
<script src="http://code.jquery.com/jquery.min.js"></script>
<script>
// log function
$(document).ready(function () {
var ws = new WebSocket("ws://localhost:8888/ws");
// Handle incoming websocket message callback
ws.onmessage = function(evt) {
if (evt.data == '1'){
$("#status").text('Locked');
} else {
$("#status").text('Unlocked');
}
};
// Close Websocket callback
ws.onclose = function(evt) {
log("***Connection Closed***");
alert("Connection close");
$("body").css("background", "#ff0000");
$("body").css("background", "#ff0000");
$("body").css("background", "#ff0000");
$("div#message_details").empty();
};
// Open Websocket callback
ws.onopen = function(evt) {
$("body").css("background", "#00ff00");
$("body").css("background", "#00ff00");
$("body").css("background", "#00ff00");
};
// Send websocket message function
$("button").click(function(evt) {
ws.send(evt.target.value);
});
});
</script>
</head>
<body>
<h1>Wireless lock</h1>
<button type="button" value="1">Lock</button>
<button type="button" value="0">Unlock</button>
<div id="status"></div>
</body>
</html>
Please log in to post comments.
