iot sensor finished
1)with validation on front and backend 2)fixed seed route generating value 0 for data
This commit is contained in:
@ -231,6 +231,7 @@ buildQuery = {
|
||||
queryString.month
|
||||
);
|
||||
} else {
|
||||
queryString.month = getMonthFromString(queryString.month)
|
||||
whereClause.month = sequelize.where(
|
||||
sequelize.fn("MONTH", sequelize.col("createdAt")),
|
||||
queryString.month
|
||||
|
@ -1,5 +1,6 @@
|
||||
const { sequelize } = require("../../Database/mySql.js");
|
||||
const { api_log_Model } = require("../../Database/model/apiLogModel.js");
|
||||
const { sensorDataModel } = require("../../Database/model/sensorDataModel.js");
|
||||
|
||||
async function insertLogData(log){
|
||||
try{
|
||||
@ -18,10 +19,23 @@ async function insertLogData(log){
|
||||
(error){
|
||||
console.error(error);
|
||||
}
|
||||
}
|
||||
|
||||
async function insertDatatoDB(data) {
|
||||
try {
|
||||
sensorDataModel.create({
|
||||
sensorid: data.sensorid,
|
||||
locationid: data.locationid,
|
||||
measurement: data.measurement,
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = { insertLogData };
|
||||
module.exports = { insertLogData , insertDatatoDB};
|
||||
|
||||
|
||||
|
||||
|
@ -1,31 +1,6 @@
|
||||
var validator = require("validator");
|
||||
|
||||
// Regular expressions for data validation
|
||||
const psiPattern = /^\d+$/;
|
||||
const humidityPattern = /^\d+%$/;
|
||||
const concentrationPattern = /^\d+ppm$/;
|
||||
const temperaturePattern = /^-?\d+°C$/;
|
||||
const windspeedPattern = /^\d+km\/h$/;
|
||||
const timePattern = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
|
||||
const regionPattern = /^[a-zA-Z-]+$/;
|
||||
|
||||
function validateData(data) {
|
||||
return (
|
||||
psiPattern.test(data.psi) &&
|
||||
humidityPattern.test(data.humidity) &&
|
||||
concentrationPattern.test(data.o3) &&
|
||||
concentrationPattern.test(data.no2) &&
|
||||
concentrationPattern.test(data.so2) &&
|
||||
concentrationPattern.test(data.co) &&
|
||||
temperaturePattern.test(data.temperature) &&
|
||||
windspeedPattern.test(data.windspeed) &&
|
||||
timePattern.test(data.time) &&
|
||||
regionPattern.test(data.region)
|
||||
);
|
||||
}
|
||||
|
||||
const dateRegex =
|
||||
/^[A-Za-z]{3}, \d{2} [A-Za-z]{3} \d{4} \d{2}:\d{2}:\d{2} GMT$/;
|
||||
const dateRegex = /^[A-Za-z]{3}, \d{2} [A-Za-z]{3} \d{4} \d{2}:\d{2}:\d{2} GMT$/;
|
||||
|
||||
function isValidDateString(value) {
|
||||
return dateRegex.test(value);
|
||||
@ -55,18 +30,22 @@ function isMacAddress(value) {
|
||||
function isJson(value) {
|
||||
//check if its object
|
||||
if(typeof value === "object"){
|
||||
console.log("its an object")
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
function isNumber(value) {
|
||||
if (typeof value === "number") {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
validateData,
|
||||
isValidDateString,
|
||||
isAlphaNumericwithSpaces,
|
||||
isAlphaNumericWithSpacesAndDash,
|
||||
isMacAddress,
|
||||
isJson,
|
||||
isNumber,
|
||||
};
|
||||
|
||||
|
@ -1,49 +1,66 @@
|
||||
const { app } = require("./modules/express.js");
|
||||
const client = require("./modules/mqtt");
|
||||
const { validateData } = require("./functions/validateData.js");
|
||||
const { insertData } = require("./functions/database.js");
|
||||
/*
|
||||
1) on data received, validate data
|
||||
2) websocket to another server
|
||||
|
||||
*/
|
||||
const client = require("./modules/mqtt");
|
||||
const { isJson, isNumber } = require("./functions/validateData.js");
|
||||
const { insertDatatoDB } = require("./functions/database.js");
|
||||
|
||||
// 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);
|
||||
|
||||
//websocket logic here??
|
||||
|
||||
}
|
||||
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;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
|
||||
client.on("connect", () => {
|
||||
console.log("Connected to MQTT broker");
|
||||
client.subscribe("iot-data");
|
||||
});
|
||||
|
||||
client.on("message", (topic, message) => {
|
||||
try {
|
||||
let datas = JSON.parse(message);
|
||||
if (isJson(datas)) {
|
||||
for (let key in datas) {
|
||||
let data = parseInt(
|
||||
datas[key].locationid +
|
||||
" " +
|
||||
datas[key].sensorid +
|
||||
" " +
|
||||
datas[key].measurement.psi +
|
||||
" " +
|
||||
datas[key].measurement.humidity +
|
||||
" " +
|
||||
datas[key].measurement.o3 +
|
||||
" " +
|
||||
datas[key].measurement.no2 +
|
||||
" " +
|
||||
datas[key].measurement.so2 +
|
||||
" " +
|
||||
datas[key].measurement.co +
|
||||
" " +
|
||||
datas[key].measurement.temperature +
|
||||
" " +
|
||||
datas[key].measurement.windspeed
|
||||
);
|
||||
if (isNumber(data)) {
|
||||
{
|
||||
//pass datas to database
|
||||
insertDatatoDB(datas[key]);
|
||||
|
||||
}
|
||||
} else {
|
||||
console.log("Invalid data");
|
||||
client.end();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.log("Invalid data");
|
||||
client.end();
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
});
|
||||
|
||||
client.on("error", (err) => {
|
||||
console.error("Error:", err);
|
||||
client.end();
|
||||
});
|
||||
|
||||
client.on("end", () => {
|
||||
console.log("Disconnected from MQTT broker");
|
||||
client.reconnect = true;
|
||||
});
|
||||
|
@ -15,6 +15,7 @@ const limiter = rateLimit({
|
||||
legacyHeaders: false, // Disable the `X-RateLimit-*` headers.
|
||||
})
|
||||
|
||||
|
||||
// Apply the rate limiting middleware to all requests.
|
||||
app.use(limiter)
|
||||
|
||||
|
@ -43,7 +43,6 @@ function firstDataRow(startDate, sensorId, locationId) {
|
||||
sensorid: sensorId,
|
||||
locationid: locationId,
|
||||
measurement: {
|
||||
//console.log(Math.floor(Math.random() * 30) + 5)
|
||||
psi: Math.floor(Math.random() * 30) + 5,
|
||||
humidity: Math.floor(Math.random() * (90 - 80 + 1) + 80),
|
||||
o3: Math.floor(Math.random() * (100 - 20 + 1) + 30),
|
||||
@ -77,17 +76,19 @@ function nextDataRow(currentRow, interval) {
|
||||
}
|
||||
|
||||
function numberWithinPercent(inputNumber) {
|
||||
//random percent with max of 1 and min of -1
|
||||
const percent = Math.random() * 1 - Math.random();
|
||||
|
||||
const range = inputNumber * percent;
|
||||
|
||||
const randomOffset = Math.random() * range;
|
||||
|
||||
const newNumber = inputNumber + randomOffset;
|
||||
|
||||
return Math.floor(newNumber);
|
||||
}
|
||||
// Define a reasonable range for the random offset
|
||||
const maxOffset = 5;
|
||||
const minOffset = -5;
|
||||
|
||||
// Add a random offset within the defined range
|
||||
const randomOffset = Math.random() * (maxOffset - minOffset) + minOffset;
|
||||
|
||||
// Calculate the new number with the offset
|
||||
const newNumber = inputNumber + randomOffset;
|
||||
|
||||
// Ensure the new number is within a reasonable range
|
||||
return Math.max(5, Math.min(100, Math.floor(newNumber)));
|
||||
}
|
||||
|
||||
//add seed
|
||||
router.post("/new", async (req, res, next) => {
|
||||
|
Reference in New Issue
Block a user