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-04-08
Revision:
2:b77151f111a9
Parent:
0:4e3cb26f6019
Child:
4:90ab1ec64b0e

File content as of revision 2:b77151f111a9:

/*
  main.cpp
  2013 Copyright (c) Seeed Technology Inc.  All right reserved.

  Author:lawliet zou(lawliet.zou@gmail.com)
  2014-02-18

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

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

C027 c027;


int main(void)
{
    int ret;
    char buf[512] = "";

    Serial pc(USBTX,USBRX);
    pc.baud(115200);
    
    printf("Modem Example\n");

    c027.mdmPower(true);
    wait(2);

#if 0
    c027.gpsPower(true);
    GPSI2C gps; // use GPSI2C or GPSSerial class 
    while (1)
    {
        while ((ret = gps.getMessage(buf, sizeof(buf))) > 0)
        {
            int len = LENGTH(ret);
            //printf("NMEA: %.*s\n", len-2, msg); 
            if ((PROTOCOL(ret) == 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')
                {
                    printf("GPS: %.5f %.5f\n", la, lo); 
                }
            }
        }
        wait_ms(100);
    }
#endif    

    MDMSerial mdm(MDMTXD, MDMRXD, MDMBAUD
#if DEVICE_SERIAL_FC
                 ,MDMRTS,MDMCTS
#endif
                );
                
    // initialize the modem 
    printf("Init\r\n");
    mdm.init();
    
    // wait until we are connected
    printf("Network Check\r\n");
    while (!mdm.checkNetStatus())
        wait_ms(1000);

    printf("Network Join\r\n");
    // join the internet connection 
    if (mdm.join("gprs.swisscom.ch"))
    {
        printf("Socket Create\r\n");
        int socket = mdm.socketSocket(MDMParser::IPPROTO_TCP);
        if (socket >= 0)
        {
            printf("Socket Connect\r\n");
            if (mdm.socketConnect(socket, "mbed.org", 80))
            {
                printf("Make a Http Post Request\r\n");
                const char http[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\r\n\r\n";
                printf("Socket Send\r\n");
                mdm.socketSend(socket, http, sizeof(http)-1);
            
                printf("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)
                        printf("Socket Recv \"%*s\"\r\n", ret, buf);
                }
                printf("Socket Close\r\n");
                mdm.socketClose(socket);
            }
            printf("Socket Free\r\n");
            mdm.socketFree(socket);
        }
        
        // disconnect  
        printf("Network Disconnect\r\n");
        mdm.disconnect();
    }
    
    const char* ussd = "*#134#";
    printf("Send Ussd Command %s\r\n", ussd);
    ret = mdm.ussdCommand(ussd, buf, sizeof(buf));
    if (ret > 0) 
        printf("Got Ussd Answer: \"%*s\"\r\n", ret, buf);
        
    printf("Checking SMS\r\n");
    //int cnt = mdm.smsCount();
    while (1) {
        char num[32];
        for (int ix = 0; ix < 16; ix ++) {
            if (mdm.smsRead(ix, num, buf, sizeof(buf))) {
                printf("Got SMS from \"%s\" with text \"%s\"\r\n", num, buf);
                printf("Delete SMS at index %d\r\n", ix);
                mdm.smsDelete(ix);
                const char* reply = "Hello my friend";
                printf("Send SMS reply \"%s\" to \"%s\"\r\n", reply, num);
                mdm.smsSend(num, reply);
            }
        }
        MDMParser::Status info;
        if (mdm.checkNetStatus(&info))
        {
            printf("Network Status:\n");
            const char* txtNet[] = { "Unknown", "Denied", "None", "Home", "Roaming" };
            if (info.net < sizeof(txtNet)/sizeof(*txtNet) && (info.net != MDMParser::NET_UNKNOWN))
                printf("  Network:            %s\n", txtNet[info.net]);
            const char* txtAct[] = { "Unknown", "GSM", "Edge", "3G", "CDMA" };
            if (info.act < sizeof(txtAct)/sizeof(*txtAct) && (info.act != MDMParser::ACT_UNKNOWN))
                printf("  Access Technology:  %s\n", txtAct[info.act]);
            if (info.rssi) 
                printf("  Signal Strength:    %d dBm\r\n", info.rssi);
            if (info.opr)  
                printf("  Operator:           %s\n", info.opr);
            if (info.num)  
                printf("  Phone Number:       %s\n", info.num);
        }
        wait_ms(10000);
    }  
    
    mdm.powerOff();
    // now it is safe to switch off
    c027.mdmPower(false);
    
    return 0;
}