@@ -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 {
389391func (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