インターフェース2014年10月号のu-blox C027で3G通信する記事で使用したプログラム。   CQ publishing Interface 2014.10 issue, C027 3G test program.

Dependencies:   C027_Support C027_SupportTest mbed picojson

Fork of C027_SupportTest by u-blox

インターフェース2014年10月号のu-blox C027で3G通信する記事で使用したプログラムです。

main.cpp

Committer:
ntaka206
Date:
2014-07-17
Revision:
29:1f18e74ff972
Parent:
28:d504a106c124
Child:
30:e6c7827dfbe8

File content as of revision 29:1f18e74ff972:

#include "mbed.h"

//------------------------------------------------------------------------------------
/* 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 set define C027_FORCE_SHIELD)
   - 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
*/
#include "GPS.h"
#include "MDM.h"
//------------------------------------------------------------------------------------
// You need to configure these cellular modem / SIM parameters.
// These parameters are ignored for LISA-C200 variants and can be left NULL.
//------------------------------------------------------------------------------------
//! Set your secret SIM pin here (e.g. "1234"). Check your SIM manual.
#define SIMPIN      NULL
/*! The APN of your network operator SIM, sometimes it is "internet" check your 
    contract with the network operator. You can also try to look-up your settings in 
    google: https://www.google.de/search?q=APN+list */
//#define APN         NULL
#define APN         "3g-d-2.ocn.ne.jp"
//! Set the user name for your APN, or NULL if not needed
//#define USERNAME    NULL
#define USERNAME    "a743mcx2@one.ocn.ne.jp"
//! Set the password for your APN, or NULL if not needed
//#define PASSWORD    NULL 
#define PASSWORD    "nnku62"

//---- Xively --------------------------------------------------------------
#define XI_FEED_ID 1016719601 // set Xively Feed ID (numerical, no quoutes)
#define XI_API_KEY "Y1mN05SzFgxjwiB9xFj42KYaTzdhohBLaKN8a9juznDrGsvK" // set Xively API key (double-quoted string)

#include "xively.h"
#include "xi_err.h"

//------------------------------------------------------------------------------------

int main(void)
{
    int ret;
#ifdef LARGE_DATA
    char buf[2048] = "";
#else
    char buf[512] = "";
#endif
// ntaka
Serial pc(USBTX,USBRX);
pc.baud(115200);

    // Create the GPS object
#if 1   // use GPSI2C class
    GPSI2C gps;
#else   // or GPSSerial class 
    GPSSerial gps; 
#endif
    // Create the modem object
    MDMSerial mdm;
    //mdm.setDebug(4); // enable this for debugging issues 
    // initialize the modem 
    MDMParser::DevStatus devStatus = {};
    MDMParser::NetStatus netStatus = {};
    bool mdmOk = mdm.init(SIMPIN, &devStatus);
    mdm.dumpDevStatus(&devStatus);
    if (mdmOk) {
#if 0
        // file system API
        const char* filename = "File";
        char buf[] = "Hello World";
        printf("writeFile \"%s\"\r\n", buf);
        if (mdm.writeFile(filename, buf, sizeof(buf)))
        {
            memset(buf, 0, sizeof(buf));
            int len = mdm.readFile(filename, buf, sizeof(buf));
            if (len >= 0) 
                printf("readFile %d \"%.*s\"\r\n", len, len, buf);
            mdm.delFile(filename);
        }
#endif

        // wait until we are connected
        mdmOk = mdm.registerNet(&netStatus);
        mdm.dumpNetStatus(&netStatus);
    }
#if 1

    if (mdmOk)
    {
        // http://www.geckobeach.com/cellular/secrets/gsmcodes.php
        // http://de.wikipedia.org/wiki/USSD-Codes
        const char* ussd = "*130#"; // You may get answer "UNKNOWN APPLICATION"
        printf("Ussd Send Command %s\r\n", ussd);
        ret = mdm.ussdCommand(ussd, buf);
        if (ret > 0) 
            printf("Ussd Got Answer: \"%*s\"\r\n", ret, buf);

        // join the internet connection 
        MDMParser::IP ip = mdm.join(APN,USERNAME,PASSWORD);
        if (ip != NOIP)
        {
            mdm.dumpIp(ip);
            printf("Make a Http Post Request\r\n");
            int socket = mdm.socketSocket(MDMParser::IPPROTO_TCP);
            if (socket >= 0)
            {
                mdm.socketSetBlocking(socket, 10000);
                if (mdm.socketConnect(socket, "mbed.org", 80))
                {
                    const char http[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\r\n\r\n";
                    mdm.socketSend(socket, http, sizeof(http)-1);
                
                    ret = mdm.socketRecv(socket, buf, sizeof(buf)-1);
                    if (ret > 0)
                        printf("Socket Recv \"%*s\"\r\n", ret, buf);
                    mdm.socketClose(socket);
                }
                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 LARGE_DATA
                        "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";
                
            printf("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) {
                        printf("Socket Send %d \"%s\"\r\n", ret, data);
                    }
                    ret = mdm.socketRecv(socket, buf, sizeof(buf)-1);
                    if (ret >= 0) {
                        printf("Socket Recv %d \"%.*s\"\r\n", ret, ret, buf);
                    }
                    mdm.socketClose(socket);
                }
                mdm.socketFree(socket);
            }

            printf("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) {
                    printf("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) {
                    printf("Socket RecvFrom " IPSTR ":%d %d \"%.*s\" \r\n", IPNUM(ip),port, ret, ret,buf);
                }
                mdm.socketFree(socket);
            }
            
            // disconnect  
            mdm.disconnect();
        }
    }
#endif
#if 0
    EthernetInterface eth;
    
    int s = eth.init(); //Use DHCP
    if( s != NULL ) {
        printf( "Could not initialise. Will halt!\n" );        
        exit( 0 );
    }    
        
    s = eth.connect();
    if( s != NULL ) {
        printf( "Could not connect. Will halt!\n" );
        exit( 0 );
    } else {
        printf( "IP: %s\n", eth.getIPAddress() );    
    }
#endif

// Xively
    xi_feed_t feed;
    memset( &feed, NULL, sizeof( xi_feed_t ) );
    
    feed.feed_id = XI_FEED_ID;
    feed.datastream_count = 2;

    feed.datastreams[0].datapoint_count = 1;
    xi_datastream_t* lat_datastream = &feed.datastreams[0];
    strcpy( lat_datastream->datastream_id, "lat" );
    xi_datapoint_t* current_lat = &lat_datastream->datapoints[0];

    feed.datastreams[1].datapoint_count = 1;
    xi_datastream_t* lon_datastream = &feed.datastreams[1];
    strcpy( lon_datastream->datastream_id, "lon" );
    xi_datapoint_t* current_lon = &lon_datastream->datapoints[0];
    
    // create the cosm library context
    xi_context_t* xi_context
        = xi_create_context( XI_HTTP, XI_API_KEY, feed.feed_id );

    // check if everything works
    if( xi_context == NULL )
    {
        printf("xi_context NULL!\n");
        return -1;
    }

    printf("SMS and GPS Loop\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);
            //printf("NMEA: %.*s\r\n", len-2, msg); 
            if ((PROTOCOL(ret) == GPSParser::NMEA) && (len > 6))
            {
                if (!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 Location: %.5f %.5f\r\n", la, lo); 
                        sprintf(link, "I am here!\n"
                                      "https://maps.google.com/?q=%.5f,%.5f", la, lo); 
                        // Xively
                        xi_set_value_f32( current_lat, la );
                        xi_set_value_f32( current_lon, lo );
                        xi_feed_update( xi_context, &feed );

                    }
                } else if (!strncmp("$GPGGA", buf, 6)) {
                    double a = 0; 
                    if (gps.getNmeaItem(9,buf,len,a)) // altitude msl [m]
                        printf("GPS Altitude: %.1f\r\n", a); 
                } else if (!strncmp("$GPVTG", buf, 6)) {
                    double s = 0; 
                    if (gps.getNmeaItem(7,buf,len,s)) // speed [km/h]
                        printf("GPS Speed: %.1f\r\n", s); 
                }
            }
        }
        if (mdmOk && (i++ == 5000/wait)) {
            i = 0;
            // check the network status
            if (mdm.checkNetStatus(&netStatus)) {
                mdm.dumpNetStatus(&netStatus, fprintf, stdout);
            }
                
            // 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];
                printf("Unread SMS at index %d\r\n", ix[n]);
                if (mdm.smsRead(ix[n], 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[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
                    else if (strstr(buf, /*s*/"hutdown"))
                        abort = true, reply = "bye bye";
                    printf("Send SMS reply \"%s\" to \"%s\"\r\n", reply, num);
                    mdm.smsSend(num, reply);
                }
            }
        }
        wait_ms(wait);
    }
    gps.powerOff();
    mdm.powerOff();
    return 0;
}