plausibility checks implemented
This commit is contained in:
parent
4eb249377f
commit
2083a5b3d6
119
lorahandler.go
119
lorahandler.go
|
|
@ -2,10 +2,10 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/base64"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"encoding/base64"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
|
@ -16,11 +16,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MyDB = "beieliscaledb"
|
MyDB = "beieliscaledb"
|
||||||
username = "beieli"
|
username = "beieli"
|
||||||
password = "beieli4president"
|
password = "beieli4president"
|
||||||
outputfile = "/home/beieli/lorahandler/lorahandler.log"
|
outputfile = "/home/beieli/lorahandler/lorahandler.log"
|
||||||
NOT_ATTACHED = -2147483648
|
NOT_PLAUSIBLE_16 = 65535
|
||||||
|
NOT_PLAUSIBLE_32 = 2147483647
|
||||||
)
|
)
|
||||||
|
|
||||||
type MetadataTTN struct {
|
type MetadataTTN struct {
|
||||||
|
|
@ -28,9 +29,9 @@ type MetadataTTN struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type MessageTTN struct {
|
type MessageTTN struct {
|
||||||
Hardware_serial string `json:"hardware_serial"`
|
Hardware_serial string `json:"hardware_serial"`
|
||||||
Metadata MetadataTTN `json:"metadata"`
|
Metadata MetadataTTN `json:"metadata"`
|
||||||
Payload_raw string `json:"payload_raw"`
|
Payload_raw string `json:"payload_raw"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type MessageProperties struct {
|
type MessageProperties struct {
|
||||||
|
|
@ -203,37 +204,37 @@ func DecodePayload(s string, deveui string, devaddr string, lrrlat float32, lrrl
|
||||||
// the second measurement as first..., the same for humidity, which is usually too low...
|
// the second measurement as first..., the same for humidity, which is usually too low...
|
||||||
t := pl_1.T
|
t := pl_1.T
|
||||||
t = t + int16(pl_1.TC1)
|
t = t + int16(pl_1.TC1)
|
||||||
if valid_measurements > 0 {
|
if valid_measurements > 0 {
|
||||||
WriteDatapoint(tfp, deveui, devaddr, pl_1.Vbat, pl_1.H1, pl_1.P1, pl_1.W1, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
WriteDatapoint(tfp, deveui, devaddr, pl_1.Vbat, pl_1.H1, pl_1.P1, pl_1.W1, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
//t = t + int16(pl_1.TC1)
|
//t = t + int16(pl_1.TC1)
|
||||||
if valid_measurements > 1 {
|
if valid_measurements > 1 {
|
||||||
WriteDatapoint(tfp+(step), deveui, devaddr, 0, pl_1.H2, pl_1.P2, pl_1.W2, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
WriteDatapoint(tfp+(step), deveui, devaddr, 0, pl_1.H2, pl_1.P2, pl_1.W2, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
t = t + int16(pl_1.TC2)
|
t = t + int16(pl_1.TC2)
|
||||||
if valid_measurements > 2 {
|
if valid_measurements > 2 {
|
||||||
WriteDatapoint(tfp+(2*step), deveui, devaddr, 0, pl_1.H3, pl_1.P3, pl_1.W3, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
WriteDatapoint(tfp+(2*step), deveui, devaddr, 0, pl_1.H3, pl_1.P3, pl_1.W3, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
t = t + int16(pl_1.TC3)
|
t = t + int16(pl_1.TC3)
|
||||||
if valid_measurements > 3 {
|
if valid_measurements > 3 {
|
||||||
WriteDatapoint(tfp+(3*step), deveui, devaddr, 0, pl_1.H4, pl_1.P4, pl_1.W4, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
WriteDatapoint(tfp+(3*step), deveui, devaddr, 0, pl_1.H4, pl_1.P4, pl_1.W4, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
t = t + int16(pl_1.TC4)
|
t = t + int16(pl_1.TC4)
|
||||||
if valid_measurements > 4 {
|
if valid_measurements > 4 {
|
||||||
WriteDatapoint(tfp+(4*step), deveui, devaddr, 0, pl_1.H5, pl_1.P5, pl_1.W5, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
WriteDatapoint(tfp+(4*step), deveui, devaddr, 0, pl_1.H5, pl_1.P5, pl_1.W5, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
t = t + int16(pl_1.TC5)
|
t = t + int16(pl_1.TC5)
|
||||||
if valid_measurements > 5 {
|
if valid_measurements > 5 {
|
||||||
WriteDatapoint(tfp+(5*step), deveui, devaddr, 0, pl_1.H6, pl_1.P6, pl_1.W6, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
WriteDatapoint(tfp+(5*step), deveui, devaddr, 0, pl_1.H6, pl_1.P6, pl_1.W6, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
t = t + int16(pl_1.TC6)
|
t = t + int16(pl_1.TC6)
|
||||||
if valid_measurements > 6 {
|
if valid_measurements > 6 {
|
||||||
WriteDatapoint(tfp+(6*step), deveui, devaddr, 0, pl_1.H7, pl_1.P7, pl_1.W7, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
WriteDatapoint(tfp+(6*step), deveui, devaddr, 0, pl_1.H7, pl_1.P7, pl_1.W7, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
t = t + int16(pl_1.TC7)
|
t = t + int16(pl_1.TC7)
|
||||||
if valid_measurements > 7 {
|
if valid_measurements > 7 {
|
||||||
WriteDatapoint(tfp+(7*step), deveui, devaddr, 0, pl_1.H8, pl_1.P8, pl_1.W8, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
WriteDatapoint(tfp+(7*step), deveui, devaddr, 0, pl_1.H8, pl_1.P8, pl_1.W8, 0, 0, t, lrrlat, lrrlon, 0, 0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if s[0:2] == "80" {
|
} else if s[0:2] == "80" {
|
||||||
fmt.Printf("{\n")
|
fmt.Printf("{\n")
|
||||||
|
|
@ -259,19 +260,7 @@ func DecodePayload(s string, deveui string, devaddr string, lrrlat float32, lrrl
|
||||||
var w uint16
|
var w uint16
|
||||||
w1_0_real := pl_128.W1_0
|
w1_0_real := pl_128.W1_0
|
||||||
w2_0_real := pl_128.W2_0
|
w2_0_real := pl_128.W2_0
|
||||||
multiply_by_2 := false
|
|
||||||
if pl_128.W1_0 == NOT_ATTACHED {
|
|
||||||
w1_0_real = pl_128.W1
|
|
||||||
multiply_by_2 = true
|
|
||||||
}
|
|
||||||
if pl_128.W2_0 == NOT_ATTACHED {
|
|
||||||
w2_0_real = pl_128.W2
|
|
||||||
multiply_by_2 = true
|
|
||||||
}
|
|
||||||
w32 = int32(((float64(pl_128.W1-w1_0_real) / float64(pl_128.W1_C)) + (float64(pl_128.W2-w2_0_real) / float64(pl_128.W2_C))) / 5.0)
|
w32 = int32(((float64(pl_128.W1-w1_0_real) / float64(pl_128.W1_C)) + (float64(pl_128.W2-w2_0_real) / float64(pl_128.W2_C))) / 5.0)
|
||||||
if multiply_by_2 {
|
|
||||||
w32 = w32 * 2
|
|
||||||
}
|
|
||||||
if w32 < 0 {
|
if w32 < 0 {
|
||||||
w = 0
|
w = 0
|
||||||
} else if w32 > 65535 {
|
} else if w32 > 65535 {
|
||||||
|
|
@ -325,6 +314,7 @@ func WriteDatapoint(mytime int64, deveui string, devaddr string, v uint8, h uint
|
||||||
// wir nehmen humidity als Referenz, wenn diese > 0 ist, dann ist es
|
// wir nehmen humidity als Referenz, wenn diese > 0 ist, dann ist es
|
||||||
// eine gueltige Messung
|
// eine gueltige Messung
|
||||||
var vp int16 // Voltage in %
|
var vp int16 // Voltage in %
|
||||||
|
var implausible bool
|
||||||
//fmt.Printf("WriteDatapoint: h: %d\n", h)
|
//fmt.Printf("WriteDatapoint: h: %d\n", h)
|
||||||
if h > 0 {
|
if h > 0 {
|
||||||
vp = int16(v) - 70
|
vp = int16(v) - 70
|
||||||
|
|
@ -346,7 +336,9 @@ func WriteDatapoint(mytime int64, deveui string, devaddr string, v uint8, h uint
|
||||||
}
|
}
|
||||||
s = fmt.Sprintf("measurement,deveui=%s devaddr=\"%s\",%sh=%di,p=%di,w=%di,t=%.1f,lrrlat=%f,lrrlon=%f%s %d\n", deveui, devaddr, sv, h, int32(p)+825, uint32(w)*5, float32(t)/10, lrrlat, lrrlon, sfw, mytime*60*1000*1000*1000)
|
s = fmt.Sprintf("measurement,deveui=%s devaddr=\"%s\",%sh=%di,p=%di,w=%di,t=%.1f,lrrlat=%f,lrrlon=%f%s %d\n", deveui, devaddr, sv, h, int32(p)+825, uint32(w)*5, float32(t)/10, lrrlat, lrrlon, sfw, mytime*60*1000*1000*1000)
|
||||||
|
|
||||||
WriteStringToFile(s, deveui)
|
implausible = (w1 == NOT_PLAUSIBLE_32) || (w2 == NOT_PLAUSIBLE_32) || (w == NOT_PLAUSIBLE_16)
|
||||||
|
|
||||||
|
WriteStringToFile(s, deveui, implausible)
|
||||||
|
|
||||||
w_gram := uint32(w) * 5
|
w_gram := uint32(w) * 5
|
||||||
addValue(deveui, w_gram)
|
addValue(deveui, w_gram)
|
||||||
|
|
@ -360,20 +352,27 @@ func WriteDatapoint(mytime int64, deveui string, devaddr string, v uint8, h uint
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WriteStringToFile(s string, deveui string) {
|
func WriteStringToFile(s string, deveui string, bool implausible) {
|
||||||
n, err := file.WriteString(s)
|
if !implausible {
|
||||||
if err != nil {
|
n, err := file.WriteString(s)
|
||||||
fmt.Println(err)
|
if err != nil {
|
||||||
os.Exit(1)
|
fmt.Println(err)
|
||||||
}
|
os.Exit(1)
|
||||||
if n != len(s) {
|
}
|
||||||
fmt.Println("failed to write data")
|
if n != len(s) {
|
||||||
os.Exit(1)
|
fmt.Println("failed to write data")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also write to individual files
|
// Also write to individual files
|
||||||
datestr := time.Now().Format("2006-01")
|
datestr := time.Now().Format("2006-01")
|
||||||
individual_file := "/home/beieli/lorahandler/logs/" + deveui + "-" + datestr + ".log"
|
if implausible {
|
||||||
|
individual_file := "/home/beieli/lorahandler/logs/" + deveui + "-" + datestr + ".log"
|
||||||
|
} else {
|
||||||
|
individual_file := "/home/beieli/lorahandler/logs/" + "implausible" + "-" + datestr + ".log"
|
||||||
|
}
|
||||||
|
|
||||||
fi, err := os.OpenFile(individual_file, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
|
fi, err := os.OpenFile(individual_file, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
|
|
@ -430,12 +429,12 @@ func main() {
|
||||||
r.Body = rdr2
|
r.Body = rdr2
|
||||||
|
|
||||||
// We look for the text string "mini-beieli" in the buffer, then it is a TTN Packet,
|
// We look for the text string "mini-beieli" in the buffer, then it is a TTN Packet,
|
||||||
// otherwise it should be a Swisscom Packet...
|
// otherwise it should be a Swisscom Packet...
|
||||||
|
|
||||||
fmt.Printf("Length of JSON Body: %d\n", len(buf))
|
fmt.Printf("Length of JSON Body: %d\n", len(buf))
|
||||||
|
|
||||||
if strings.Contains(string(buf),"mini-beieli") {
|
if strings.Contains(string(buf), "mini-beieli") {
|
||||||
fmt.Printf("Seems to be a TTN Packet...\n")
|
fmt.Printf("Seems to be a TTN Packet...\n")
|
||||||
// it is probably a TTN package...
|
// it is probably a TTN package...
|
||||||
err := json.NewDecoder(r.Body).Decode(&message_ttn)
|
err := json.NewDecoder(r.Body).Decode(&message_ttn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -453,7 +452,7 @@ func main() {
|
||||||
fmt.Println("Error: could not convert raw_package to hex: %s" + message_ttn.Payload_raw)
|
fmt.Println("Error: could not convert raw_package to hex: %s" + message_ttn.Payload_raw)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("Seems to be a Swisscom Packet...\n")
|
fmt.Printf("Seems to be a Swisscom Packet...\n")
|
||||||
// it is probably a Swisscom package...
|
// it is probably a Swisscom package...
|
||||||
err := json.NewDecoder(r.Body).Decode(&message_swisscom)
|
err := json.NewDecoder(r.Body).Decode(&message_swisscom)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue