feat: add working client-side example
This commit is contained in:
BIN
src/favicon.ico
Normal file
BIN
src/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
@@ -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>
|
||||||
|
|||||||
14
src/mqtt.mjs
14
src/mqtt.mjs
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user