package main import ( "fmt" "io/ioutil" "log" "math" "net/http" "strconv" "strings" "time" ) const api_url = "https://proxy1.lpn.swisscom.ch/thingpark/lrc/rest" func MakePost(url string) { req, err := http.NewRequest("POST", url, nil) if err != nil { log.Fatal("Error reading request. ", err) } // Set headers req.Header.Set("Content-Type", "application/x-www-form-urlencoded") // Set client timeout client := &http.Client{Timeout: time.Second * 10} // Send request resp, err := client.Do(req) if err != nil { log.Fatal("Error reading response. ", err) } defer resp.Body.Close() fmt.Println("response Status:", resp.Status) fmt.Println("response Headers:", resp.Header) body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal("Error reading body. ", err) } fmt.Printf("%s\n", body) } func ResetNodeToZero(deveui string, w1_0 int32, w2_0 int32) { fmt.Printf("Called ResetNodeToZero for deveui %s\n", deveui) valstr := fmt.Sprintf("%08X%08X%08X%08X", uint32(w1_0), uint32(w2_0), 0, 0) s := fmt.Sprintf("%s/downlink?DevEUI=%s&FPort=1&Payload=00%s", api_url, deveui, valstr) MakePost(s) SetDownlinkCommand(deveui, "do_nothing") } func CalibrateScale(deveui string, downlink_command string, w1 int32, w2 int32) { fmt.Printf("Called CalibrateScale for deveui %s, downlink_command: %s\n", deveui, downlink_command) var cur_cal_settings CalSettings cur_cal_settings = GetCurrentCalibrationSettings(deveui) var calibration_weight_gram int32 var calibration_weight2_gram int32 tokens := strings.Split(downlink_command, " ") if len(tokens) < 2 { // no value in gram included! fmt.Printf("Error: invalid downlink_command: %s, examples: \"tare_a 10000\", \"tare_b 10000\", \"tare 10000 10000\" devuid: %s\n", downlink_command, deveui) return } n, err := strconv.ParseInt(tokens[1], 10, 32) if err == nil { calibration_weight_gram = int32(n) } else { fmt.Printf("Error: cannot get tare weight in gram: %s, deveui: %s\n", downlink_command, deveui) return } if len(tokens) > 2 { n, err := strconv.ParseInt(tokens[2], 10, 32) if err == nil { calibration_weight2_gram = int32(n) } else { fmt.Printf("Error: cannot get tare weight2 in gram: %s, deveui: %s\n", downlink_command, deveui) return } } if tokens[0] == "tare_a" { new_w1_c := float32(w1-cur_cal_settings.w1_0) / float32(calibration_weight_gram) valstr := fmt.Sprintf("%08X%08X%08X%08X", uint32(cur_cal_settings.w1_0), uint32(cur_cal_settings.w2_0), math.Float32bits(new_w1_c), math.Float32bits(cur_cal_settings.w2_c)) s := fmt.Sprintf("%s/downlink?DevEUI=%s&FPort=1&Payload=01%s", api_url, deveui, valstr) MakePost(s) SetDownlinkCommand(deveui, "do_nothing") } else if tokens[0] == "tare_b" { new_w2_c := float32(w2-cur_cal_settings.w2_0) / float32(calibration_weight_gram) valstr := fmt.Sprintf("%08X%08X%08X%08X", uint32(cur_cal_settings.w1_0), uint32(cur_cal_settings.w2_0), math.Float32bits(cur_cal_settings.w1_c), math.Float32bits(new_w2_c)) s := fmt.Sprintf("%s/downlink?DevEUI=%s&FPort=1&Payload=01%s", api_url, deveui, valstr) MakePost(s) SetDownlinkCommand(deveui, "do_nothing") } else if tokens[0] == "tare" { new_w1_c := float32(w1-cur_cal_settings.w1_0) / float32(calibration_weight_gram) new_w2_c := float32(w2-cur_cal_settings.w2_0) / float32(calibration_weight2_gram) valstr := fmt.Sprintf("%08X%08X%08X%08X", uint32(cur_cal_settings.w1_0), uint32(cur_cal_settings.w2_0), math.Float32bits(new_w1_c), math.Float32bits(new_w2_c)) s := fmt.Sprintf("%s/downlink?DevEUI=%s&FPort=1&Payload=01%s", api_url, deveui, valstr) MakePost(s) SetDownlinkCommand(deveui, "do_nothing") } else { fmt.Printf("Error: either use tare_a or tare_b or tare; deveui %s\n", deveui) } } func UpdateCalibrationSettingsFromNode(deveui string, w1_0 int32, w2_0 int32, w1_c float32, w2_c float32) { fmt.Printf("Called UpdateCalibrationSettingsFromNode for deveui %s\n", deveui) var cur_cal_settings CalSettings var new_cal_settings CalSettings cur_cal_settings = GetCurrentCalibrationSettings(deveui) new_cal_settings.w1_0 = w1_0 new_cal_settings.w2_0 = w2_0 new_cal_settings.w1_c = w1_c new_cal_settings.w2_c = w2_c if (new_cal_settings.w1_0 != cur_cal_settings.w1_0) || (new_cal_settings.w2_0 != cur_cal_settings.w2_0) || (new_cal_settings.w1_c != cur_cal_settings.w1_c) || (new_cal_settings.w2_c != cur_cal_settings.w2_c) { SetCurrentCalibrationSettings(deveui, new_cal_settings) // since something has changed and is reflected in the local config, we don't do anything any more... SetDownlinkCommand(deveui, "do_nothing") } else { fmt.Printf("Info: no change in calibration settings for deveui %s\n", deveui) } }