static void UpdateRTCFromNetwork() { SIM800H.SntpClient.SyncNetworkTimeAsync("time.nist.gov", TimeSpan.Zero, (ar) => { // update RTC only if update was successful if (((SyncNetworkTimeAsyncResult)ar).Result == SyncResult.SyncSuccessful) { // get current date time and update RTC DateTime rtcValue = SIM800H.GetDateTime(); // set framework date time Utility.SetLocalTime(rtcValue); // done here, dispose SNTP client to free up memory SIM800H.SntpClient.Dispose(); SIM800H.SntpClient = null; new Thread(() => { Thread.Sleep(1000); // start doing the thing with IoT Hub... StartDeviceOperation(); }).Start(); } else { Debug.Print("### failed to get time from NTP server ###"); } }); }
static void UpdateRTCFromNetwork() { Console.WriteLine("... requesting time from NTP server ..."); ////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // the following code block uses an async call to SNTP client which should be OK for most of the use scenarios // check an alternative in the code block commented bellow SIM800H.SntpClient.SyncNetworkTimeAsync("pool.ntp.org", TimeSpan.Zero, (ar) => { // update RTC only if update was successful if (((SyncNetworkTimeAsyncResult)ar).Result == SyncResult.SyncSuccessful) { // get current date time and update RTC DateTime rtcValue = SIM800H.GetDateTime(); // set framework date time Rtc.SetSystemTime(rtcValue); Console.WriteLine("!!! new time from NTP server: " + rtcValue.ToString()); // done here, dispose SNTP client to free up memory SIM800H.SntpClient.Dispose(); SIM800H.SntpClient = null; } else { Console.WriteLine("### failed to get time from NTP server ###"); } }); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // if your network connection is not that good and you definitely need a valid RTC better do this inside a try/catch AND using a retry strategy // the implementation bellow uses a synchronous call to SNTP client // for the simplest async call see the //byte retryCounter = 0; //while (retryCounter <= 3) //{ // try // { // var result = SIM800H.SntpClient.SyncNetworkTimeAsync("time.nist.gov", TimeSpan.Zero).End(); // // check result // if (result == SyncResult.SyncSuccessful) // { // // get current date time and update RTC // DateTime rtcValue = SIM800H.GetDateTime(); // // set framework date time // Rtc.SetSystemTime(rtcValue); // Console.WriteLine("!!! new time from NTP server: " + rtcValue.ToString()); // // done here, dispose SNTP client to free up memory // SIM800H.SntpClient.Dispose(); // SIM800H.SntpClient = null; // return; // } // else // { // Console.WriteLine("### failed to get time from NTP server ###"); // } // } // catch // { // // failed updating RTC // // flag this // } // // add retry // retryCounter++; // // progressive wait 15*N seconds before next retry // Thread.Sleep(15000 * retryCounter); //} }