diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c0dc202 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +setup-node/setup-node diff --git a/artwork/gps-tracker-price-tag.png b/artwork/gps-tracker-price-tag.png new file mode 100644 index 0000000..920dc4a Binary files /dev/null and b/artwork/gps-tracker-price-tag.png differ diff --git a/artwork/preisschild.svg b/artwork/preisschild.svg new file mode 100644 index 0000000..b71983e --- /dev/null +++ b/artwork/preisschild.svg @@ -0,0 +1,99 @@ + + + + + + + + image/svg+xml + + + + + + + CHF 150.00 + CHF 5.00 pro Monat (ab zweitem Jahr) + + + diff --git a/firmware/README.md b/firmware/README.md index 71d574e..6e0cb60 100644 --- a/firmware/README.md +++ b/firmware/README.md @@ -2,6 +2,12 @@ ` LED nach oben (mit eigenem Kabel, siehe ODT File) -Reset Knopf kurz drücken, dann folgender Befehl: +Reset Knopf (z.B. mit Bueroklammer) drücken, dann folgender Befehl: + [joerg@cinnamon firmware]$ openocd -f /usr/share/openocd/scripts/interface/stlink.cfg -c "transport select hla_swd" -f /usr/share/openocd/scripts/target/stm32l0.cfg -c init -c 'program EU868.hex verify reset exit' + +Gerade nach Befehl Reset-Knopf wieder loslassen - Timing ist entscheidend! + +Nach Firmware Update immer: +AT+FDR ` diff --git a/schablone/schablone.FCStd b/schablone/schablone.FCStd new file mode 100644 index 0000000..87214da Binary files /dev/null and b/schablone/schablone.FCStd differ diff --git a/schablone/schablone.FCStd1 b/schablone/schablone.FCStd1 new file mode 100644 index 0000000..721ba0a Binary files /dev/null and b/schablone/schablone.FCStd1 differ diff --git a/schablone/schablone.stl b/schablone/schablone.stl new file mode 100644 index 0000000..89a2927 Binary files /dev/null and b/schablone/schablone.stl differ diff --git a/setup-node/main.go b/setup-node/main.go new file mode 100644 index 0000000..18c83f7 --- /dev/null +++ b/setup-node/main.go @@ -0,0 +1,162 @@ +package main + +import ( + "fmt" + "github.com/tarm/serial" + "log" + "os" + "path/filepath" + "strings" + "time" +) + +// returns last line of output +func sendCommand(p *serial.Port, command string) string { + fmt.Printf("%s\n", command) + var first_line string = "" + p.Flush() + time.Sleep(300 * time.Millisecond) + ignorebuf := make([]byte, 1024) + p.Read(ignorebuf) + _, err := p.Write([]byte(command + "\n")) + if err != nil { + log.Fatal(err) + } + buf := make([]byte, 1024) + + time.Sleep(300 * time.Millisecond) + + n, _ := p.Read(buf) + if n > 0 { + lines := strings.Split(string(buf[:n]), "\n") + //fmt.Printf("%+q\n", lines) + first_line = lines[0] + + } + return first_line +} + +func getDevEui(p *serial.Port) string { + var reply = sendCommand(p, "AT+DADDR=?") + //fmt.Printf("XXX%sYYY\n",reply) + if len(reply) >= 10 { + return "a8 40 41 00 " + reply[0:11] + } else { + return "" + } +} + +func getFWVersion(p *serial.Port) string { + var reply = sendCommand(p, "AT+VER=?") + //fmt.Printf("XXX%sYYY\n",reply) + if len(reply) >= 10 { + return reply + } else { + return "" + } +} + +func getAppKey(deveui string) string { + if len(deveui) == 23 { + mdeveui := strings.ReplaceAll(deveui, " ", "") + appkey := fmt.Sprintf("%c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c", + mdeveui[10], + mdeveui[3], + mdeveui[4], + mdeveui[7], + mdeveui[15], + mdeveui[9], + mdeveui[11], + mdeveui[2], + mdeveui[0], + mdeveui[8], + mdeveui[1], + mdeveui[6], + mdeveui[5], + mdeveui[12], + mdeveui[14], + mdeveui[13], + mdeveui[3], + mdeveui[6], + mdeveui[12], + mdeveui[7], + mdeveui[15], + mdeveui[1], + mdeveui[9], + mdeveui[11], + mdeveui[2], + mdeveui[10], + mdeveui[0], + mdeveui[8], + mdeveui[5], + mdeveui[14], + mdeveui[4], + mdeveui[13]) + + fmt.Printf("calculated AppKey: %s\n", appkey) + return appkey + + } else { + fmt.Printf("devEui has wrong length: %s\n", deveui) + return "" + } +} + +func readSerial(p *serial.Port) { + p.Flush() + buf := make([]byte, 32) + + time.Sleep(200 * time.Millisecond) + n, _ := p.Read(buf) + for n > 0 { + // ignoring error as EOF raises error on Linux + reply := string(buf[:n]) + fmt.Printf("%s", reply) + n, _ = p.Read(buf) + } +} + +func main() { + if len(os.Args) != 2 { + fmt.Println("usage: " + filepath.Base(os.Args[0]) + " ") + os.Exit(1) + } + + serialdev := os.Args[1] + appEui := "a8 40 41 35 10 35 10 35" + + c := &serial.Config{Name: serialdev, Baud: 9600, ReadTimeout: time.Second * 1} + s, err := serial.OpenPort(c) + if err != nil { + log.Fatal("Problem mit Serial Interface") + } + + location, err := time.LoadLocation("Europe/Zurich") + + f, err := os.OpenFile("setup-node.log", + os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Println(err) + } + defer f.Close() + + sendCommand(s, "AT") + devEui := getDevEui(s) + FWVersion := getFWVersion(s) + if devEui != "" { + fmt.Printf("devEui: %s\n", devEui) + sendCommand(s, "AT+APPEUI="+appEui) + appkey := getAppKey(devEui) + sendCommand(s, "AT+APPKEY="+appkey) + sendCommand(s, "AT+FDR") + sendCommand(s, "AT+LON=0") + sendCommand(s, "ATZ") + logline := strings.ToUpper(fmt.Sprintf("%s: %s %s %s %s\n", time.Now().In(location).Format("02.01.2006 15:04"), strings.ReplaceAll(devEui, " ", ""), strings.ReplaceAll(appEui, " ", ""), strings.ReplaceAll(appkey, " ", ""), FWVersion)) + if _, err := f.WriteString(logline); err != nil { + log.Println(err) + } + readSerial(s) + } else { + log.Fatal("Could not get devEui") + } +} diff --git a/setup-node/setup-node.log b/setup-node/setup-node.log new file mode 100644 index 0000000..b364154 --- /dev/null +++ b/setup-node/setup-node.log @@ -0,0 +1,8 @@ +17.04.2021 17:13: A8404100018193D7 A840413510351035 80407114A08019D30090781148A01D43 V1.6.5 EU868 +17.04.2021 17:14: A8404100018193F3 A840413510351035 80403114A08019F30090381148A01F43 V1.6.5 EU868 +14.05.2021 16:28: A8404100018193F3 A840413510351035 80403114A08019F30090381148A01F43 V1.6.5 EU868 +14.05.2021 16:52: A8404100018193D7 A840413510351035 80407114A08019D30090781148A01D43 V1.6.5 EU868 +14.05.2021 20:26: A8404100018193D7 A840413510351035 80407114A08019D30090781148A01D43 V1.6.5 EU868 +14.05.2021 20:32: A8404100018193F3 A840413510351035 80403114A08019F30090381148A01F43 V1.6.5 EU868 +02.06.2021 19:44: A8404100018193DE A840413510351035 8040E114A08019D30090E81148A01D43 +02.06.2021 19:49: A8404100018193DE A840413510351035 8040E114A08019D30090E81148A01D43 V1.6.5 EU868