work
This commit is contained in:
parent
990fa8ff34
commit
3913d0d2f7
@ -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 };
|
||||||
|
@ -15,8 +15,8 @@ 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')),
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
sequelize.authenticate().then(() => {
|
sequelize.authenticate().then(() => {
|
||||||
@ -26,3 +26,4 @@ sequelize.authenticate().then(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
module.exports = { sequelize };
|
module.exports = { sequelize };
|
||||||
|
|
||||||
|
@ -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);
|
30
Web-Server/functions/Database.js
Normal file
30
Web-Server/functions/Database.js
Normal 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 };
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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 }
|
|
@ -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 };
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
@ -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
63
package-lock.json
generated
@ -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",
|
||||||
|
@ -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",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user