mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-09 09:23:39 +00:00
Lorawan uplink support and new lorawan 'basic-demo' example
This commit is contained in:
committed by
Ron Evans
parent
301e6bc35b
commit
889536f7f0
@@ -0,0 +1,35 @@
|
||||
# Simple Lorawan example
|
||||
|
||||
This demo code will connect Lorawan network and send sample uplink message
|
||||
|
||||
You may change your Lorawan keys (AppEUI, DevEUI, AppKEY) in key-default.go
|
||||
|
||||
|
||||
```
|
||||
$ tinygo monitor
|
||||
Connected to /dev/ttyACM0. Press Ctrl-C to exit.
|
||||
Lorawan Simple Demo
|
||||
Start Lorawan Join sequence
|
||||
loraConnect: Connected !
|
||||
```
|
||||
|
||||
# Building
|
||||
|
||||
## Simulator
|
||||
|
||||
```
|
||||
tinygo flash -target pico ./examples/lora/lorawan/basic-demo
|
||||
```
|
||||
|
||||
## PyBadge with LoRa Featherwing
|
||||
|
||||
```
|
||||
tinygo flash -target pybadge -tags featherwing ./examples/lora/lorawan/basic-demo
|
||||
```
|
||||
|
||||
## LoRa-E5
|
||||
|
||||
```
|
||||
tinygo flash -target lorae5 ./examples/lora/lorawan/basic-demo
|
||||
```
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
//go:build !customkeys
|
||||
|
||||
package main
|
||||
|
||||
// These are sample keys, so the example builds
|
||||
// Either change here, or create a new go file and use customkeys build tag
|
||||
func setLorawanKeys() {
|
||||
otaa.SetAppEUI([]uint8{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
|
||||
otaa.SetDevEUI([]uint8{0xB3, 0xD5, 0x41, 0x00, 0x0A, 0xF1, 0xA4, 0x45})
|
||||
otaa.SetAppKey([]uint8{0x12, 0x22, 0xA3, 0xFF, 0x0C, 0x7B, 0x76, 0x7B, 0x8F, 0xD3, 0x12, 0x4F, 0xCE, 0x7A, 0x32, 0x16})
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
// Simple code for connecting to Lorawan network and uploading sample payload
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"tinygo.org/x/drivers/examples/lora/lorawan/common"
|
||||
"tinygo.org/x/drivers/lora"
|
||||
"tinygo.org/x/drivers/lora/lorawan"
|
||||
)
|
||||
|
||||
const (
|
||||
LORAWAN_JOIN_TIMEOUT_SEC = 180
|
||||
LORAWAN_RECONNECT_DELAY_SEC = 15
|
||||
LORAWAN_UPLINK_DELAY_SEC = 60
|
||||
)
|
||||
|
||||
var (
|
||||
radio lora.Radio
|
||||
session *lorawan.Session
|
||||
otaa *lorawan.Otaa
|
||||
)
|
||||
|
||||
func loraConnect() error {
|
||||
start := time.Now()
|
||||
var err error
|
||||
for time.Since(start) < LORAWAN_JOIN_TIMEOUT_SEC*time.Second {
|
||||
println("Trying to join network")
|
||||
err = lorawan.Join(otaa, session)
|
||||
if err == nil {
|
||||
println("Connected to network !")
|
||||
return nil
|
||||
}
|
||||
println("Join error:", err, "retrying in", LORAWAN_RECONNECT_DELAY_SEC, "sec")
|
||||
time.Sleep(time.Second * LORAWAN_RECONNECT_DELAY_SEC)
|
||||
}
|
||||
|
||||
err = errors.New("Unable to join Lorawan network")
|
||||
println(err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
func failMessage(err error) {
|
||||
println("FATAL:", err)
|
||||
for {
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
println("*** Lorawan basic join and uplink demo ***")
|
||||
|
||||
// Board specific Lorawan initialization
|
||||
var err error
|
||||
radio, err = common.SetupLora()
|
||||
if err != nil {
|
||||
failMessage(err)
|
||||
}
|
||||
|
||||
// Required for LoraWan operations
|
||||
session = &lorawan.Session{}
|
||||
otaa = &lorawan.Otaa{}
|
||||
|
||||
// Initial Lora modulation configuration
|
||||
loraConf := lora.Config{
|
||||
Freq: 868100000,
|
||||
Bw: lora.Bandwidth_125_0,
|
||||
Sf: lora.SpreadingFactor9,
|
||||
Cr: lora.CodingRate4_7,
|
||||
HeaderType: lora.HeaderExplicit,
|
||||
Preamble: 12,
|
||||
Ldr: lora.LowDataRateOptimizeOff,
|
||||
Iq: lora.IQStandard,
|
||||
Crc: lora.CRCOn,
|
||||
SyncWord: lora.SyncPublic,
|
||||
LoraTxPowerDBm: 20,
|
||||
}
|
||||
radio.LoraConfig(loraConf)
|
||||
|
||||
// Connect the lorawan with the Lora Radio device.
|
||||
lorawan.UseRadio(radio)
|
||||
|
||||
// Configure AppEUI, DevEUI, APPKey
|
||||
setLorawanKeys()
|
||||
|
||||
// Try to connect Lorawan network
|
||||
if err := loraConnect(); err != nil {
|
||||
failMessage(err)
|
||||
}
|
||||
|
||||
// Try to periodicaly send an uplink sample message
|
||||
upCount := 1
|
||||
for {
|
||||
payload := "Hello TinyGo #" + strconv.Itoa(upCount)
|
||||
|
||||
if err := lorawan.SendUplink([]byte(payload), session); err != nil {
|
||||
println("Uplink error:", err)
|
||||
} else {
|
||||
println("Uplink success, msg=", payload)
|
||||
}
|
||||
|
||||
println("Sleeping for", LORAWAN_UPLINK_DELAY_SEC, "sec")
|
||||
time.Sleep(time.Second * LORAWAN_UPLINK_DELAY_SEC)
|
||||
upCount++
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user