mini-beieli-node/mini-beieli-provision.go

83 lines
1.8 KiB
Go

package main
import (
"fmt"
"github.com/tarm/serial"
"log"
"math/rand"
"os"
"path/filepath"
"strings"
"time"
)
func RandomEUI64() string {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
var letter = []rune("ABCDEF0123456789")
b := make([]rune, 16+7)
for i := range b {
if (i+1)%3 == 0 {
b[i] = '-'
} else {
b[i] = letter[r.Intn(len(letter))]
}
}
return string(b)
}
func sendCommand(p *serial.Port, command string, waitForOk bool) string {
fmt.Print(command)
var status string = ""
p.Flush()
_, err := p.Write([]byte(command))
if err != nil {
log.Fatal(err)
}
buf := make([]byte, 32)
var loop int = 1
if waitForOk {
loop = 10
}
time.Sleep(200 * time.Millisecond)
for i := 0; i < loop; i++ {
// ignoring error as EOF raises error on Linux
n, _ := p.Read(buf)
if n > 0 {
status = string(buf[:n])
fmt.Print(status)
if strings.Contains(status, "OK") || strings.Contains(status, "?") {
break
}
}
}
return status
}
func main() {
if len(os.Args) != 3 {
fmt.Println("usage: " + filepath.Base(os.Args[0]) + " <SerialDevice> <DevEUI>")
os.Exit(1)
}
serialdev := os.Args[1]
deveui := os.Args[2]
c := &serial.Config{Name: serialdev, Baud: 115200, ReadTimeout: time.Second * 1}
s, err := serial.OpenPort(c)
if err != nil {
log.Fatal("Problem mit Serial Interface")
}
sendCommand(s, "system configure syseui "+RandomEUI64()+"\n", true)
sendCommand(s, "system configure platformguid 53ca094b-b888-465e-aa0e-e3064ec56d21\n", true)
sendCommand(s, "system configure operatingflags 0\n", true)
sendCommand(s, "lorawan configure deveui "+deveui+"\n", true)
sendCommand(s, "lorawan configure appeui "+deveui+"\n", true)
sendCommand(s, "lorawan configure appkey "+deveui+"-"+deveui+"\n", true)
sendCommand(s, "lorawan configure join 1\n", true)
}