-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
111 lines (82 loc) · 2.78 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* Copyright (C) CampusIoT, - All Rights Reserved
* Written by CampusIoT Dev Team, 2016-2018
* Authors: Didier Donsez, Vivien Quéma
*/
/*
* bridge between the Sigfox backend and MQTT subscribers
*/
// Retrieve the settings
var SETTINGS = require('./settings.json');
const ID = SETTINGS.id;
const NAME = SETTINGS.name;
const ENV = SETTINGS.env;
const DEBUG = SETTINGS.loglevel.debug;
const INFO = SETTINGS.loglevel.info;
const ERROR = SETTINGS.loglevel.error;
var PORT = SETTINGS.http.port;
var PATH = SETTINGS.http.path;
var MQTT_BROKER_URL = SETTINGS.mqtt.url;
var MQTT_OPTIONS = SETTINGS.mqtt.options;
var MQTT_TOPIC = SETTINGS.mqtt.topic;
/*
TODOLIST
Certificat per user
MQTT failover
Support POST with application/json
*/
var auth = require('http-auth');
var basic = auth.basic({
realm: SETTINGS.http.realm,
file: SETTINGS.http.passwordfile
});
basic.on('success', (result, req) => {
console.log(`User authenticated: user=${result.user} ip=${req.ip} hostname=${req.hostname}`);
});
basic.on('fail', (result, req) => {
console.log(`User authentication failed : user=${result.user} ip=${req.ip} hostname=${req.hostname}`);
});
basic.on('error', (error, req) => {
console.log(`Authentication error: ${error.code + " - " + error.message}`);
});
var express = require('express');
var app = express();
app.use(auth.connect(basic));
var mqtt = require('mqtt');
var client = mqtt.connect(MQTT_BROKER_URL, MQTT_OPTIONS);
var mqttConnected = false;
client.on('connect', function () {
mqttConnected = true;
console.log('Sigfox callback server : MQTT connected to ',MQTT_BROKER_URL);
});
client.on('reconnect', function () {
mqttConnected = true;
console.log('Sigfox callback server : MQTT reconnected to ',MQTT_BROKER_URL);
});
client.on('offline', function () {
mqttConnected = false;
console.log('Sigfox callback server : MQTT offline ');
});
client.on('close', function () {
mqttConnected = false;
console.log('Sigfox callback server : MQTT closed');
});
client.on('error', function (error) {
mqttConnected = false;
console.log('Sigfox callback server : MQTT Error ',error);
});
function handler(req, res) {
console.log("Received GET ", JSON.stringify(req.query), "user="+req.user);
if(mqttConnected) {
client.publish(MQTT_TOPIC + "/" + req.user, JSON.stringify(req.query));
// published message looks like this : Received GET {"data":"1723","id":"1AEA29","time":"1481821861","snr":"19.06","station":"0FAD","avgSnr":"37.66","rssi":"-132.00","lat":"45.0","lng":"6.0","seqNumber":"4084","duplicate":"true"}
res.send('Callback received');
} else {
res.status(500).send('Could not delivered callback');
}
}
app.get(PATH, handler);
app.post(PATH, handler);
app.listen(PORT, function () {
console.log('Listening on port='+PORT, "path="+PATH);
});