Write some glue code to insert the measurement info into the database
....but it's untested.
This commit is contained in:
parent
855cbc0c1b
commit
121cfc2418
6 changed files with 57 additions and 7 deletions
|
@ -1,7 +1,7 @@
|
|||
"use strict";
|
||||
|
||||
import util from 'util';
|
||||
import crypto from './Objects/FlyingBanana';
|
||||
import crypto from 'crypto';
|
||||
|
||||
export default {
|
||||
randomBytes: util.promisify(crypto.randomBytes)
|
||||
|
|
|
@ -21,6 +21,27 @@ class GatewayRepo {
|
|||
this.insert_query.run(gateway);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether a gateway exists in the dayabase with the given name.
|
||||
* @param {string} id The id of the gateway.
|
||||
* @return {bool} Whether a gateway with the given name exists in the database.
|
||||
*/
|
||||
exists(id) {
|
||||
// Note that normally a count wouldn't be appropriate here just to test for existence, but it's ok because it's guaranteed that there will only ever be a single entry with a given id.
|
||||
let statement = this.db.prepare(`SELECT COUNT(id) AS count
|
||||
FROM gateways
|
||||
WHERE id = :id`);
|
||||
|
||||
let count = statement.get({ id }).count;
|
||||
|
||||
return count > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterates over all the gateways in the table.
|
||||
* TODO: Use Symbol.iterator here?
|
||||
* @return {Generator} A generator that can be used with for..of
|
||||
*/
|
||||
iterate() {
|
||||
return this.db.prepare(`SELECT * FROM gateways`).iterate();
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ class RSSIRepo {
|
|||
channel
|
||||
) VALUES (
|
||||
:id,
|
||||
:reading_id, :gateway_id
|
||||
:reading_id, :gateway_id,
|
||||
:rssi, :snr,
|
||||
:channel
|
||||
)`);
|
||||
|
|
|
@ -19,8 +19,13 @@ class ReadingRepo {
|
|||
:data_rate, :code_rate
|
||||
)`);
|
||||
|
||||
this.insert_query.run(reading);
|
||||
let new_id = this.insert_query.run(reading).lastInsertRowid;
|
||||
|
||||
// Attach the new id to the rssi objects
|
||||
for(let rssi of reading.rssis)
|
||||
rssi.reading_id = new_id;
|
||||
|
||||
// Insert the RSSIs into the database
|
||||
this.RSSIRepo.add(...reading.rssis);
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ CREATE TABLE readings IF NOT EXISTS (
|
|||
CREATE TABLE rssis IF NOT EXISTS (
|
||||
id INTEGER PRIMARY KEY, -- Random unique int
|
||||
reading_id INTEGER, -- The id of the object in the readings table that this rssi measurement belongs to
|
||||
gateway_id INTEGER, -- Gateway id that the RSSI was from
|
||||
gateway_id TEXT, -- Gateway id that the RSSI was from
|
||||
rssi FLOAT, -- The RSSI value itself
|
||||
snr FLOAT, -- The signal-to-noise ratio
|
||||
channel INTEGER -- The channel that the RSSI was received over. We might be able to use this to detect single-channel gateways
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
"use strict";
|
||||
|
||||
import { decode_payload } from './DecodePayload.mjs';
|
||||
import { get_id_number } from '../Helpers/IdGenerator.mjs';
|
||||
|
||||
class MessageHandler {
|
||||
constructor({ ReadingRepo, RSSIRepo, GatewayRepo }) {
|
||||
constructor({ ReadingRepo, GatewayRepo }) {
|
||||
this.repo_reading = ReadingRepo;
|
||||
this.repo_rssi = RSSIRepo;
|
||||
this.repo_gateway = GatewayRepo;
|
||||
}
|
||||
|
||||
|
@ -15,13 +15,37 @@ class MessageHandler {
|
|||
let decoded_payload = decode_payload(message.payload_raw);
|
||||
console.log(decoded_payload);
|
||||
|
||||
let rssis = [];
|
||||
for(let gw in message.metadata.gateways) {
|
||||
// Insert the gateway info into the database if it doesn't exist already
|
||||
if(!this.repo_gateway.exists(gw.gtw_id)) {
|
||||
this.repo_gateway.add({
|
||||
id: gw.gtw_id,
|
||||
latitude: gw.latitude, longitude: gw.longitude,
|
||||
altitude: gw.altitude
|
||||
});
|
||||
}
|
||||
|
||||
// Generate an RSSI object
|
||||
rssis.push({
|
||||
id: get_id_number,
|
||||
gateway_id: this.repo_gateway,
|
||||
rssi: gw.rssi,
|
||||
snr: gw.snr,
|
||||
channel: gw.channel
|
||||
});
|
||||
}
|
||||
|
||||
// Add the reading and the associated RSSIs to the database
|
||||
this.repo_reading.add({
|
||||
id: decoded_payload.id,
|
||||
latitude: decoded_payload.latitude,
|
||||
longitude: decoded_payload.longitude,
|
||||
|
||||
data_rate: message.metadata.data_rate,
|
||||
code_rate: message.metadata.coding_rate
|
||||
code_rate: message.metadata.coding_rate,
|
||||
|
||||
rssis
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue