Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed-http lr1110 sx12xx_hal
google_geolocation.cpp@1:4a05f91c9c38, 2021-02-09 (annotated)
- Committer:
- Wayne Roberts
- Date:
- Tue Feb 09 10:49:02 2021 -0800
- Revision:
- 1:4a05f91c9c38
add source files
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Wayne Roberts |
1:4a05f91c9c38 | 1 | #include "main.h" |
| Wayne Roberts |
1:4a05f91c9c38 | 2 | #if (GEOLOCATION_PROVIDER == GOOGLE) |
| Wayne Roberts |
1:4a05f91c9c38 | 3 | #include "radio.h" |
| Wayne Roberts |
1:4a05f91c9c38 | 4 | |
| Wayne Roberts |
1:4a05f91c9c38 | 5 | const char GOOGLE_SSL_CA_PEM[] = "-----BEGIN CERTIFICATE-----\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 6 | "MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 7 | "A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 8 | "Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 9 | "MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 10 | "A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 11 | "hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 12 | "v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 13 | "eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 14 | "tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 15 | "C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 16 | "zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 17 | "mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 18 | "V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 19 | "bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 20 | "3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 21 | "J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 22 | "291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 23 | "ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 24 | "AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 25 | "TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 26 | "-----END CERTIFICATE-----\n"; |
| Wayne Roberts |
1:4a05f91c9c38 | 27 | |
| Wayne Roberts |
1:4a05f91c9c38 | 28 | char my_copy[128]; |
| Wayne Roberts |
1:4a05f91c9c38 | 29 | |
| Wayne Roberts |
1:4a05f91c9c38 | 30 | /* parse_json: get result sent from server */ |
| Wayne Roberts |
1:4a05f91c9c38 | 31 | void parse_json(const char *body, float *lat, float *lng, int *accuracy) |
| Wayne Roberts |
1:4a05f91c9c38 | 32 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 33 | bool in_location = false; |
| Wayne Roberts |
1:4a05f91c9c38 | 34 | bool get_lat = false; |
| Wayne Roberts |
1:4a05f91c9c38 | 35 | bool get_lng = false; |
| Wayne Roberts |
1:4a05f91c9c38 | 36 | bool get_accuracy = false; |
| Wayne Roberts |
1:4a05f91c9c38 | 37 | unsigned n; |
| Wayne Roberts |
1:4a05f91c9c38 | 38 | strncpy(my_copy, body, sizeof(my_copy)); |
| Wayne Roberts |
1:4a05f91c9c38 | 39 | strtok(my_copy, "\""); |
| Wayne Roberts |
1:4a05f91c9c38 | 40 | for (n = 0; n < 10; n++) { |
| Wayne Roberts |
1:4a05f91c9c38 | 41 | char *t = strtok(NULL, "\":"); |
| Wayne Roberts |
1:4a05f91c9c38 | 42 | if (!t) |
| Wayne Roberts |
1:4a05f91c9c38 | 43 | break; |
| Wayne Roberts |
1:4a05f91c9c38 | 44 | if (in_location) { |
| Wayne Roberts |
1:4a05f91c9c38 | 45 | if (get_lat) { |
| Wayne Roberts |
1:4a05f91c9c38 | 46 | sscanf(t, "%f", lat); |
| Wayne Roberts |
1:4a05f91c9c38 | 47 | get_lat = false; |
| Wayne Roberts |
1:4a05f91c9c38 | 48 | } else if (get_lng) { |
| Wayne Roberts |
1:4a05f91c9c38 | 49 | sscanf(t, "%f", lng); |
| Wayne Roberts |
1:4a05f91c9c38 | 50 | get_lng = false; |
| Wayne Roberts |
1:4a05f91c9c38 | 51 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 52 | if (strchr(t, '}')) |
| Wayne Roberts |
1:4a05f91c9c38 | 53 | in_location = false; |
| Wayne Roberts |
1:4a05f91c9c38 | 54 | else if (strcmp(t, "lat") == 0) |
| Wayne Roberts |
1:4a05f91c9c38 | 55 | get_lat = true; |
| Wayne Roberts |
1:4a05f91c9c38 | 56 | else if (strcmp(t, "lng") == 0) |
| Wayne Roberts |
1:4a05f91c9c38 | 57 | get_lng = true; |
| Wayne Roberts |
1:4a05f91c9c38 | 58 | } else { |
| Wayne Roberts |
1:4a05f91c9c38 | 59 | if (get_accuracy) { |
| Wayne Roberts |
1:4a05f91c9c38 | 60 | sscanf(t, "%d", accuracy); |
| Wayne Roberts |
1:4a05f91c9c38 | 61 | get_accuracy = false; |
| Wayne Roberts |
1:4a05f91c9c38 | 62 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 63 | if (strcmp(t, "location") == 0) |
| Wayne Roberts |
1:4a05f91c9c38 | 64 | in_location = true; |
| Wayne Roberts |
1:4a05f91c9c38 | 65 | else if (strcmp(t, "accuracy") == 0) |
| Wayne Roberts |
1:4a05f91c9c38 | 66 | get_accuracy = true; |
| Wayne Roberts |
1:4a05f91c9c38 | 67 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 68 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 69 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 70 | |
| Wayne Roberts |
1:4a05f91c9c38 | 71 | /* |
| Wayne Roberts |
1:4a05f91c9c38 | 72 | * https://developers.google.com/maps/documentation/geolocation/overview |
| Wayne Roberts |
1:4a05f91c9c38 | 73 | */ |
| Wayne Roberts |
1:4a05f91c9c38 | 74 | int post_scan_result(const char *body, float *lat, float *lng, int *accuracy) |
| Wayne Roberts |
1:4a05f91c9c38 | 75 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 76 | HttpsRequest* post_req = new HttpsRequest(network, GOOGLE_SSL_CA_PEM, HTTP_POST, "https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR-API-KEY"); |
| Wayne Roberts |
1:4a05f91c9c38 | 77 | |
| Wayne Roberts |
1:4a05f91c9c38 | 78 | post_req->set_header("Content-Type", "application/json"); |
| Wayne Roberts |
1:4a05f91c9c38 | 79 | |
| Wayne Roberts |
1:4a05f91c9c38 | 80 | HttpResponse* post_res = post_req->send(body, strlen(body)); |
| Wayne Roberts |
1:4a05f91c9c38 | 81 | if (!post_res) { |
| Wayne Roberts |
1:4a05f91c9c38 | 82 | printf("HttpRequest failed (error code %d)\n", post_req->get_error()); |
| Wayne Roberts |
1:4a05f91c9c38 | 83 | return -1; |
| Wayne Roberts |
1:4a05f91c9c38 | 84 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 85 | |
| Wayne Roberts |
1:4a05f91c9c38 | 86 | dump_response(post_res); |
| Wayne Roberts |
1:4a05f91c9c38 | 87 | parse_json(post_res->get_body_as_string().c_str(), lat, lng, accuracy); |
| Wayne Roberts |
1:4a05f91c9c38 | 88 | delete post_req; |
| Wayne Roberts |
1:4a05f91c9c38 | 89 | |
| Wayne Roberts |
1:4a05f91c9c38 | 90 | return 0; |
| Wayne Roberts |
1:4a05f91c9c38 | 91 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 92 | |
| Wayne Roberts |
1:4a05f91c9c38 | 93 | void json_start() |
| Wayne Roberts |
1:4a05f91c9c38 | 94 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 95 | strcpy(json, "{\"considerIp\": \"false\","); |
| Wayne Roberts |
1:4a05f91c9c38 | 96 | strcat(json, "\"wifiAccessPoints\": ["); |
| Wayne Roberts |
1:4a05f91c9c38 | 97 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 98 | |
| Wayne Roberts |
1:4a05f91c9c38 | 99 | void json_end() |
| Wayne Roberts |
1:4a05f91c9c38 | 100 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 101 | strcat(json, "]"); |
| Wayne Roberts |
1:4a05f91c9c38 | 102 | strcat(json, "}"); |
| Wayne Roberts |
1:4a05f91c9c38 | 103 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 104 | |
| Wayne Roberts |
1:4a05f91c9c38 | 105 | void wifi_result_to_json(bool first, const uint8_t *result, unsigned macStart, unsigned rssi_idx) |
| Wayne Roberts |
1:4a05f91c9c38 | 106 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 107 | char str[8]; |
| Wayne Roberts |
1:4a05f91c9c38 | 108 | unsigned i; |
| Wayne Roberts |
1:4a05f91c9c38 | 109 | |
| Wayne Roberts |
1:4a05f91c9c38 | 110 | if (!first) |
| Wayne Roberts |
1:4a05f91c9c38 | 111 | strcat(json, ","); // end previous wifiAccessPoint |
| Wayne Roberts |
1:4a05f91c9c38 | 112 | |
| Wayne Roberts |
1:4a05f91c9c38 | 113 | strcat(json, "{\"macAddress\": \""); |
| Wayne Roberts |
1:4a05f91c9c38 | 114 | for (i = 0; i < 6; i++) { |
| Wayne Roberts |
1:4a05f91c9c38 | 115 | sprintf(str, "%02x", result[i + macStart]); |
| Wayne Roberts |
1:4a05f91c9c38 | 116 | strcat(json, str); |
| Wayne Roberts |
1:4a05f91c9c38 | 117 | if (i < 5) |
| Wayne Roberts |
1:4a05f91c9c38 | 118 | strcat(json, ":"); |
| Wayne Roberts |
1:4a05f91c9c38 | 119 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 120 | strcat(json, "\",\"signalStrength\": "); |
| Wayne Roberts |
1:4a05f91c9c38 | 121 | sprintf(str, "%d", (int8_t)result[rssi_idx]); |
| Wayne Roberts |
1:4a05f91c9c38 | 122 | strcat(json, str); |
| Wayne Roberts |
1:4a05f91c9c38 | 123 | strcat(json, ",\"signalToNoiseRatio\": 0"); |
| Wayne Roberts |
1:4a05f91c9c38 | 124 | |
| Wayne Roberts |
1:4a05f91c9c38 | 125 | strcat(json, "}"); |
| Wayne Roberts |
1:4a05f91c9c38 | 126 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 127 | |
| Wayne Roberts |
1:4a05f91c9c38 | 128 | #endif /* GEOLOCATION_PROVIDER == GOOGLE */ |