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

View File

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

View File

@ -30,5 +30,5 @@ client.on("error", (err) => {
});
//every 15 minutes
//setInterval(publishData, 900000);
setInterval(publishData, 600);
setInterval(publishData, 900000);
//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 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
2) upload data to database
3) add more routes to api
4) add swagger documentation
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 myLogger = function (req, res, next) {
console.log('LOGGED')
next()
}
// Apply the middleware to a specific route
app.use('/special-route', myLogger));
*/
const { connect } = require("../routes/test");
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 helmet = require('helmet')
const app = express();
app.use(helmet())
const port = 80;
@ -11,10 +12,11 @@ const port = 80;
//disable x-powered-by header for security reasons
app.disable('x-powered-by')
const { APIlogger } = require('../middleware/ApiLogger.js');
//middleware logic
//app.use('/api/v1', require('../middleware/ApiKey.js'));
//app.use('/api/v1', require('../middleware/ApiLogger.js'));
app.use('/api/', APIlogger );
//route logic
app.use('/api/', require('../routes/api_route.js'));
@ -32,4 +34,6 @@ app.listen(port, () => {
console.log(`app listening on port ${port}`);
});
module.exports = { app };
module.exports = { app };

View File

@ -17,32 +17,6 @@ const 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 router = express.Router();
// Logic for model and API
// Logic for model and API by 1
async function getLatestData() {
try {
sequelize.sync();
const latestData = await IoTModel.findAll({
order: [['createdAt', 'DESC']],
limit: 1,
order: [['createdAt', 'DESC']]
});
return latestData;
}

63
package-lock.json generated
View File

@ -17,7 +17,6 @@
"express-session": "^1.17.3",
"helmet": "^7.1.0",
"mqtt": "^5.3.3",
"mysql": "^2.18.1",
"mysql2": "^3.6.5",
"nodemailer": "^6.9.7",
"sequelize": "^6.35.2",
@ -235,14 +234,6 @@
"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": {
"version": "6.0.9",
"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",
"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": {
"version": "4.3.4",
"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",
"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": {
"version": "10.8.7",
"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",
"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": {
"version": "3.6.5",
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.5.tgz",
@ -1791,28 +1750,6 @@
"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": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",

View File

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