C027_Support library test

Dependencies:   C027_Support

Dependents:   C027_SupportTest_xively_location software_test_v1

Fork of Seeed_GPRS_Library_HelloWorld by wei zou

When running this example make sure you have:

  • edited the SIM PIN, APN, USER and PASSWORD for you network operator
  • have inserted a SIM card with enough credits
  • the antennas connected
  • have good reception (especially for GPS)
  • installed the mbed CDC drivers if you run windows
  • connected a terminal program, such as teraterm

The example will connect the modem to the network and attach it. I will place a post request to download a file from mbed website. It will do a USSD request and finally wait for incoming SMS. It will try to answer your SMS (try asking "where are you").

You should see a similar output in your preferred console program:

C027 Support Example
Device Init
Device Status:
  Device:       SARA-G350
  Power Save:   Active
  SIM:          Ready
  CCID:         xxxxxxxxxxxxxxxxxxxxxxxxxxx
  IMEI:         xxxxxxxxxxxxxxxxxxx
  IMSI:         xxxxxxxxxxxxxxxxxxx
  Manufacturer: u-blox
  Model:        SARA-G350
  Version:      08.49
Network Check
Network Status:
  Registration:       Home
  Signal Strength:    -87 dBm
  Operator:           Swisscom
  Phone Number:       +41xxxxxxxxxxx
Network Join
  IP Address: xx.xx.xx.xx
Socket Create
Socket Connect
Make a Http Post Request
Socket Send
Socket Recving
Socket 0: 337 bytes pending
Socket 0: 145 bytes pending
Socket 0: closed by remote host
Socket Recv "HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Thu, 10 Apr 2014 13:09:02 GMT
Content-Type: text/plain
Connection: close
Last-Modified: Fri, 27 Jul 2012 13:30:34 GMT
Cache-Control: max-age=36000
Expires: Thu, 10 Apr 2014 20:43:53 GMT
Vary: Accept-Encoding
X-Mystery-Header: 260358892
X-be: web0_prod_sjc
Age: 8709

Hello world!
"
Socket Close
Socket Free
Network Disconnect
Send Ussd Command *#134#
Got Ussd Answer: "UNKNOWN APPLICATION"
Checking SMS and GPS
GPS Location: 47.28xxx 8.56xxx
GPS Location: 47.28xxx 8.56xxx
...
GPS Location: 47.28xxx 8.56xxx
GPS Location: 47.28xxx 8.56xxx
Network Status:
  Registration:       Home
  Signal Strength:    -89 dBm
  Operator:           Swisscom
  Phone Number:       +41xxxxxxxxx
GPS Location: 47.28xxx 8.56xxx
GPS Location: 47.28xxx 8.56xxx
...

main.cpp

Committer:
mazgch
Date:
2014-05-15
Revision:
18:50e6c4ed8a4a
Parent:
17:c293780a40ac
Child:
19:f022ff746eb8

File content as of revision 18:50e6c4ed8a4a:

#include "mbed.h"
#include "GPS.h"
#include "MDM.h"

//----------------------------------------------------------------------
// You may need to configure these parameters

/** Set your secret SIM pin here "1234"
*/
#define SIMPIN      NULL

/** The APN of your network operator, sometimes it is "internet" 
    check your contract with the network operator
*/
#define APN         "gprs.swisscom.ch"

/** Set the user name for your APN, or NULL if not needed
*/
#define USERNAME    NULL

/** Set the password for your APN, or NULL if not needed
*/
#define PASSWORD    NULL 

//----------------------------------------------------------------------
/* This example was tested on C027-U20 and C027-G35 with the on board modem. 
   
   Additionally it was tested with a shield where the SARA-G350/U260/U270 RX/TX/PWRON 
   is connected to D0/D1/D4 and the GPS SCL/SDA is connected D15/D15. In this 
   configuration the following platforms were tested (it is likely that others 
   will work as well)
   - U-BLOX:    C027-G35, C027-U20, C027-C20 (for shield remove define C027_USEONBOARD)
   - NXP:       LPC1549v2, LPC4088qsb
   - Freescale: FRDM-KL05Z, FRDM-KL25Z, FRDM-KL46Z, FRDM-K64F
   - STM:       NUCLEO-F401RE, NUCLEO-F030R8
                mount resistors SB13/14 1k, SB62/63 0R
*/
#if defined(TARGET_UBLOX_C027)
  #define C027_USEONBOARD // remove if you have the GSM/GPS shield mounted to the C027
#endif

#ifdef C027_USEONBOARD
  #include "C027.h"
  C027 c027;
#else 
  #define GPSSCL    D15
  #define GPSSDA    D14
  #define GPSADR   (66<<1) // GPS I2C Address
  #define MDMPWRON  D4
  #define MDMTXD    D1
  #define MDMRXD    D0
  #define MDMCTS    NC
  #define MDMRTS    NC
  #define MDMBAUD   115200
#endif

//----------------------------------------------------------------------
// no tracing if serial is shared with the VCP
#define DOTRACE ((USBRX!=MDMRXD)&&(USBTX!=MDMTXD))
#define TRACE     (!DOTRACE)?:printf

int main(void)
{
    int ret;
#ifdef TARGET_LPC1768
    char buf[2048] = "";
#else
    char buf[512] = "";
#endif

    // only trace if the serial is different from our modem port
    if (DOTRACE) {
        Serial pc(USBTX,USBRX);
        pc.baud(115200);
    }
    
    wait_ms(1000);
    
    TRACE("GSM/GPS Support Example\r\n");
    
#ifdef C027_USEONBOARD
    // turn on the supplies of the Modem and the GPS
    c027.mdmPower(true);
    c027.gpsPower(true);
#else
    // turn on the Modem
    DigitalOut mdmPwrOn(MDMPWRON, 0);
    wait_ms(150);
    mdmPwrOn = 1;
#endif
    wait(2);
    
    // Create the GPS object
#if GPSADR    // use GPSI2C class
    GPSI2C gps(GPSSDA,GPSSCL,GPSADR); 
#elif GPSBAUD // or GPSSerial class 
    GPSSerial gps(GPSTXD,GPSRXD,GPSBAUD); 
#else
    #warning "please define the pins for the GPS"
#endif
    
    // Create the modem object
    MDMSerial mdm(MDMTXD,MDMRXD,MDMBAUD
#if DEVICE_SERIAL_FC
                ,MDMRTS,MDMCTS
#endif
                );
    
    // initialize the modem 
    TRACE("Device Init\r\n");
    MDMParser::DevStatus devStatus;
    MDMParser::NetStatus netStatus;
    bool mdmOk = mdm.init(SIMPIN, &devStatus);
    if (mdmOk)
    {
        if (DOTRACE) mdm.dumpDevStatus(&devStatus);
        
        // wait until we are connected
        TRACE("Network Check\r\n");
        while (!mdm.checkNetStatus(&netStatus))
            wait_ms(1000);
    
        if (DOTRACE) mdm.dumpNetStatus(&netStatus);
        TRACE("Network Join\r\n");
        // join the internet connection 
        MDMParser::IP ip = 
            mdm.join(APN,USERNAME,PASSWORD);
        if (ip != NOIP)
        {
            if (DOTRACE) mdm.dumpIp(ip);
            TRACE("Socket Create\r\n");
            int socket = mdm.socketSocket(MDMParser::IPPROTO_TCP);
            if (socket >= 0)
            {
                TRACE("Socket Connect\r\n");
                mdm.socketSetBlocking(socket, 10000);
                if (mdm.socketConnect(socket, "mbed.org", 80))
                {
                    TRACE("Make a Http Post Request\r\n");
                    const char http[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\r\n\r\n";
                    TRACE("Socket Send\r\n");
                    mdm.socketSend(socket, http, sizeof(http)-1);
                
                    TRACE("Socket Recving\r\n");
                    while (true) {
                        ret = mdm.socketReadable(socket);
                        if (ret > 0)
                            ret = mdm.socketRecv(socket, buf, sizeof(buf)-1);
                        if (ret < 0)
                            break;
                        else if (ret > 0)
                            TRACE("Socket Recv \"%*s\"\r\n", ret, buf);
                    }
                    TRACE("Socket Close\r\n");
                    mdm.socketClose(socket);
                }
                TRACE("Socket Free\r\n");
                mdm.socketFree(socket);
            }
            
            int port = 7;
            const char* host = "echo.u-blox.com";
            MDMParser::IP ip = mdm.gethostbyname(host);
            char data[] = "\r\nxxx Socket Hello World\r\n"
#ifdef TARGET_LPC1768
                        "00  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "01  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "02  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "03  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "04  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        
                        "05  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "06  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "07  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "08  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "09  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
            
                        "10  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "11  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "12  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "13  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "14  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        
                        "15  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "16  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "17  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "18  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
                        "19  0123456789 0123456789 0123456789 0123456789 0123456789 \r\n"
#endif            
                        "End\r\n";
                
            TRACE("Testing TCP sockets with ECHO server\r\n");
            socket = mdm.socketSocket(MDMParser::IPPROTO_TCP);
            if (socket >= 0)
            {
                mdm.socketSetBlocking(socket, 10000);
                if (mdm.socketConnect(socket, host, port)) {
                    memcpy(data, "\r\nTCP", 5); 
                    ret = mdm.socketSend(socket, data, sizeof(data)-1);
                    if (ret == sizeof(data)-1) {
                        TRACE("Socket Send %d \"%s\"\r\n", ret, data);
                    }
                    ret = mdm.socketRecv(socket, buf, sizeof(buf)-1);
                    if (ret >= 0) {
                        TRACE("Socket Recv %d \"%.*s\"\r\n", ret, ret, buf);
                    }
                    mdm.socketClose(socket);
                }
                mdm.socketFree(socket);
            }

            TRACE("Testing UDP sockets with ECHO server\r\n");
            socket = mdm.socketSocket(MDMParser::IPPROTO_UDP, port);
            if (socket >= 0)
            {
                mdm.socketSetBlocking(socket, 10000);
                memcpy(data, "\r\nUDP", 5); 
                ret = mdm.socketSendTo(socket, ip, port, data, sizeof(data)-1);
                if (ret == sizeof(data)-1) {
                    TRACE("Socket SendTo %s:%d " IPSTR " %d \"%s\"\r\n", host, port, IPNUM(ip), ret, data);
                }
                ret = mdm.socketRecvFrom(socket, &ip, &port, buf, sizeof(buf)-1);
                if (ret >= 0) {
                    TRACE("Socket RecvFrom " IPSTR ":%d %d \"%.*s\" \r\n", IPNUM(ip),port, ret, ret,buf);
                }
                mdm.socketFree(socket);
            }
            
            // disconnect  
            TRACE("Network Disconnect\r\n");
            mdm.disconnect();
        }
        
        const char* ussd = "*#134#"; // You may get answer "UNKNOWN APPLICATION"
        TRACE("Send Ussd Command %s\r\n", ussd);
        ret = mdm.ussdCommand(ussd, buf);
        if (ret > 0) 
            TRACE("Got Ussd Answer: \"%*s\"\r\n", ret, buf);
    }
    TRACE("Checking SMS and GPS\r\n");
    char link[128] = "";
    unsigned int i = 0xFFFFFFFF;
    const int wait = 100;
    bool abort = false;
    //DigitalOut led(LED1);
    while (!abort) {
    //    led = !led;        
        while ((ret = gps.getMessage(buf, sizeof(buf))) > 0)
        {
            int len = LENGTH(ret);
            //TRACE("NMEA: %.*s\r\n", len-2, msg); 
            if ((PROTOCOL(ret) == GPSParser::NMEA) && (len > 6) && !strncmp("$GPGLL", buf, 6))
            {
                double la = 0, lo = 0;
                char ch;
                if (gps.getNmeaAngle(1,buf,len,la) && 
                    gps.getNmeaAngle(3,buf,len,lo) && 
                    gps.getNmeaItem(6,buf,len,ch) && ch == 'A')
                {
                    TRACE("GPS Location: %.5f %.5f\r\n", la, lo); 
                    sprintf(link, "I am here!\n"
                                  "https://maps.google.com/?q=%.5f,%.5f", la, lo); 
                }
            }
        }
        if (mdmOk && (i++ == 10000/wait)) {
            i = 0;
            // check the network status
            if (mdm.checkNetStatus(&netStatus)) {
                if (DOTRACE) mdm.dumpNetStatus(&netStatus);
            }
                
            // checking unread sms
            int ix[8];
            int n = mdm.smsList("REC UNREAD", ix, 8);
            if (8 < n) n = 8;
            while (0 < n--)
            {
                char num[32];
                TRACE("Unread SMS at index %d\r\n", ix[n]);
                if (mdm.smsRead(ix[n], num, buf, sizeof(buf))) {
                    TRACE("Got SMS from \"%s\" with text \"%s\"\r\n", num, buf);
                    TRACE("Delete SMS at index %d\r\n", ix[n]);
                    mdm.smsDelete(ix[n]);
                    // provide a reply
                    const char* reply = "Hello my friend";
                    if (strstr(buf, /*w*/"here are you"))
                        reply = *link ? link : "I don't know"; // reply wil location link
                    TRACE("Send SMS reply \"%s\" to \"%s\"\r\n", reply, num);
                    mdm.smsSend(num, reply);
                }
            }
        }
        wait_ms(wait);
    }
    mdm.powerOff();
    gps.powerOff();
    TRACE("Shutdown\r\n");
#ifdef C027_USEONBOARD
    // now it is safe to switch LDOs off
    c027.mdmPower(false);
    c027.gpsPower(false);
#endif    
    return 0;
}