Skip to content

Commit

Permalink
improved support for class B
Browse files Browse the repository at this point in the history
  • Loading branch information
Karol Witusik committed Mar 21, 2024
1 parent ea1940b commit b8edd9c
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 18 deletions.
57 changes: 45 additions & 12 deletions examples/class_c/main.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package main

import (
"bufio"
"context"
"fmt"
"log"
"os"
"time"

"github.com/gofrs/uuid"
Expand All @@ -15,8 +17,30 @@ import (
fuota "github.com/chirpstack/chirpstack-fuota-server/v4/api/go"
)

func RetrieveROM(filename string) ([]byte, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
stats, statsErr := file.Stat()
if statsErr != nil {
return nil, statsErr
}
var size int64 = stats.Size()
fmt.Printf("size: %d\n", size)
bytes := make([]byte, size)
bufr := bufio.NewReader(file)
_, err = bufr.Read(bytes)
return bytes, err
}

func main() {
mcRootKey, err := multicastsetup.GetMcRootKeyForGenAppKey(lorawan.AES128Key{0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
// mcRootKey_stm32, err := multicastsetup.GetMcRootKeyForGenAppKey(lorawan.AES128Key{0xD5, 0x34, 0x21, 0xC2, 0xCF, 0xD0, 0x6C, 0x95, 0xD2, 0xFD, 0x69, 0x88, 0xD9, 0xDD, 0x91, 0x9A})
// if err != nil {
// log.Fatal(err)
// }
mcRootKey_nrf52840, err := multicastsetup.GetMcRootKeyForGenAppKey(lorawan.AES128Key{0xE5, 0x34, 0x21, 0xC2, 0xCF, 0xD0, 0x6C, 0x95, 0xD2, 0xFD, 0x69, 0x88, 0xD9, 0xDD, 0x91, 0x9A})
if err != nil {
log.Fatal(err)
}
Expand All @@ -33,27 +57,36 @@ func main() {

client := fuota.NewFuotaServerServiceClient(conn)

// b, err := RetrieveROM("./app_lr1121.bin")
// if err != nil {
// panic(err)
// }

resp, err := client.CreateDeployment(context.Background(), &fuota.CreateDeploymentRequest{
Deployment: &fuota.Deployment{
ApplicationId: "d9fde0d5-bcaf-4e42-8d27-417f11628905",
ApplicationId: "4a984ec5-aff1-42dd-89c1-a0269cff4187",
Devices: []*fuota.DeploymentDevice{
// {
// DevEui: "70B3D57ED0063CDD",
// McRootKey: mcRootKey_stm32.String(),
// },
{
DevEui: "090000000000000000",
McRootKey: mcRootKey.String(),
DevEui: "80b3d57ed0063cdd",
McRootKey: mcRootKey_nrf52840.String(),
},
},
MulticastGroupType: fuota.MulticastGroupType_CLASS_C,
MulticastDr: 5,
MulticastFrequency: 868100000,
MulticastGroupId: 0,
MulticastTimeout: 6,
MulticastGroupId: 1,
MulticastTimeout: 7,
MulticastRegion: fuota.Region_EU868,
UnicastTimeout: ptypes.DurationProto(60 * time.Second),
UnicastAttemptCount: 1,
FragmentationFragmentSize: 50,
Payload: make([]byte, 100),
FragmentationRedundancy: 1,
FragmentationSessionIndex: 0,
UnicastTimeout: ptypes.DurationProto(30 * time.Second),
UnicastAttemptCount: 3,
FragmentationFragmentSize: 200,
Payload: make([]byte, 2000),
FragmentationRedundancy: 5,
FragmentationSessionIndex: 1,
FragmentationMatrix: 0,
FragmentationBlockAckDelay: 1,
FragmentationDescriptor: []byte{0, 0, 0, 0},
Expand Down
1 change: 1 addition & 0 deletions internal/api/fuota_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ func (a *FUOTAServerAPI) CreateDeployment(ctx context.Context, req *fapi.CreateD
BlockAckDelay: uint8(req.GetDeployment().FragmentationBlockAckDelay),
UnicastAttemptCount: int(req.GetDeployment().UnicastAttemptCount),
RequestFragmentationSessionStatus: fuota.FragmentationSessionStatusRequestType(req.GetDeployment().RequestFragmentationSessionStatus.String()),
MulticastPingSlotPeriodicity: uint8(req.GetDeployment().MulticastPingSlotPeriod),
}

for _, d := range req.GetDeployment().Devices {
Expand Down
14 changes: 8 additions & 6 deletions internal/fuota/fuota.go
Original file line number Diff line number Diff line change
Expand Up @@ -1059,8 +1059,8 @@ devLoop:
break
}

d.sessionStartTime = time.Now().Add(d.opts.UnicastTimeout)
d.sessionEndTime = d.sessionStartTime.Add(time.Duration(1<<d.opts.MulticastTimeout) * time.Second)
d.sessionStartTime = time.Now().Add(d.opts.UnicastTimeout + time.Duration(128*2)*time.Second)
d.sessionEndTime = d.sessionStartTime.Add(128 * time.Duration(1<<d.opts.MulticastTimeout) * time.Second)

for devEUI := range d.opts.Devices {
// ignore devices that have not setup the fragmentation session
Expand All @@ -1073,9 +1073,11 @@ devLoop:
}

log.WithFields(log.Fields{
"deployment_id": d.GetID(),
"dev_eui": devEUI,
"attempt": attempt,
"deployment_id": d.GetID(),
"dev_eui": devEUI,
"attempt": attempt,
"MulticastPingSlotPeriodicity": d.opts.MulticastPingSlotPeriodicity,
"MulticastTimeout": d.opts.MulticastTimeout,
}).Info("fuota: initiate multicast class-b session setup for device")

sessionTime := uint32((gps.Time(d.sessionStartTime).TimeSinceGPSEpoch() / time.Second) % (1 << 32))
Expand Down Expand Up @@ -1279,7 +1281,7 @@ devLoop:
func (d *Deployment) stepEnqueue(ctx context.Context) error {
log.WithField("deployment_id", d.GetID()).Info("fuota: starting multicast enqueue")

timeDiff := d.sessionStartTime.Sub(time.Now())
timeDiff := d.sessionStartTime.Sub(time.Now().Add(time.Duration(-15) * time.Second))
if timeDiff > 0 {
log.WithFields(log.Fields{
"deployment_id": d.GetID(),
Expand Down

0 comments on commit b8edd9c

Please sign in to comment.