Implement the ttn client connection, but it throws a syntax error.
This commit is contained in:
parent
4cff3cea91
commit
e3a667cb69
8 changed files with 181 additions and 29 deletions
14
build
14
build
|
@ -36,6 +36,7 @@ if [[ "$#" -lt 1 ]]; then
|
||||||
echo -e "${CSECTION}Available actions${RS}";
|
echo -e "${CSECTION}Available actions${RS}";
|
||||||
echo -e " ${CACTION}setup${RS} - Perform initial setup";
|
echo -e " ${CACTION}setup${RS} - Perform initial setup";
|
||||||
echo -e " ${CACTION}render${RS} - Render the report";
|
echo -e " ${CACTION}render${RS} - Render the report";
|
||||||
|
echo -e " ${CACTION}server${RS} - Execute the Node.js server.";
|
||||||
echo -e "";
|
echo -e "";
|
||||||
|
|
||||||
exit 1;
|
exit 1;
|
||||||
|
@ -96,9 +97,22 @@ task_setup() {
|
||||||
cd -;
|
cd -;
|
||||||
task_end $?;
|
task_end $?;
|
||||||
|
|
||||||
|
task_begin "Installing server dependencies";
|
||||||
|
cd server;
|
||||||
|
npm install;
|
||||||
|
cd ..;
|
||||||
|
exit_code="${?}";
|
||||||
|
task_end ${exit_code};
|
||||||
|
|
||||||
stage_end 0;
|
stage_end 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
task_server() {
|
||||||
|
execute node --experimental-modules ./server/index.mjs $@;
|
||||||
|
}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
task_render() {
|
task_render() {
|
||||||
_render-latex-pdf "Reports/Initial-Report/Initial-Report.tex";
|
_render-latex-pdf "Reports/Initial-Report/Initial-Report.tex";
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import a from 'awilix';
|
||||||
import Ansi from '../Helpers/Ansi.mjs';
|
import Ansi from '../Helpers/Ansi.mjs';
|
||||||
import Log from '../Helpers/Log.mjs';
|
import Log from '../Helpers/Log.mjs';
|
||||||
import TTNAppServer from '../ttn-app-server/TTNAppServer.mjs';
|
import TTNAppServer from '../ttn-app-server/TTNAppServer.mjs';
|
||||||
|
import MessageHandler from '../ttn-app-server/MessageHandler.mjs';
|
||||||
|
|
||||||
import settings from './settings.mjs';
|
import settings from './settings.mjs';
|
||||||
import database_init from '../bootstrap/database_init.mjs';
|
import database_init from '../bootstrap/database_init.mjs';
|
||||||
|
@ -19,6 +20,7 @@ c.register({
|
||||||
log: a.asClass(Log).singleton(),
|
log: a.asClass(Log).singleton(),
|
||||||
database: a.asFunction(database_init).singleton(),
|
database: a.asFunction(database_init).singleton(),
|
||||||
TTNAppServer: a.asClass(TTNAppServer),
|
TTNAppServer: a.asClass(TTNAppServer),
|
||||||
|
MessageHandler: a.asClass(MessageHandler)
|
||||||
});
|
});
|
||||||
|
|
||||||
c.loadModules("../Repos.SQLite/*.mjs", {
|
c.loadModules("../Repos.SQLite/*.mjs", {
|
||||||
|
|
62
server/package-lock.json
generated
62
server/package-lock.json
generated
|
@ -13,6 +13,7 @@
|
||||||
"version": "5.4.0",
|
"version": "5.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-5.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-5.4.0.tgz",
|
||||||
"integrity": "sha512-nzm7lJ7l3jBmGUbtkL8cdOMhPkN6Pw2IM+b0V7iIKba+YKiLrjkIy7vVLsBIVnd7+lgzBzrHsXZxCaFTcmw5Ow==",
|
"integrity": "sha512-nzm7lJ7l3jBmGUbtkL8cdOMhPkN6Pw2IM+b0V7iIKba+YKiLrjkIy7vVLsBIVnd7+lgzBzrHsXZxCaFTcmw5Ow==",
|
||||||
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/integer": "*"
|
"@types/integer": "*"
|
||||||
}
|
}
|
||||||
|
@ -20,7 +21,8 @@
|
||||||
"@types/integer": {
|
"@types/integer": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/integer/-/integer-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/integer/-/integer-1.0.0.tgz",
|
||||||
"integrity": "sha512-3viiRKLoSP2Qr78nMoQjkDc0fan4BgmpOyV1+1gKjE8wWXo3QQ78WItO6f9WuBf3qe3ymDYhM65oqHTOZ0rFxw=="
|
"integrity": "sha512-3viiRKLoSP2Qr78nMoQjkDc0fan4BgmpOyV1+1gKjE8wWXo3QQ78WItO6f9WuBf3qe3ymDYhM65oqHTOZ0rFxw==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"abbrev": {
|
"abbrev": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
|
@ -1091,6 +1093,54 @@
|
||||||
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
|
||||||
"integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw="
|
"integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw="
|
||||||
},
|
},
|
||||||
|
"manuh": {
|
||||||
|
"version": "1.4.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/manuh/-/manuh-1.4.3.tgz",
|
||||||
|
"integrity": "sha512-reSOx1qBvH23C7mtpkDw6afXPq4jIVnsWxR/3RGTLnMKNKMxNiznQir/U1FrY3SbPpPV10oP2VLqYZ6zN1relA==",
|
||||||
|
"requires": {
|
||||||
|
"debug": "^3.1.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"debug": {
|
||||||
|
"version": "3.2.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
||||||
|
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
||||||
|
"requires": {
|
||||||
|
"ms": "^2.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"manuh-bridge": {
|
||||||
|
"version": "0.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/manuh-bridge/-/manuh-bridge-0.0.2.tgz",
|
||||||
|
"integrity": "sha512-KGZnNYWVXV7SPZlnP7Zo0df80kUhhgJdsgtMazPbSoEx7j8FK6HPcyoM0QNomeftBNkbcB+5Z8c4XQr2YajaSg==",
|
||||||
|
"requires": {
|
||||||
|
"debug": "^3.1.0",
|
||||||
|
"manuh": "^1.3.0",
|
||||||
|
"mqtt": "^2.18.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"debug": {
|
||||||
|
"version": "3.2.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
||||||
|
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
||||||
|
"requires": {
|
||||||
|
"ms": "^2.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"minimatch": {
|
"minimatch": {
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
||||||
|
@ -1468,6 +1518,16 @@
|
||||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
||||||
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
|
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
|
||||||
},
|
},
|
||||||
|
"simple-mqtt-client": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/simple-mqtt-client/-/simple-mqtt-client-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-46CbCaOD4+rfz+IbNlpnYyI3ZIhkDbw7o9/wWGGg3uhqv+RwxxziVNuqiUN1GUIU/EWed9jP2c3C852DSxxjVQ==",
|
||||||
|
"requires": {
|
||||||
|
"manuh": "^1.4.3",
|
||||||
|
"manuh-bridge": "^0.0.2",
|
||||||
|
"mqtt": "^2.18.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"source-map": {
|
"source-map": {
|
||||||
"version": "0.5.7",
|
"version": "0.5.7",
|
||||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
||||||
|
|
|
@ -1,28 +1,31 @@
|
||||||
{
|
{
|
||||||
"name": "lorawan-signal-mapping",
|
"name": "lorawan-signal-mapping",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"description": "A LoRaWAN signal mapping system. Comprised of several distinct parts.",
|
"description": "A LoRaWAN signal mapping system. Comprised of several distinct parts.",
|
||||||
"main": "index.mjs",
|
"main": "index.mjs",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.starbeamrainbowlabs.com/sbrl/Msc-Summer-Project/"
|
"url": "https://git.starbeamrainbowlabs.com/sbrl/Msc-Summer-Project/"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"lora",
|
"lora",
|
||||||
"ttn",
|
"ttn",
|
||||||
"arduino",
|
"arduino",
|
||||||
"mapping"
|
"mapping"
|
||||||
],
|
],
|
||||||
"author": "Starbeamrainbowlabs",
|
"author": "Starbeamrainbowlabs",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@iarna/toml": "^2.2.3",
|
"@iarna/toml": "^2.2.3",
|
||||||
"@types/better-sqlite3": "^5.4.0",
|
"awilix": "^4.2.2",
|
||||||
"awilix": "^4.2.2",
|
"better-sqlite3": "^5.4.0",
|
||||||
"better-sqlite3": "^5.4.0",
|
"simple-mqtt-client": "^1.0.1",
|
||||||
"ttn": "^2.3.2"
|
"ttn": "^2.3.2"
|
||||||
}
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/better-sqlite3": "^5.4.0"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ program_name = "LoRaWAN Signal Mapper"
|
||||||
version = "v0.1"
|
version = "v0.1"
|
||||||
description = "assists in mapping LoRaWAN signal coverage"
|
description = "assists in mapping LoRaWAN signal coverage"
|
||||||
|
|
||||||
|
|
||||||
[database]
|
[database]
|
||||||
### Database settings ###
|
### Database settings ###
|
||||||
|
|
||||||
|
@ -16,6 +17,29 @@ filename = "lorawan.sqlite"
|
||||||
[database.options]
|
[database.options]
|
||||||
|
|
||||||
|
|
||||||
|
[ttn]
|
||||||
|
### The Things Network settings ###
|
||||||
|
|
||||||
|
# The host to connect to via MQTT.
|
||||||
|
# See https://www.thethingsnetwork.org/docs/applications/mqtt/api.html
|
||||||
|
# and also "Application Overview -> Handler"
|
||||||
|
host = "eu.thethings.network"
|
||||||
|
# The port number to connect on.
|
||||||
|
port = 8883
|
||||||
|
# Whether to use TLS or not.
|
||||||
|
tls = true
|
||||||
|
|
||||||
|
# The id of The Things Network application to connect with.
|
||||||
|
# Basically your application's name. Get this from the things network
|
||||||
|
# console - e.g. "lorawan-signal-mapping".
|
||||||
|
app_id = "CHANGE_THIS"
|
||||||
|
# The access key to connect to The Things Network with.
|
||||||
|
# Get this from the TTN console too. Click on your application, scroll to the
|
||||||
|
# "access keys" section at the bottom of the page, and copy the value you see
|
||||||
|
# there.
|
||||||
|
access_key = "CHANGE_THIS"
|
||||||
|
|
||||||
|
|
||||||
[logging]
|
[logging]
|
||||||
# The format the date displayed when logging things should take.
|
# The format the date displayed when logging things should take.
|
||||||
# Allowed values: relative (e.g like when a Linux machine boots), absolute (e.g. like Nginx server logs)
|
# Allowed values: relative (e.g like when a Linux machine boots), absolute (e.g. like Nginx server logs)
|
||||||
|
|
17
server/ttn-app-server/DecodePayload.mjs
Normal file
17
server/ttn-app-server/DecodePayload.mjs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const offset_id = 0;
|
||||||
|
const offset_lat = 32 / 8;
|
||||||
|
const offset_lng = (32 / 8) + (32 / 8);
|
||||||
|
|
||||||
|
function decode_payload(payload_base64) {
|
||||||
|
let payload_buffer = Buffer.from(payload_base64, "base64");
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: payload_buffer.readUInt32LE(offset_id),
|
||||||
|
latitude: patload_buffer.readFloatLE(offset_lat),
|
||||||
|
longitude: patload_buffer.readFloatLE(offset_lng)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export { decode_payload };
|
15
server/ttn-app-server/MessageHandler.mjs
Normal file
15
server/ttn-app-server/MessageHandler.mjs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
import { decode_payload } from './DecodePayload.mjs';
|
||||||
|
|
||||||
|
class MessageHandler {
|
||||||
|
constructor() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async handle(device_id, payload) {
|
||||||
|
console.log(arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default MessageHandler;
|
|
@ -1,15 +1,32 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
import { data as ttn_data } from 'ttn';
|
||||||
|
|
||||||
class TTNAppServer {
|
class TTNAppServer {
|
||||||
// Destructure the awilix container
|
// Destructure the awilix container
|
||||||
constructor({ settings, ansi }) {
|
constructor({ settings, ansi, message_handler }) {
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
/** @type {Ansi} */
|
/** @type {Ansi} */
|
||||||
this.a = ansi;
|
this.a = ansi;
|
||||||
|
/** @type {MessageHandler} */
|
||||||
|
this.message_handler = message_handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
run() {
|
async start() {
|
||||||
|
if(this.settings.ttn.app_id == "CHANGE_THIS" || this.settings.ttn.access_key == "CHANGE_THIS") {
|
||||||
|
console.error(`${this.a.fred}${this.a.hicol}Error: No TTN app id specified. Try filling in the required values in settings.toml. If they don't exist yet, try using server/settings.default.toml as a reference.${this.a.reset}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this.ttn_client = await ttn_data(
|
||||||
|
this.settings.ttn.app_id,
|
||||||
|
this.settings.ttn.access_key
|
||||||
|
);
|
||||||
|
|
||||||
|
this.ttn_client.on("uplink", this.handle_message.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
async handle_message(device_id, payload) {
|
||||||
|
await this.message_handler.handle(device_id, payload);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue