C027_Support library test
Dependencies: C027_Support
Dependents: C027_SupportTest_xively_location software_test_v1
Fork of Seeed_GPRS_Library_HelloWorld by
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-06-06
- Revision:
- 21:a090a5043e23
- Parent:
- 20:52f0e5de8c3d
- Child:
- 22:078f410ef2c7
File content as of revision 21:a090a5043e23:
#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 //! 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 //------------------------------------------------------------------------------------ int main(void) { int ret; #ifdef LARGE_DATA char buf[2048] = ""; #else char buf[512] = ""; #endif // 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) 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 (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(); } } 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); } } 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; }