From bebcfbf84662a0e6e8098f3bdf13de487b3697fe Mon Sep 17 00:00:00 2001 From: Joerg Lehmann Date: Thu, 18 Jun 2020 16:44:57 +0200 Subject: [PATCH] add TTN as possible datasource --- lorahandler.go | 72 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/lorahandler.go b/lorahandler.go index 2635457..e13ff67 100644 --- a/lorahandler.go +++ b/lorahandler.go @@ -5,6 +5,7 @@ import ( "encoding/binary" "encoding/hex" "encoding/json" + "encoding/base64" "fmt" "io/ioutil" "log" @@ -22,6 +23,16 @@ const ( 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 { Time string `json:"Time"` 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() { // Init Redis initDB() @@ -362,7 +382,8 @@ func main() { defer file.Close() http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - var u Message + var message_swisscom Message + var message_ttn MessageTTN if r.Body == nil { http.Error(w, "Please send a request body", 400) return @@ -380,18 +401,45 @@ func main() { log.Printf("BODY: %s", rdr1) r.Body = rdr2 - err := json.NewDecoder(r.Body).Decode(&u) - if err != nil { - http.Error(w, err.Error(), 400) - return + // We look for the text string "mini-beieli" in the buffer, then it is a TTN Packet, + // otherwise it should be a Swisscom Packet... + + 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)) }