This commit is contained in:
newtbot 2023-12-29 02:21:28 +08:00
parent 990fa8ff34
commit 3913d0d2f7
15 changed files with 118 additions and 124 deletions

View File

@ -1,12 +1,12 @@
"use strict"; "use strict";
const { Sequelize, DataTypes } = require("sequelize"); const { Sequelize, DataTypes } = require("sequelize");
const { sequelize } = require("../mySql.js"); const { sequelize } = require("../mySQL");
const IoTModel = sequelize.define("iot-data",{ const IoTModel = sequelize.define("iot-data",{
// Model attributes are defined here // Model attributes are defined here
id: { id: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
allowNull: false, allowNull: true,
primaryKey: true, primaryKey: true,
}, },
psiData: { psiData: {
@ -65,6 +65,7 @@ const IoTModel = sequelize.define("iot-data",{
}, },
updatedAt: { updatedAt: {
type: DataTypes.DATE, type: DataTypes.DATE,
//appointmentStart: { type: "DATETIME" } // Do this instead
allowNull: true, allowNull: true,
}, },
}, },
@ -73,4 +74,6 @@ const IoTModel = sequelize.define("iot-data",{
} }
); );
module.exports = { IoTModel }; module.exports = { IoTModel };

View File

@ -15,7 +15,7 @@ const sequelize = new Sequelize(
ssl: { ssl: {
ca: fs.readFileSync(path.resolve(__dirname, '../cert/DigiCertGlobalRootCA.crt.pem')), ca: fs.readFileSync(path.resolve(__dirname, '../cert/DigiCertGlobalRootCA.crt.pem')),
} }
} },
} }
); );
@ -26,3 +26,4 @@ sequelize.authenticate().then(() => {
}); });
module.exports = { sequelize }; module.exports = { sequelize };

View File

@ -30,5 +30,5 @@ client.on("error", (err) => {
}); });
//every 15 minutes //every 15 minutes
//setInterval(publishData, 900000); setInterval(publishData, 900000);
setInterval(publishData, 600); //setInterval(publishData, 600);

View File

@ -0,0 +1,30 @@
const { sequelize } = require("../../Database/mySql.js");
const { IoTModel } = require("../../Database/model/IoTModel.js");
async function insertData(data) {
console.log(data);
try {
const latestData = await IoTModel.create({
psiData: data.psi,
humidityData: data.humidity,
o3Data: data.o3,
no2Data: data.no2,
so2Data: data.so2,
coData: data.co,
temperatureData: data.temperature,
windspeedData: data.windspeed,
currentTime: data.time,
regionData: data.region,
});
}
catch (error) {
console.error(error);
}
}
module.exports = { insertData };

View File

@ -1,17 +1,49 @@
const { app } = require("./modules/express.js"); const { app } = require("./modules/express.js");
const client = require("./modules/mqtt"); const client = require("./modules/mqtt");
const { validateData } = require("./functions/validateData.js");
const { insertData } = require("./functions/Database.js");
/* /*
1) validate data from IoT sensor 1) validate data from IoT sensor
2) upload data to database 2) upload data to database
3) add more routes to api 3) add more routes to api
4) add swagger documentation 4) add swagger documentation
5) add middleware for authentication 5) add middleware for authentication
*/ */
// Event handlers
client.on('connect', () => {
console.log('Connected to MQTT broker');
client.subscribe('iot-data');
});
client.on('message', (topic, message) => {
//console.log(`Received message on topic ${topic}: ${message}`);
let data = JSON.parse(message);
if (validateData(data)) {
//upload to db logic here
insertData(data);
}
else {
console.log("Data is invalid");
throw new Error("Data is invalid");
}
});
client.on('error', (err) => {
console.error('Error:', err);
client.end();
});
client.on('end', () => {
console.log('Disconnected from MQTT broker');
client.reconnect = true;
}
);

View File

@ -1,22 +1,35 @@
//middleware const { connect } = require("../routes/test");
/*
const myLogger = function (req, res, next) {
console.log('LOGGED')
next()
}
// Apply the middleware to a specific route
app.use('/special-route', myLogger));
*/
const APIlogger = (req, res, next) => { const APIlogger = (req, res, next) => {
/*
console.log("API request received");
console.log(req.ip);
console.log(req.path);
console.log(req.method);
console.log(res.statusCode);
console.log(req.headers['user-agent']);
console.log(req.secure);
console.log(req.protocol);
console.log(req.get('host'));
console.log(new Date());
*/
const log = {
method: req.method,
statusCode: res.statusCode,
protocol: req.protocol,
//formatted in nice utc format
time: new Date().toUTCString(),
ip: req.ip,
userAgent: req.headers["user-agent"],
host: `${req.protocol}://${req.get("host")}${req.originalUrl}`,
};
console.log(log);
//upload to db logic here for api logs
next();
};
module.exports = { APIlogger };
}
module.exports = { APIlogger }

View File

@ -4,6 +4,7 @@
*/ */
const express = require("express"); const express = require("express");
const helmet = require('helmet') const helmet = require('helmet')
const app = express(); const app = express();
app.use(helmet()) app.use(helmet())
const port = 80; const port = 80;
@ -11,10 +12,11 @@ const port = 80;
//disable x-powered-by header for security reasons //disable x-powered-by header for security reasons
app.disable('x-powered-by') app.disable('x-powered-by')
const { APIlogger } = require('../middleware/ApiLogger.js');
//middleware logic //middleware logic
//app.use('/api/v1', require('../middleware/ApiKey.js')); //app.use('/api/v1', require('../middleware/ApiKey.js'));
//app.use('/api/v1', require('../middleware/ApiLogger.js')); app.use('/api/', APIlogger );
//route logic //route logic
app.use('/api/', require('../routes/api_route.js')); app.use('/api/', require('../routes/api_route.js'));
@ -33,3 +35,5 @@ app.listen(port, () => {
}); });
module.exports = { app }; module.exports = { app };

View File

@ -17,32 +17,6 @@ const options = {
const client = mqtt.connect(brokerUrl, options); const client = mqtt.connect(brokerUrl, options);
module.exports = client;
// Event handlers
client.on('connect', () => {
console.log('Connected to MQTT broker');
client.subscribe('iot-data');
});
client.on('message', (topic, message) => {
//console.log(`Received message on topic ${topic}: ${message}`);
let data = JSON.parse(message);
if (validateData(data)) {
//upload to db logic here
}
else {
console.log("Data is invalid");
}
});
client.on('error', (err) => {
console.error('Error:', err);
client.end();
});
client.on('end', () => {
console.log('Disconnected from MQTT broker');
client.reconnect = true;
}
);

View File

@ -3,12 +3,13 @@ const { IoTModel } = require("../../Database/model/IoTModel.js");
const express = require('express'); const express = require('express');
const router = express.Router(); const router = express.Router();
// Logic for model and API // Logic for model and API by 1
async function getLatestData() { async function getLatestData() {
try { try {
sequelize.sync(); sequelize.sync();
const latestData = await IoTModel.findAll({ const latestData = await IoTModel.findAll({
order: [['createdAt', 'DESC']], limit: 1,
order: [['createdAt', 'DESC']]
}); });
return latestData; return latestData;
} }

63
package-lock.json generated
View File

@ -17,7 +17,6 @@
"express-session": "^1.17.3", "express-session": "^1.17.3",
"helmet": "^7.1.0", "helmet": "^7.1.0",
"mqtt": "^5.3.3", "mqtt": "^5.3.3",
"mysql": "^2.18.1",
"mysql2": "^3.6.5", "mysql2": "^3.6.5",
"nodemailer": "^6.9.7", "nodemailer": "^6.9.7",
"sequelize": "^6.35.2", "sequelize": "^6.35.2",
@ -235,14 +234,6 @@
"node": ">= 10.0.0" "node": ">= 10.0.0"
} }
}, },
"node_modules/bignumber.js": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
"integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==",
"engines": {
"node": "*"
}
},
"node_modules/bl": { "node_modules/bl": {
"version": "6.0.9", "version": "6.0.9",
"resolved": "https://registry.npmjs.org/bl/-/bl-6.0.9.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.9.tgz",
@ -501,11 +492,6 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
}, },
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"node_modules/debug": { "node_modules/debug": {
"version": "4.3.4", "version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@ -1217,11 +1203,6 @@
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
"integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
}, },
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
},
"node_modules/jake": { "node_modules/jake": {
"version": "10.8.7", "version": "10.8.7",
"resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
@ -1501,28 +1482,6 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}, },
"node_modules/mysql": {
"version": "2.18.1",
"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
"integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
"dependencies": {
"bignumber.js": "9.0.0",
"readable-stream": "2.3.7",
"safe-buffer": "5.1.2",
"sqlstring": "2.3.1"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mysql/node_modules/sqlstring": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
"integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mysql2": { "node_modules/mysql2": {
"version": "3.6.5", "version": "3.6.5",
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.5.tgz", "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.5.tgz",
@ -1791,28 +1750,6 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/readable-stream/node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/regenerator-runtime": { "node_modules/regenerator-runtime": {
"version": "0.14.1", "version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",

View File

@ -25,7 +25,6 @@
"express-session": "^1.17.3", "express-session": "^1.17.3",
"helmet": "^7.1.0", "helmet": "^7.1.0",
"mqtt": "^5.3.3", "mqtt": "^5.3.3",
"mysql": "^2.18.1",
"mysql2": "^3.6.5", "mysql2": "^3.6.5",
"nodemailer": "^6.9.7", "nodemailer": "^6.9.7",
"sequelize": "^6.35.2", "sequelize": "^6.35.2",