work
This commit is contained in:
parent
990fa8ff34
commit
3913d0d2f7
@ -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 };
|
||||
|
@ -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 };
|
||||
|
||||
|
@ -30,5 +30,5 @@ client.on("error", (err) => {
|
||||
});
|
||||
|
||||
//every 15 minutes
|
||||
//setInterval(publishData, 900000);
|
||||
setInterval(publishData, 600);
|
||||
setInterval(publishData, 900000);
|
||||
//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 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;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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 }
|
@ -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 };
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
);
|
||||
|
||||
|
@ -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
63
package-lock.json
generated
@ -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",
|
||||
|
@ -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",
|
||||
|
Loading…
x
Reference in New Issue
Block a user