add TTN as possible datasource

This commit is contained in:
Joerg Lehmann 2020-06-18 16:44:57 +02:00
parent 40dadbb7b4
commit bebcfbf846
1 changed files with 60 additions and 12 deletions

View File

@ -5,6 +5,7 @@ import (
"encoding/binary" "encoding/binary"
"encoding/hex" "encoding/hex"
"encoding/json" "encoding/json"
"encoding/base64"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log" "log"
@ -22,6 +23,16 @@ const (
NOT_ATTACHED = -2147483648 NOT_ATTACHED = -2147483648
) )
type MetadataTTN struct {
Time string `json:"time"`
}
type MessageTTN struct {
Hardware_serial string `json:"hardware_serial"`
Metadata MetadataTTN `json:"metadata"`
Payload_raw string `json:"payload_raw"`
}
type MessageProperties struct { type MessageProperties struct {
Time string `json:"Time"` Time string `json:"Time"`
Payload_hex string `json:"payload_hex"` Payload_hex string `json:"payload_hex"`
@ -344,6 +355,15 @@ func WriteStringToFile(s string) {
} }
} }
func Convert2Hex(payload_raw string) (string, error) {
res := "error"
p, err := base64.StdEncoding.DecodeString(payload_raw)
if err == nil {
res = hex.EncodeToString(p)
}
return res, err
}
func main() { func main() {
// Init Redis // Init Redis
initDB() initDB()
@ -362,7 +382,8 @@ func main() {
defer file.Close() defer file.Close()
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
var u Message var message_swisscom Message
var message_ttn MessageTTN
if r.Body == nil { if r.Body == nil {
http.Error(w, "Please send a request body", 400) http.Error(w, "Please send a request body", 400)
return return
@ -380,18 +401,45 @@ func main() {
log.Printf("BODY: %s", rdr1) log.Printf("BODY: %s", rdr1)
r.Body = rdr2 r.Body = rdr2
err := json.NewDecoder(r.Body).Decode(&u) // We look for the text string "mini-beieli" in the buffer, then it is a TTN Packet,
if err != nil { // otherwise it should be a Swisscom Packet...
http.Error(w, err.Error(), 400)
return fmt.Printf("Length of JSON Body: %d\n", len(buf))
if strings.Contains(string(buf),"mini-beieli") {
fmt.Printf("Seems to be a TTN Packet...\n")
// it is probably a TTN package...
err := json.NewDecoder(r.Body).Decode(&message_ttn)
if err != nil {
http.Error(w, err.Error(), 400)
return
}
fmt.Println("Time: " + message_ttn.Metadata.Time)
fmt.Println("Payload Raw: " + message_ttn.Payload_raw)
fmt.Println("DevEUI: " + message_ttn.Hardware_serial)
payload_hex, err := Convert2Hex(message_ttn.Payload_raw)
if err == nil {
DecodePayload(payload_hex, message_ttn.Hardware_serial, "N/A", 0, 0, true)
} else {
fmt.Println("Error: could not convert raw_package to hex: %s" + message_ttn.Payload_raw)
}
} else {
fmt.Printf("Seems to be a Swisscom Packet...\n")
// it is probably a Swisscom package...
err := json.NewDecoder(r.Body).Decode(&message_swisscom)
if err != nil {
http.Error(w, err.Error(), 400)
return
}
fmt.Println("Time: " + message_swisscom.Prop.Time)
fmt.Println("Payload Hex: " + message_swisscom.Prop.Payload_hex)
fmt.Println("DevEUI: " + message_swisscom.Prop.DevEUI)
fmt.Println("DevAddr: " + message_swisscom.Prop.DevAddr)
fmt.Printf("LrrLAT: %f\n", message_swisscom.Prop.LrrLAT)
fmt.Printf("LrrLON: %f\n", message_swisscom.Prop.LrrLON)
DecodePayload(message_swisscom.Prop.Payload_hex, message_swisscom.Prop.DevEUI, message_swisscom.Prop.DevAddr, message_swisscom.Prop.LrrLAT, message_swisscom.Prop.LrrLON, true)
} }
fmt.Println("Time: " + u.Prop.Time)
fmt.Println("Payload Hex: " + u.Prop.Payload_hex)
fmt.Println("DevEUI: " + u.Prop.DevEUI)
fmt.Println("DevAddr: " + u.Prop.DevAddr)
fmt.Printf("LrrLAT: %f\n", u.Prop.LrrLAT)
fmt.Printf("LrrLON: %f\n", u.Prop.LrrLON)
DecodePayload(u.Prop.Payload_hex, u.Prop.DevEUI, u.Prop.DevAddr, u.Prop.LrrLAT, u.Prop.LrrLON, true)
}) })
log.Fatal(http.ListenAndServe(":8080", nil)) log.Fatal(http.ListenAndServe(":8080", nil))
} }