feat: add working client-side example

This commit is contained in:
2018-01-11 20:03:26 -07:00
parent 60c6fb1fdf
commit 06ffb32e0f
4 changed files with 50 additions and 31 deletions

BIN
src/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -5,6 +5,26 @@
</head> </head>
<body> <body>
<h1>MQTT Demo with Mosca</h1> <h1>MQTT Demo with Mosca</h1>
<script src="/client.js"></script> <script src="/mqtt.js"></script>
<script>
/* eslint no-console: 0 */
/* eslint-env browser */
/* global mqtt */
// see https://github.com/mcollina/mosca/wiki/MQTT-over-Websockets
const client = mqtt.connect();
client.subscribe('mqtt/demo');
client.on('message', (topic, payload) => {
console.log([topic, payload].join(': '));
// client.end();
});
client.publish('mqtt/demo', `hello world! ${new Date().getTime()}`, {
retain: true,
});
</script>
</body> </body>
</html> </html>

View File

@@ -2,22 +2,23 @@ import mosca from 'mosca';
// source: https://github.com/mcollina/mosca/wiki/Mosca-basic-usage // source: https://github.com/mcollina/mosca/wiki/Mosca-basic-usage
export default function createMQTTServer(port = 1883) { export default function createMQTTServer(port) {
const moscaSettings = { const moscaSettings = {
port,
persistence: { persistence: {
factory: mosca.persistence.LevelUp, factory: mosca.persistence.LevelUp,
path: 'db', path: 'db',
}, },
}; };
if (port) moscaSettings.port = port;
const server = new mosca.Server(moscaSettings); const server = new mosca.Server(moscaSettings);
const setup = () => { const setup = () => {
console.log('Mosca server is up and running on port:', moscaSettings.port); console.log('Mosca server is up and running on port:', moscaSettings.port);
const message = { const message = {
topic: '/hello/world', topic: 'hello/world',
payload: 'abdce', // or a Buffer payload: 'abdce', // or a Buffer
qos: 0, // 0, 1, or 2 qos: 0, // 0, 1, or 2
retain: true, // retain message for future subscribers retain: true, // retain message for future subscribers
@@ -33,12 +34,7 @@ export default function createMQTTServer(port = 1883) {
// fired when a message is published // fired when a message is published
server.on('published', packet => { server.on('published', packet => {
console.log( console.log('MQTT:', packet.retain ? '(persisted)' : '', [packet.topic, packet.payload].join(': '));
'published event',
packet.retain ? '(persisted)' : '',
packet.topic,
packet.payload
);
}); });
return server; return server;

View File

@@ -4,7 +4,6 @@ import path from 'path';
import createMQTT from './mqtt.mjs'; import createMQTT from './mqtt.mjs';
const serverPort = process.env.PORT || 8080; const serverPort = process.env.PORT || 8080;
const mqttPort = 1883;
const sendError = (err, res) => { const sendError = (err, res) => {
console.error(err); console.error(err);
@@ -12,33 +11,36 @@ const sendError = (err, res) => {
res.end('oh no!'); res.end('oh no!');
}; };
http const sendFile = (filepath, res, contentType = 'text/plain') => {
fs.readFile(filepath, (err, content) => {
if (err) {
sendError(err, res);
return;
}
res.writeHead(200, { 'Content-Type': contentType });
res.end(content);
});
};
const webServer = http
.createServer((req, res) => { .createServer((req, res) => {
console.log(req.method, req.url);
switch (req.url) { switch (req.url) {
case '/': { case '/': {
fs.readFile(path.resolve(__dirname, 'index.html'), (err, content) => { sendFile(path.resolve(__dirname, 'index.html'), res, 'text/html');
if (err) {
sendError(err, res);
return;
}
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end(content);
});
break; break;
} }
case '/client.js': { case '/mqtt.js': {
const clientPath = path.join(path.dirname(require.resolve('mosca')), 'public', 'mqtt.js'); const clientPath = path.join(path.dirname(require.resolve('mosca')), 'public', 'mqtt.js');
fs.readFile(clientPath, (err, content) => { sendFile(clientPath, res, 'text/javascript');
if (err) { break;
sendError(err, res); }
return;
}
res.writeHead(200, { 'Content-Type': 'text/javascript' }); case '/favicon.ico': {
res.end(content); sendFile(path.resolve(__dirname, 'favicon.ico'), res, 'image/x-icon');
});
break; break;
} }
@@ -51,5 +53,6 @@ http
.listen(serverPort) .listen(serverPort)
.on('listening', () => { .on('listening', () => {
console.log('Webserver listening on port:', serverPort); console.log('Webserver listening on port:', serverPort);
createMQTT(mqttPort); const mqttServer = createMQTT();
mqttServer.attachHttpServer(webServer);
}); });