José Simões
Published © MIT

Getting Location and Time with SIM800H and nanoFramework

Sample showing how to initialize Eclo Solutions SIM800H module and read location and time in C# using nanoFramework.

BeginnerProtip30 minutes356
Getting Location and Time with SIM800H and nanoFramework

Things used in this project


Read more


Source code

using Eclo.nF.SIM800H;
using System;
using System.Threading;
using Windows.Devices.Gpio;
using Windows.Devices.SerialCommunication;

namespace SIM800HSamples
    public class Program
        private const string APNConfigString = "<replace-with-apn-name>|<replace-with-apn-user>|<replace-with-apn-password>";

        public static void Main()

            // loop forever and output available RAM each 5 seconds
            while (true)

                // output signal RSSI
                Console.WriteLine("Network signal strength is " + SIM800H.RetrieveSignalStrength().GetSignalStrengthDescription());

        static void InitializeSIM800H()
            // initialization of the module is very simple 
            // we just need to pass a serial port and an output signal to control the "power key" signal

            // SIM800H serial device
            SerialDevice sim800SerialDevice = SerialDevice.FromId("COM2");

            // SIM800H signal for "power key"
            GpioPin sim800PowerKey = GpioController.GetDefault().OpenPin(0 * 1 + 10, GpioSharingMode.Exclusive);

            Console.WriteLine("... Configuring SIM800H ...");

            // configure SIM800H device
            SIM800H.Configure(sim800PowerKey, ref sim800SerialDevice);

            // add event handler to be aware of network registration status changes
            SIM800H.GsmNetworkRegistrationChanged += SIM800H_GsmNetworkRegistrationChanged;

            // add event handler to be aware of GPRS network registration status changes
            SIM800H.GprsNetworkRegistrationChanged += SIM800H_GprsNetworkRegistrationChanged;

            // it's wise to set this event handler to get the warning conditions from the module in case of under-voltage, over temperature, etc.
            SIM800H.WarningConditionTriggered += SIM800H_WarningConditionTriggered;

            // because we need Internet connection the access point configuration (APN) is mandatory
            // the configuration depends on what your network operator requires
            // it may be just the access point name or it may require an user and password too
            // AccessPointConfiguration class provides a number of convenient options to create a new APN configuration
            SIM800H.AccessPointConfiguration = AccessPointConfiguration.Parse(APNConfigString);

            // async call to power on module 
            // in this example we are setting up a callback on a separate method
            Console.WriteLine("... Power on sequence started ...");

        private static void PowerOnCompleted(IAsyncResult result)
            // check result
            if (((PowerOnAsyncResult)result).Result == PowerStatus.On)
                Console.WriteLine("... Power on sequence completed...");
                // something went wrong...
                Console.WriteLine("### Power on sequence FAILED ###");

        private static void SIM800H_GsmNetworkRegistrationChanged(NetworkRegistrationState networkState)

        private static void SIM800H_GprsNetworkRegistrationChanged(NetworkRegistrationState networkState)

            if (networkState == NetworkRegistrationState.Registered)
                // SIM800H is registered with GPRS network so we can request an Internet connection now

                // add event handler to know when we have an active Internet connection 
                // remove it first so we don't have duplicate calls in case a new successful registration occurs 
                SIM800H.GprsProvider.GprsIpAppsBearerStateChanged -= GprsProvider_GprsIpAppsBearerStateChanged;
                SIM800H.GprsProvider.GprsIpAppsBearerStateChanged += GprsProvider_GprsIpAppsBearerStateChanged;

                // async call to GPRS provider to open the GPRS bearer
                // we can set a callback here to get the result of that request and act accordingly
                // or we can manage this in the GprsIpAppsBearerStateChanged event handler that we've already setup during the configuration

        private static void GprsProvider_GprsIpAppsBearerStateChanged(bool isOpen)
            if (isOpen)
                // launch a new thread to get time and location from network
                new Thread(() =>

                    LocationAndTime lt = SIM800H.GetTimeAndLocation();

                    if (lt.ErrorCode == 0)
                        // request successfull
                        Console.WriteLine("Network time " + lt.DateTime.ToString() + " GMT");
                        Console.WriteLine("Location" + lt.Latitude.ToString() + "~" + lt.Longitude.ToString() + "&lvl=17&sty=r&encType=1");
                        // failed to retrieve time and location from network
                        Console.WriteLine("### Failed to retrieve time and location from network. Error code: " + lt.ErrorCode.ToString() + " ###");


        private static void SIM800H_WarningConditionTriggered(WarningCondition warningCondition)
            // get friendly string for this warning condition

Samples repo


José Simões

José Simões

9 projects • 11 followers
Founder of Eclo Solutions, hardware, software and embedded system enthusiast. Co-founder of the nanoFramework project.