Skip to content

Commit 172a3a0

Browse files
committed
Speed up device creation.
1 parent 73ee3d9 commit 172a3a0

File tree

1 file changed

+48
-34
lines changed

1 file changed

+48
-34
lines changed

internal/simulator/simulator.go

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ type simulation struct {
8888
deviceProfileID uuid.UUID
8989
applicationID string
9090
gatewayIDs []lorawan.EUI64
91+
deviceAppKeysMutex sync.Mutex
9192
deviceAppKeys map[lorawan.EUI64]lorawan.AES128Key
9293
eventTopicTemplate string
9394
commandTopicTemplate string
@@ -323,6 +324,7 @@ func (s *simulation) setupDeviceProfile() error {
323324
RegParamsRevision: common.RegParamsRevision_B,
324325
SupportsOtaa: true,
325326
Region: common.Region_EU868,
327+
AdrAlgorithmId: "default",
326328
},
327329
})
328330
if err != nil {
@@ -389,46 +391,58 @@ func (s *simulation) tearDownApplication() error {
389391
func (s *simulation) setupDevices() error {
390392
log.Info("simulator: init devices")
391393

392-
for i := 0; i < s.deviceCount; i++ {
393-
var devEUI lorawan.EUI64
394-
var appKey lorawan.AES128Key
395-
396-
if _, err := rand.Read(devEUI[:]); err != nil {
397-
return err
398-
}
399-
if _, err := rand.Read(appKey[:]); err != nil {
400-
return err
401-
}
394+
var wg sync.WaitGroup
402395

403-
_, err := as.Device().Create(context.Background(), &api.CreateDeviceRequest{
404-
Device: &api.Device{
405-
DevEui: devEUI.String(),
406-
Name: devEUI.String(),
407-
Description: devEUI.String(),
408-
ApplicationId: s.applicationID,
409-
DeviceProfileId: s.deviceProfileID.String(),
410-
},
411-
})
412-
if err != nil {
413-
return errors.Wrap(err, "create device error")
414-
}
396+
for i := 0; i < s.deviceCount; i++ {
397+
wg.Add(1)
415398

416-
_, err = as.Device().CreateKeys(context.Background(), &api.CreateDeviceKeysRequest{
417-
DeviceKeys: &api.DeviceKeys{
418-
DevEui: devEUI.String(),
399+
go func() {
400+
var devEUI lorawan.EUI64
401+
var appKey lorawan.AES128Key
402+
403+
if _, err := rand.Read(devEUI[:]); err != nil {
404+
log.Fatal(err)
405+
}
406+
if _, err := rand.Read(appKey[:]); err != nil {
407+
log.Fatal(err)
408+
}
409+
410+
_, err := as.Device().Create(context.Background(), &api.CreateDeviceRequest{
411+
Device: &api.Device{
412+
DevEui: devEUI.String(),
413+
Name: devEUI.String(),
414+
Description: devEUI.String(),
415+
ApplicationId: s.applicationID,
416+
DeviceProfileId: s.deviceProfileID.String(),
417+
},
418+
})
419+
if err != nil {
420+
log.Fatal("create device error, error: %s", err)
421+
}
422+
423+
_, err = as.Device().CreateKeys(context.Background(), &api.CreateDeviceKeysRequest{
424+
DeviceKeys: &api.DeviceKeys{
425+
DevEui: devEUI.String(),
426+
427+
// yes, this is correct for LoRaWAN 1.0.x!
428+
// see the API documentation
429+
NwkKey: appKey.String(),
430+
},
431+
})
432+
if err != nil {
433+
log.Fatal("create device keys error, error: %s", err)
434+
}
419435

420-
// yes, this is correct for LoRaWAN 1.0.x!
421-
// see the API documentation
422-
NwkKey: appKey.String(),
423-
},
424-
})
425-
if err != nil {
426-
return errors.Wrap(err, "create device keys error")
427-
}
436+
s.deviceAppKeysMutex.Lock()
437+
s.deviceAppKeys[devEUI] = appKey
438+
s.deviceAppKeysMutex.Unlock()
439+
wg.Done()
440+
}()
428441

429-
s.deviceAppKeys[devEUI] = appKey
430442
}
431443

444+
wg.Wait()
445+
432446
return nil
433447
}
434448

0 commit comments

Comments
 (0)