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

main.cpp

Committer:
4180_1
Date:
2012-04-29
Revision:
0:14edcbab30cc

File content as of revision 0:14edcbab30cc:

#include "mbed.h"
#include "EthernetNetIf.h"
#include "HTTPClient.h"
#include "TextLCD.h"
//Geolocation using IP address - get web page with location data
// displays location fields on LCD  from web page ";....location text...;"
// see http://mbed.org/users/4180_1/notebook/geolocation-lcd-display/
TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d0-d3
EthernetNetIf eth;
HTTPClient http;

void parse(char buffer[], int *j, char *string) {
//extracts next location string data item from buffer
    int i=0;
    for (i=0; i<=strlen(buffer); i++) {
        if ((buffer[*j+i] == ';')||(buffer[*j+i] == '\0' )) {
            //semicolon is the string field delimiter
            string[i]=0;
            *j=*j+i+1;
            break;
        } else string[i]=buffer[*j+i];
    }
}

int main() {
    char result [4]={0};
    char ip [17]={0};
    char country_abbr[10]={0};
    char country[60]={0};
    char region[40]={0};
    char city[60]={0};
    char zipcode[10]={0};
    char latitude[10]={0};
    char longitude[10]={0};
    char timezone[7]={0};
    char buffer[256]={0};
    float flatitude=0.0;
    float flongitude=0.0;
    float ftimezone=0.0;
    int j=0;

    //Setup network - get IP address using DHCP
    lcd.cls();
    lcd.printf("Net setup\n");
    EthernetErr ethErr = eth.setup();
    if (ethErr) {
        lcd.printf("Error %d", ethErr);
        return -1;
    }
    lcd.printf(" Net OK");
    wait(.5);
    lcd.cls();
    lcd.printf("IP Address\nGeolocation API");
    HTTPText txt;
    //iPinfoDB API  - get web page with location data
    //Insert your free key from www.ipinfo.com for the API in the URL below
    HTTPResult r = http.get("http://api.ipinfodb.com/v3/ip-city/?key=PUT_YOUR_API_KEY_HERE", &txt);
    if (r==HTTP_OK) {
        //got web page text data OK
        strcpy(buffer,txt.gets());
        wait(1);
        while (1) {
            j=0;
            //parse and display each of the API's location information strings on the LCD
            parse(buffer, &j, result);
            lcd.cls();
            lcd.printf("result: %s\n", result);
            if (result[0]!='O') { //needs valid key
                wait(1);
                lcd.cls();
                lcd.printf("Get Free API key");
                lcd.printf("www.iPinfoDB.com");
                return(-1);
            }
            wait(1);
            j++;
            parse(buffer, &j, ip);
            lcd.cls();
            lcd.printf("IP address: \n %s", ip);
            wait(2);
            parse(buffer, &j, country_abbr);
            lcd.cls();
            lcd.printf("Country code: \n %s", country_abbr);
            wait(2);
            parse(buffer, &j, country);
            lcd.cls();
            lcd.printf("Country: \n%s", country);
            wait(2);
            parse(buffer, &j, region);
            lcd.cls();
            lcd.printf("Region or State:%s", region);
            wait(2);
            parse(buffer, &j, city);
            lcd.cls();
            lcd.printf("City: \n%s", city);
            wait(2);
            parse(buffer, &j, zipcode);
            lcd.cls();
            lcd.printf("Zipcode: \n %s", zipcode);
            wait(2);
            parse(buffer, &j, latitude);
            sscanf(latitude,"%f",&flatitude);
            lcd.cls();
            lcd.printf("Latitude: \n %f", flatitude);
            wait(2);
            parse(buffer, &j, longitude);
            sscanf(longitude,"%f",&flongitude);
            lcd.cls();
            lcd.printf("Longitude: \n %f", flongitude);
            wait(2);
            parse(buffer, &j, timezone);
            sscanf(timezone,"%f",&ftimezone);
            lcd.cls();
            lcd.printf("Timezone: \n %f", ftimezone);
            wait(4);
        }
    } else {
        lcd.cls();
        lcd.printf("HTTP Error %d", r);
        return -1;
    }
}