package main import ( "fmt" "log" "time" "math" "strings" "strconv" "io/ioutil" "net/http" ) 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) } }