@@ -32,9 +32,11 @@ public class ProvisioningDeviceClient : IDisposable
3232 private DateTime _retryInitTime ;
3333 private string _operationId ;
3434 private ProvisioningRegistrationStatusType _status = ProvisioningRegistrationStatusType . Unassigned ;
35+ private ProvisioningRegistrationStatusType _statusLast = ProvisioningRegistrationStatusType . Unassigned ;
3536 private DeviceRegistrationResult _result = null ;
3637 private bool _isMessageProcessed = false ;
3738 private bool _isDisposed = false ;
39+ private string _message = null ;
3840
3941 /// <summary>
4042 /// Creates an instance of the Device Provisioning Client.
@@ -205,10 +207,12 @@ public DeviceRegistrationResult Register(ProvisioningRegistrationAdditionalData
205207 registration = $ "{{\" registrationId\" :\" { _registrationId } \" }}";
206208 }
207209
208- var ret = _mqttc . Publish ( $ "$dps/registrations/PUT/iotdps-register/?$rid={ _requestId } ", Encoding . UTF8 . GetBytes ( registration ) ) ;
210+ _mqttc . Publish ( $ "$dps/registrations/PUT/iotdps-register/?$rid={ _requestId } ", Encoding . UTF8 . GetBytes ( registration ) ) ;
209211
210212 while ( ( ! cancellationToken . IsCancellationRequested ) && ( _status != ProvisioningRegistrationStatusType . Assigned ) )
211213 {
214+ // We force to clean the memory at this stage, for constrained devices
215+ Runtime . Native . GC . Run ( true ) ;
212216 Thread . Sleep ( 200 ) ;
213217 // Don't ask for a new message if we are already processing one
214218 if ( ( _retry > 0 ) && ( ! _isMessageProcessed ) )
@@ -222,6 +226,35 @@ public DeviceRegistrationResult Register(ProvisioningRegistrationAdditionalData
222226 }
223227
224228 CleanAll ( ) ;
229+
230+ // Creating a DeviceRegistrationResult only when it's needed
231+ // One more time cleaning the memory for small devices, a bit of performances penalties
232+ Runtime . Native . GC . Run ( true ) ;
233+ if ( ! string . IsNullOrEmpty ( _message ) )
234+ {
235+ var opeStat = ( RegistrationOperationStatus ) nanoFramework . Json . JsonConvert . DeserializeObject ( _message , typeof ( RegistrationOperationStatus ) ) ;
236+ var reg = opeStat . registrationState ;
237+ var status = AssignStatus ( opeStat . status ) ;
238+ if ( _statusLast == ProvisioningRegistrationStatusType . Assigned )
239+ {
240+ ProvisioningRegistrationSubstatusType sub = ProvisioningRegistrationSubstatusType . InitialAssignment ;
241+ if ( reg . substatus == "deviceDataMigrated" )
242+ {
243+ sub = ProvisioningRegistrationSubstatusType . DeviceDataMigrated ;
244+ }
245+ else if ( reg . substatus == "deviceDataReset" )
246+ {
247+ sub = ProvisioningRegistrationSubstatusType . DeviceDataReset ;
248+ }
249+
250+ _result = new ( reg . registrationId , reg . createdDateTimeUtc , reg . assignedHub , reg . deviceId , status , sub , string . Empty , reg . lastUpdatedDateTimeUtc , reg . errorCode , reg . errorMessage , reg . etag , opeStat . registrationState . payload ) ;
251+ }
252+ else
253+ {
254+ _result = new ( reg . registrationId , reg . createdDateTimeUtc , reg . assignedHub , reg . deviceId , status , string . Empty , reg . lastUpdatedDateTimeUtc , reg . errorCode , reg . errorMessage , reg . etag ) ;
255+ }
256+ }
257+
225258 return _result ?? new DeviceRegistrationResult ( _registrationId , DateTime . UtcNow , string . Empty , string . Empty , _status , string . Empty , DateTime . UtcNow , - 1 , $ "Unknown error, cancellation requested: { cancellationToken . IsCancellationRequested } ", string . Empty ) ;
226259 }
227260
@@ -263,9 +296,9 @@ private void ClientMqttMsgReceived(object sender, MqttMsgPublishEventArgs e)
263296 // The message after the publish looks like that:
264297 // $dps/registrations/res/202/?$rid={request_id}&retry-after=x
265298 // x is the retry-after value in seconds
299+ var opeStat = ( RegistrationOperationStatusSimple ) Json . JsonConvert . DeserializeObject ( message , typeof ( RegistrationOperationStatusSimple ) ) ;
266300 if ( e . Topic . StartsWith ( $ "$dps/registrations/res/202/?$rid={ _requestId } ") )
267301 {
268- var opeStat = ( RegistrationOperationStatusSimple ) Json . JsonConvert . DeserializeObject ( message , typeof ( RegistrationOperationStatusSimple ) ) ;
269302 _operationId = opeStat . operationId ;
270303 status = AssignStatus ( opeStat . status ) ;
271304 _retry = Convert . ToInt32 ( e . Topic . Substring ( e . Topic . LastIndexOf ( '=' ) + 1 ) ) ;
@@ -275,28 +308,10 @@ private void ClientMqttMsgReceived(object sender, MqttMsgPublishEventArgs e)
275308 {
276309 // This is to avoid having multiple messages to process
277310 _isMessageProcessed = true ;
278- var opeStat = ( RegistrationOperationStatus ) Json . JsonConvert . DeserializeObject ( message , typeof ( RegistrationOperationStatus ) ) ;
279311 _operationId = opeStat . operationId ;
280312 status = AssignStatus ( opeStat . status ) ;
281- var reg = opeStat . registrationState ;
282- if ( _status == ProvisioningRegistrationStatusType . Assigned )
283- {
284- ProvisioningRegistrationSubstatusType sub = ProvisioningRegistrationSubstatusType . InitialAssignment ;
285- if ( reg . substatus == "deviceDataMigrated" )
286- {
287- sub = ProvisioningRegistrationSubstatusType . DeviceDataMigrated ;
288- }
289- else if ( reg . substatus == "deviceDataReset" )
290- {
291- sub = ProvisioningRegistrationSubstatusType . DeviceDataReset ;
292- }
293-
294- _result = new ( reg . registrationId , reg . createdDateTimeUtc , reg . assignedHub , reg . deviceId , status , sub , string . Empty , reg . lastUpdatedDateTimeUtc , reg . errorCode , reg . errorMessage , reg . etag , opeStat . registrationState . payload ) ;
295- }
296- else
297- {
298- _result = new ( reg . registrationId , reg . createdDateTimeUtc , reg . assignedHub , reg . deviceId , status , string . Empty , reg . lastUpdatedDateTimeUtc , reg . errorCode , reg . errorMessage , reg . etag ) ;
299- }
313+ _message = message ;
314+ _statusLast = _status ;
300315 }
301316 else if ( ! _isMessageProcessed )
302317 {
@@ -346,7 +361,7 @@ private ProvisioningRegistrationStatusType AssignStatus(string status)
346361 /// <inheritdoc/>
347362 public void Dispose ( )
348363 {
349- if ( _isDisposed )
364+ if ( _isDisposed )
350365 {
351366 return ;
352367 }
0 commit comments