Implement the ttn client connection, but it throws a syntax error.

This commit is contained in:
Starbeamrainbowlabs 2019-07-04 17:18:38 +01:00
parent 4cff3cea91
commit e3a667cb69
8 changed files with 181 additions and 29 deletions

14
build
View file

@ -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";
} }

View file

@ -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", {

View file

@ -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",

View file

@ -20,9 +20,12 @@
"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"
} }
} }

View file

@ -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)

View 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 };

View 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;

View file

@ -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);
} }
} }