From 3913d0d2f7f5a63400606c7add09eaa66461c4c9 Mon Sep 17 00:00:00 2001 From: newtbot Date: Fri, 29 Dec 2023 02:21:28 +0800 Subject: [PATCH] work --- Database/model/IoTModel.js | 7 ++- Database/mySQL.js | 5 +- IoT-sensor/index.js | 4 +- Web-Server/functions/Database.js | 30 +++++++++ Web-Server/index.js | 42 +++++++++++-- Web-Server/middleware/ApiLogger.js | 49 +++++++++------ Web-Server/modules/express.js | 8 ++- Web-Server/modules/mqtt.js | 28 +-------- Web-Server/routes/latest-Data.js | 5 +- package-lock.json | 63 ------------------- package.json | 1 - .../adminusers_adminusers.sql | 0 .../adminusers_iot-data.sql | 0 .../adminusers_user_logs.sql | 0 .../adminusers_users.sql | 0 15 files changed, 118 insertions(+), 124 deletions(-) create mode 100644 Web-Server/functions/Database.js rename adminusers_adminusers.sql => schema/adminusers_adminusers.sql (100%) rename adminusers_iot-data.sql => schema/adminusers_iot-data.sql (100%) rename adminusers_user_logs.sql => schema/adminusers_user_logs.sql (100%) rename adminusers_users.sql => schema/adminusers_users.sql (100%) diff --git a/Database/model/IoTModel.js b/Database/model/IoTModel.js index 78cf731..de44000 100644 --- a/Database/model/IoTModel.js +++ b/Database/model/IoTModel.js @@ -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 }; diff --git a/Database/mySQL.js b/Database/mySQL.js index 9b3b370..d7e9f00 100644 --- a/Database/mySQL.js +++ b/Database/mySQL.js @@ -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 }; + diff --git a/IoT-sensor/index.js b/IoT-sensor/index.js index d5d0dd9..04e153e 100644 --- a/IoT-sensor/index.js +++ b/IoT-sensor/index.js @@ -30,5 +30,5 @@ client.on("error", (err) => { }); //every 15 minutes -//setInterval(publishData, 900000); -setInterval(publishData, 600); \ No newline at end of file +setInterval(publishData, 900000); +//setInterval(publishData, 600); \ No newline at end of file diff --git a/Web-Server/functions/Database.js b/Web-Server/functions/Database.js new file mode 100644 index 0000000..90b46a0 --- /dev/null +++ b/Web-Server/functions/Database.js @@ -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 }; + + + + + diff --git a/Web-Server/index.js b/Web-Server/index.js index dc14c47..247f240 100644 --- a/Web-Server/index.js +++ b/Web-Server/index.js @@ -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; + } + ); + + + + diff --git a/Web-Server/middleware/ApiLogger.js b/Web-Server/middleware/ApiLogger.js index e0211be..76fa927 100644 --- a/Web-Server/middleware/ApiLogger.js +++ b/Web-Server/middleware/ApiLogger.js @@ -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 } \ No newline at end of file diff --git a/Web-Server/modules/express.js b/Web-Server/modules/express.js index 105bbf4..2a8d2cf 100644 --- a/Web-Server/modules/express.js +++ b/Web-Server/modules/express.js @@ -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 }; \ No newline at end of file +module.exports = { app }; + + diff --git a/Web-Server/modules/mqtt.js b/Web-Server/modules/mqtt.js index e479d38..5266d7c 100644 --- a/Web-Server/modules/mqtt.js +++ b/Web-Server/modules/mqtt.js @@ -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; -} -); diff --git a/Web-Server/routes/latest-Data.js b/Web-Server/routes/latest-Data.js index 980cd35..6195d31 100644 --- a/Web-Server/routes/latest-Data.js +++ b/Web-Server/routes/latest-Data.js @@ -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; } diff --git a/package-lock.json b/package-lock.json index 25d26c5..fab7ade 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index cda3981..3678c8c 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/adminusers_adminusers.sql b/schema/adminusers_adminusers.sql similarity index 100% rename from adminusers_adminusers.sql rename to schema/adminusers_adminusers.sql diff --git a/adminusers_iot-data.sql b/schema/adminusers_iot-data.sql similarity index 100% rename from adminusers_iot-data.sql rename to schema/adminusers_iot-data.sql diff --git a/adminusers_user_logs.sql b/schema/adminusers_user_logs.sql similarity index 100% rename from adminusers_user_logs.sql rename to schema/adminusers_user_logs.sql diff --git a/adminusers_users.sql b/schema/adminusers_users.sql similarity index 100% rename from adminusers_users.sql rename to schema/adminusers_users.sql