Hardware components | ||||||
![]() |
| × | 1 | |||
Software apps and online services | ||||||
![]() |
| |||||
![]() |
|
Using a GPRS module with AT commands can be a bit tricky, specially with the initializations and configurations. The nanoFramework driver "hides" all that from the developer allowing him to focus on the task at hand. In this sample we are using the modem API to get the current location and also the date/time from the network.
For the code sample to work, you need to replace the placeholder there with the details of your service provider APN details.
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()
{
InitializeSIM800H();
// loop forever and output available RAM each 5 seconds
while (true)
{
Thread.Sleep(5000);
// 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);
sim800PowerKey.SetDriveMode(GpioPinDriveMode.Output);
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
SIM800H.PowerOnAsync(PowerOnCompleted);
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...");
}
else
{
// something went wrong...
Console.WriteLine("### Power on sequence FAILED ###");
}
}
private static void SIM800H_GsmNetworkRegistrationChanged(NetworkRegistrationState networkState)
{
Console.WriteLine(networkState.GetDescription("GSM"));
}
private static void SIM800H_GprsNetworkRegistrationChanged(NetworkRegistrationState networkState)
{
Console.WriteLine(networkState.GetDescription("GPRS"));
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
SIM800H.GprsProvider.OpenBearerAsync(BearerProfile.IpAppsBearer);
}
}
private static void GprsProvider_GprsIpAppsBearerStateChanged(bool isOpen)
{
if (isOpen)
{
// launch a new thread to get time and location from network
new Thread(() =>
{
Thread.Sleep(1000);
LocationAndTime lt = SIM800H.GetTimeAndLocation();
if (lt.ErrorCode == 0)
{
// request successfull
Console.WriteLine("Network time " + lt.DateTime.ToString() + " GMT");
Console.WriteLine("Location http://www.bing.com/maps/?v=2&form=LMLTSN&cp=" + lt.Latitude.ToString() + "~" + lt.Longitude.ToString() + "&lvl=17&sty=r&encType=1");
}
else
{
// failed to retrieve time and location from network
Console.WriteLine("### Failed to retrieve time and location from network. Error code: " + lt.ErrorCode.ToString() + " ###");
}
}).Start();
}
}
private static void SIM800H_WarningConditionTriggered(WarningCondition warningCondition)
{
// get friendly string for this warning condition
Console.WriteLine(SamplesExtensions.GetWarningDescription(warningCondition));
}
}
}
9 projects • 16 followers
Founder of Eclo Solutions, hardware, software and embedded system enthusiast. Co-founder of the nanoFramework project.
Comments
Please log in or sign up to comment.