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@0:14edcbab30cc, 2012-04-29 (annotated)
- Committer:
- 4180_1
- Date:
- Sun Apr 29 01:23:17 2012 +0000
- Revision:
- 0:14edcbab30cc
Who changed what in which revision?
User | Revision | Line number | New 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 | } |