mbed determines its location using a web-based geolocation API that uses the IP address and displays it on the LCD. Timezone is also included. A free API key must be inserted in the URL. See http://mbed.org/users/4180_1/notebook/geolocation-lcd-display/

Dependencies:   NetServices TextLCD mbed HTTPClient_ToBeRemoved

Committer:
4180_1
Date:
Sun Apr 29 01:23:17 2012 +0000
Revision:
0:14edcbab30cc

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
4180_1 0:14edcbab30cc 1 #include "mbed.h"
4180_1 0:14edcbab30cc 2 #include "EthernetNetIf.h"
4180_1 0:14edcbab30cc 3 #include "HTTPClient.h"
4180_1 0:14edcbab30cc 4 #include "TextLCD.h"
4180_1 0:14edcbab30cc 5 //Geolocation using IP address - get web page with location data
4180_1 0:14edcbab30cc 6 // displays location fields on LCD from web page ";....location text...;"
4180_1 0:14edcbab30cc 7 // see http://mbed.org/users/4180_1/notebook/geolocation-lcd-display/
4180_1 0:14edcbab30cc 8 TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d0-d3
4180_1 0:14edcbab30cc 9 EthernetNetIf eth;
4180_1 0:14edcbab30cc 10 HTTPClient http;
4180_1 0:14edcbab30cc 11
4180_1 0:14edcbab30cc 12 void parse(char buffer[], int *j, char *string) {
4180_1 0:14edcbab30cc 13 //extracts next location string data item from buffer
4180_1 0:14edcbab30cc 14 int i=0;
4180_1 0:14edcbab30cc 15 for (i=0; i<=strlen(buffer); i++) {
4180_1 0:14edcbab30cc 16 if ((buffer[*j+i] == ';')||(buffer[*j+i] == '\0' )) {
4180_1 0:14edcbab30cc 17 //semicolon is the string field delimiter
4180_1 0:14edcbab30cc 18 string[i]=0;
4180_1 0:14edcbab30cc 19 *j=*j+i+1;
4180_1 0:14edcbab30cc 20 break;
4180_1 0:14edcbab30cc 21 } else string[i]=buffer[*j+i];
4180_1 0:14edcbab30cc 22 }
4180_1 0:14edcbab30cc 23 }
4180_1 0:14edcbab30cc 24
4180_1 0:14edcbab30cc 25 int main() {
4180_1 0:14edcbab30cc 26 char result [4]={0};
4180_1 0:14edcbab30cc 27 char ip [17]={0};
4180_1 0:14edcbab30cc 28 char country_abbr[10]={0};
4180_1 0:14edcbab30cc 29 char country[60]={0};
4180_1 0:14edcbab30cc 30 char region[40]={0};
4180_1 0:14edcbab30cc 31 char city[60]={0};
4180_1 0:14edcbab30cc 32 char zipcode[10]={0};
4180_1 0:14edcbab30cc 33 char latitude[10]={0};
4180_1 0:14edcbab30cc 34 char longitude[10]={0};
4180_1 0:14edcbab30cc 35 char timezone[7]={0};
4180_1 0:14edcbab30cc 36 char buffer[256]={0};
4180_1 0:14edcbab30cc 37 float flatitude=0.0;
4180_1 0:14edcbab30cc 38 float flongitude=0.0;
4180_1 0:14edcbab30cc 39 float ftimezone=0.0;
4180_1 0:14edcbab30cc 40 int j=0;
4180_1 0:14edcbab30cc 41
4180_1 0:14edcbab30cc 42 //Setup network - get IP address using DHCP
4180_1 0:14edcbab30cc 43 lcd.cls();
4180_1 0:14edcbab30cc 44 lcd.printf("Net setup\n");
4180_1 0:14edcbab30cc 45 EthernetErr ethErr = eth.setup();
4180_1 0:14edcbab30cc 46 if (ethErr) {
4180_1 0:14edcbab30cc 47 lcd.printf("Error %d", ethErr);
4180_1 0:14edcbab30cc 48 return -1;
4180_1 0:14edcbab30cc 49 }
4180_1 0:14edcbab30cc 50 lcd.printf(" Net OK");
4180_1 0:14edcbab30cc 51 wait(.5);
4180_1 0:14edcbab30cc 52 lcd.cls();
4180_1 0:14edcbab30cc 53 lcd.printf("IP Address\nGeolocation API");
4180_1 0:14edcbab30cc 54 HTTPText txt;
4180_1 0:14edcbab30cc 55 //iPinfoDB API - get web page with location data
4180_1 0:14edcbab30cc 56 //Insert your free key from www.ipinfo.com for the API in the URL below
4180_1 0:14edcbab30cc 57 HTTPResult r = http.get("http://api.ipinfodb.com/v3/ip-city/?key=PUT_YOUR_API_KEY_HERE", &txt);
4180_1 0:14edcbab30cc 58 if (r==HTTP_OK) {
4180_1 0:14edcbab30cc 59 //got web page text data OK
4180_1 0:14edcbab30cc 60 strcpy(buffer,txt.gets());
4180_1 0:14edcbab30cc 61 wait(1);
4180_1 0:14edcbab30cc 62 while (1) {
4180_1 0:14edcbab30cc 63 j=0;
4180_1 0:14edcbab30cc 64 //parse and display each of the API's location information strings on the LCD
4180_1 0:14edcbab30cc 65 parse(buffer, &j, result);
4180_1 0:14edcbab30cc 66 lcd.cls();
4180_1 0:14edcbab30cc 67 lcd.printf("result: %s\n", result);
4180_1 0:14edcbab30cc 68 if (result[0]!='O') { //needs valid key
4180_1 0:14edcbab30cc 69 wait(1);
4180_1 0:14edcbab30cc 70 lcd.cls();
4180_1 0:14edcbab30cc 71 lcd.printf("Get Free API key");
4180_1 0:14edcbab30cc 72 lcd.printf("www.iPinfoDB.com");
4180_1 0:14edcbab30cc 73 return(-1);
4180_1 0:14edcbab30cc 74 }
4180_1 0:14edcbab30cc 75 wait(1);
4180_1 0:14edcbab30cc 76 j++;
4180_1 0:14edcbab30cc 77 parse(buffer, &j, ip);
4180_1 0:14edcbab30cc 78 lcd.cls();
4180_1 0:14edcbab30cc 79 lcd.printf("IP address: \n %s", ip);
4180_1 0:14edcbab30cc 80 wait(2);
4180_1 0:14edcbab30cc 81 parse(buffer, &j, country_abbr);
4180_1 0:14edcbab30cc 82 lcd.cls();
4180_1 0:14edcbab30cc 83 lcd.printf("Country code: \n %s", country_abbr);
4180_1 0:14edcbab30cc 84 wait(2);
4180_1 0:14edcbab30cc 85 parse(buffer, &j, country);
4180_1 0:14edcbab30cc 86 lcd.cls();
4180_1 0:14edcbab30cc 87 lcd.printf("Country: \n%s", country);
4180_1 0:14edcbab30cc 88 wait(2);
4180_1 0:14edcbab30cc 89 parse(buffer, &j, region);
4180_1 0:14edcbab30cc 90 lcd.cls();
4180_1 0:14edcbab30cc 91 lcd.printf("Region or State:%s", region);
4180_1 0:14edcbab30cc 92 wait(2);
4180_1 0:14edcbab30cc 93 parse(buffer, &j, city);
4180_1 0:14edcbab30cc 94 lcd.cls();
4180_1 0:14edcbab30cc 95 lcd.printf("City: \n%s", city);
4180_1 0:14edcbab30cc 96 wait(2);
4180_1 0:14edcbab30cc 97 parse(buffer, &j, zipcode);
4180_1 0:14edcbab30cc 98 lcd.cls();
4180_1 0:14edcbab30cc 99 lcd.printf("Zipcode: \n %s", zipcode);
4180_1 0:14edcbab30cc 100 wait(2);
4180_1 0:14edcbab30cc 101 parse(buffer, &j, latitude);
4180_1 0:14edcbab30cc 102 sscanf(latitude,"%f",&flatitude);
4180_1 0:14edcbab30cc 103 lcd.cls();
4180_1 0:14edcbab30cc 104 lcd.printf("Latitude: \n %f", flatitude);
4180_1 0:14edcbab30cc 105 wait(2);
4180_1 0:14edcbab30cc 106 parse(buffer, &j, longitude);
4180_1 0:14edcbab30cc 107 sscanf(longitude,"%f",&flongitude);
4180_1 0:14edcbab30cc 108 lcd.cls();
4180_1 0:14edcbab30cc 109 lcd.printf("Longitude: \n %f", flongitude);
4180_1 0:14edcbab30cc 110 wait(2);
4180_1 0:14edcbab30cc 111 parse(buffer, &j, timezone);
4180_1 0:14edcbab30cc 112 sscanf(timezone,"%f",&ftimezone);
4180_1 0:14edcbab30cc 113 lcd.cls();
4180_1 0:14edcbab30cc 114 lcd.printf("Timezone: \n %f", ftimezone);
4180_1 0:14edcbab30cc 115 wait(4);
4180_1 0:14edcbab30cc 116 }
4180_1 0:14edcbab30cc 117 } else {
4180_1 0:14edcbab30cc 118 lcd.cls();
4180_1 0:14edcbab30cc 119 lcd.printf("HTTP Error %d", r);
4180_1 0:14edcbab30cc 120 return -1;
4180_1 0:14edcbab30cc 121 }
4180_1 0:14edcbab30cc 122 }