simple example of scanning wifi AP and sending to geolocation resolver on cloud
Dependencies: mbed-http lr1110 sx12xx_hal
test Wifi geolocation with resolving using HTTP POST.
Use with mbed board with internet access and arduino form factor.
With HTTPS, the RAM requirement is minimum 128Kbytes.
and, use with radio shield for europe
or radio shield for USA
which is programmed with trx firmware from updater tool.
This project presents to user mbed STDIO serial port at 115200bps, which lets you perform wifi access point scan on LR1110 and send the resulting access point list to a geolocation provider on the cloud.
Use the project by itself to run wifi scan on the serial terminal (at 115200bps), or use with lr1110_wifi_geolocation_device to receive wifi list from remote device (over LoRa) to resolve location of that device using gelocation provider on cloud.
On serial terminal, use ? question mark to see list of commands. ws to run wifi scan, or ws p to wifi scan and resolve location with cloud provider via HTTP POST.
project setup
Edit main.h to uncomment which geolocation provider you wish to use, and get API key from them:
- google geolocation
- combain geolocation
TODOothers?
(choose one) Put your API key for geolocation provider into the URL in geolocation source file (such asgoogle_geolocation.cpporcombain.cpp)
notice
This project is not using LoRaWAN, instead just LoRa transceiver directly to geolocation provider
main.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 | #include "network-helper.h" |
| Wayne Roberts |
1:4a05f91c9c38 | 3 | #include "radio.h" |
| Wayne Roberts |
1:4a05f91c9c38 | 4 | |
| Wayne Roberts |
1:4a05f91c9c38 | 5 | #define TX_DBM 20 |
| Wayne Roberts |
1:4a05f91c9c38 | 6 | #define BW_KHZ 500 |
| Wayne Roberts |
1:4a05f91c9c38 | 7 | #define SPREADING_FACTOR 11 |
| Wayne Roberts |
1:4a05f91c9c38 | 8 | #define CF_HZ 919000000 |
| Wayne Roberts |
1:4a05f91c9c38 | 9 | |
| Wayne Roberts |
1:4a05f91c9c38 | 10 | /* geolocation provider wont operate with less than 3 wifi access points */ |
| Wayne Roberts |
1:4a05f91c9c38 | 11 | #define MINIMUM_REQUIRED_ACCESS_POINTS 2 |
| Wayne Roberts |
1:4a05f91c9c38 | 12 | |
| Wayne Roberts |
1:4a05f91c9c38 | 13 | bool wifiResultFormatBasic; |
| Wayne Roberts |
1:4a05f91c9c38 | 14 | |
| Wayne Roberts |
1:4a05f91c9c38 | 15 | struct location { |
| Wayne Roberts |
1:4a05f91c9c38 | 16 | float lat, lng; |
| Wayne Roberts |
1:4a05f91c9c38 | 17 | int accuracy; |
| Wayne Roberts |
1:4a05f91c9c38 | 18 | }; |
| Wayne Roberts |
1:4a05f91c9c38 | 19 | |
| Wayne Roberts |
1:4a05f91c9c38 | 20 | typedef struct { |
| Wayne Roberts |
1:4a05f91c9c38 | 21 | const char* const cmd; |
| Wayne Roberts |
1:4a05f91c9c38 | 22 | void (*handler)(uint8_t args_at); |
| Wayne Roberts |
1:4a05f91c9c38 | 23 | const char* const arg_descr; |
| Wayne Roberts |
1:4a05f91c9c38 | 24 | const char* const description; |
| Wayne Roberts |
1:4a05f91c9c38 | 25 | } menu_item_t; |
| Wayne Roberts |
1:4a05f91c9c38 | 26 | |
| Wayne Roberts |
1:4a05f91c9c38 | 27 | EventQueue queue(4 * EVENTS_EVENT_SIZE); |
| Wayne Roberts |
1:4a05f91c9c38 | 28 | |
| Wayne Roberts |
1:4a05f91c9c38 | 29 | RawSerial pc(USBTX, USBRX, MBED_CONF_PLATFORM_STDIO_BAUD_RATE); // speed from mbed_app.json |
| Wayne Roberts |
1:4a05f91c9c38 | 30 | char pcbuf[64]; |
| Wayne Roberts |
1:4a05f91c9c38 | 31 | int pcbuf_len; |
| Wayne Roberts |
1:4a05f91c9c38 | 32 | |
| Wayne Roberts |
1:4a05f91c9c38 | 33 | NetworkInterface* network; |
| Wayne Roberts |
1:4a05f91c9c38 | 34 | |
| Wayne Roberts |
1:4a05f91c9c38 | 35 | event_callback_t serialEventCb; |
| Wayne Roberts |
1:4a05f91c9c38 | 36 | |
| Wayne Roberts |
1:4a05f91c9c38 | 37 | uint8_t wifiScan_buf[9]; |
| Wayne Roberts |
1:4a05f91c9c38 | 38 | uint64_t wifi_start_at, wifi_scan_dur; |
| Wayne Roberts |
1:4a05f91c9c38 | 39 | bool post_enable; |
| Wayne Roberts |
1:4a05f91c9c38 | 40 | bool send_reply; |
| Wayne Roberts |
1:4a05f91c9c38 | 41 | |
| Wayne Roberts |
1:4a05f91c9c38 | 42 | void cmd_help(uint8_t); |
| Wayne Roberts |
1:4a05f91c9c38 | 43 | |
| Wayne Roberts |
1:4a05f91c9c38 | 44 | struct location geoloc_result; |
| Wayne Roberts |
1:4a05f91c9c38 | 45 | |
| Wayne Roberts |
1:4a05f91c9c38 | 46 | uint8_t remote_chip_eui[8]; |
| Wayne Roberts |
1:4a05f91c9c38 | 47 | |
| Wayne Roberts |
1:4a05f91c9c38 | 48 | struct wifidr { |
| Wayne Roberts |
1:4a05f91c9c38 | 49 | const char *txt; |
| Wayne Roberts |
1:4a05f91c9c38 | 50 | float Mbps; |
| Wayne Roberts |
1:4a05f91c9c38 | 51 | }; |
| Wayne Roberts |
1:4a05f91c9c38 | 52 | |
| Wayne Roberts |
1:4a05f91c9c38 | 53 | const struct wifidr wifiDatarates[] = { |
| Wayne Roberts |
1:4a05f91c9c38 | 54 | /* 0 */ { NULL, 0}, |
| Wayne Roberts |
1:4a05f91c9c38 | 55 | /* 1 */ { "DBPSK", 1}, |
| Wayne Roberts |
1:4a05f91c9c38 | 56 | /* 2 */ { "DQPSK", 2}, |
| Wayne Roberts |
1:4a05f91c9c38 | 57 | /* 3 */ { "BPSK", 6}, |
| Wayne Roberts |
1:4a05f91c9c38 | 58 | /* 4 */ { "BPSK", 9}, |
| Wayne Roberts |
1:4a05f91c9c38 | 59 | /* 5 */ { "QPSK", 12}, |
| Wayne Roberts |
1:4a05f91c9c38 | 60 | /* 6 */ { "QPSK", 18}, |
| Wayne Roberts |
1:4a05f91c9c38 | 61 | /* 7 */ { "16-QAM", 24}, |
| Wayne Roberts |
1:4a05f91c9c38 | 62 | /* 8 */ { "16-QAM", 36}, |
| Wayne Roberts |
1:4a05f91c9c38 | 63 | /* 9 */ { "(9)", 0}, |
| Wayne Roberts |
1:4a05f91c9c38 | 64 | /* 10 */ { "(10)", 0}, |
| Wayne Roberts |
1:4a05f91c9c38 | 65 | /* 11 */ { "BPSK", 6.5}, |
| Wayne Roberts |
1:4a05f91c9c38 | 66 | /* 12 */ { "QPSK", 13}, |
| Wayne Roberts |
1:4a05f91c9c38 | 67 | /* 13 */ { "QPSK", 19.5}, |
| Wayne Roberts |
1:4a05f91c9c38 | 68 | /* 14 */ { "16-QAM", 26}, |
| Wayne Roberts |
1:4a05f91c9c38 | 69 | /* 15 */ { "16-QAM", 39}, |
| Wayne Roberts |
1:4a05f91c9c38 | 70 | /* 16 */ { "(16)", 0}, |
| Wayne Roberts |
1:4a05f91c9c38 | 71 | /* 17 */ { "(17)", 0}, |
| Wayne Roberts |
1:4a05f91c9c38 | 72 | /* 18 */ { "(18)", 0}, |
| Wayne Roberts |
1:4a05f91c9c38 | 73 | /* 19 */ { "BPSK", 7.2}, |
| Wayne Roberts |
1:4a05f91c9c38 | 74 | /* 20 */ { "QPSK", 14.4}, |
| Wayne Roberts |
1:4a05f91c9c38 | 75 | /* 21 */ { "QPSK", 21.7}, |
| Wayne Roberts |
1:4a05f91c9c38 | 76 | /* 22 */ { "16-QAM", 28.9}, |
| Wayne Roberts |
1:4a05f91c9c38 | 77 | /* 23 */ { "16-QAM", 43.3}, |
| Wayne Roberts |
1:4a05f91c9c38 | 78 | }; |
| Wayne Roberts |
1:4a05f91c9c38 | 79 | |
| Wayne Roberts |
1:4a05f91c9c38 | 80 | char json[1536]; |
| Wayne Roberts |
1:4a05f91c9c38 | 81 | |
| Wayne Roberts |
1:4a05f91c9c38 | 82 | void dump_response(HttpResponse* res) |
| Wayne Roberts |
1:4a05f91c9c38 | 83 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 84 | printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str()); |
| Wayne Roberts |
1:4a05f91c9c38 | 85 | |
| Wayne Roberts |
1:4a05f91c9c38 | 86 | printf("Headers:\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 87 | for (size_t ix = 0; ix < res->get_headers_length(); ix++) { |
| Wayne Roberts |
1:4a05f91c9c38 | 88 | printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str()); |
| Wayne Roberts |
1:4a05f91c9c38 | 89 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 90 | printf("\nBody (%lu bytes):\n\n%s\n", res->get_body_length(), res->get_body_as_string().c_str()); |
| Wayne Roberts |
1:4a05f91c9c38 | 91 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 92 | |
| Wayne Roberts |
1:4a05f91c9c38 | 93 | void cfg_lora() |
| Wayne Roberts |
1:4a05f91c9c38 | 94 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 95 | Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1); |
| Wayne Roberts |
1:4a05f91c9c38 | 96 | Radio::SetChannel(CF_HZ); |
| Wayne Roberts |
1:4a05f91c9c38 | 97 | Radio::set_tx_dbm(TX_DBM); |
| Wayne Roberts |
1:4a05f91c9c38 | 98 | // preambleLen, fixLen, crcOn, invIQ |
| Wayne Roberts |
1:4a05f91c9c38 | 99 | Radio::LoRaPacketConfig(8, false, true, false); |
| Wayne Roberts |
1:4a05f91c9c38 | 100 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 101 | |
| Wayne Roberts |
1:4a05f91c9c38 | 102 | void cmd_wifi_scan(uint8_t idx) |
| Wayne Roberts |
1:4a05f91c9c38 | 103 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 104 | Radio::radio.xfer(OPCODE_WIFI_SCAN, 9, 0, wifiScan_buf); |
| Wayne Roberts |
1:4a05f91c9c38 | 105 | wifi_start_at = Kernel::get_ms_count(); |
| Wayne Roberts |
1:4a05f91c9c38 | 106 | printf("wifiScan...\r\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 107 | |
| Wayne Roberts |
1:4a05f91c9c38 | 108 | post_enable = pcbuf[idx] == 'p'; |
| Wayne Roberts |
1:4a05f91c9c38 | 109 | send_reply = false; |
| Wayne Roberts |
1:4a05f91c9c38 | 110 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 111 | |
| Wayne Roberts |
1:4a05f91c9c38 | 112 | /* List of trusted root CA certificates |
| Wayne Roberts |
1:4a05f91c9c38 | 113 | * currently two: Amazon, the CA for os.mbed.com and Let's Encrypt, the CA for httpbin.org |
| Wayne Roberts |
1:4a05f91c9c38 | 114 | * |
| Wayne Roberts |
1:4a05f91c9c38 | 115 | * To add more root certificates, just concatenate them. |
| Wayne Roberts |
1:4a05f91c9c38 | 116 | */ |
| Wayne Roberts |
1:4a05f91c9c38 | 117 | const char HTTBIN_ORG_SSL_CA_PEM[] = "-----BEGIN CERTIFICATE-----\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 118 | "MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 119 | "ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 120 | "b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 121 | "MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 122 | "b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 123 | "ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 124 | "9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 125 | "IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 126 | "VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 127 | "93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 128 | "jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 129 | "AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 130 | "A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 131 | "U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 132 | "N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 133 | "o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 134 | "5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 135 | "rqXRfboQnoZsG4q5WTP468SQvvG5\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 136 | "-----END CERTIFICATE-----\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 137 | "-----BEGIN CERTIFICATE-----\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 138 | "MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 139 | "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 140 | "DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 141 | "SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 142 | "GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 143 | "AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 144 | "q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 145 | "SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 146 | "Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 147 | "a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 148 | "/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 149 | "AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 150 | "CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 151 | "bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 152 | "c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 153 | "VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 154 | "ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 155 | "MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 156 | "Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 157 | "AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 158 | "uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 159 | "wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 160 | "X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 161 | "PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 162 | "KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n" |
| Wayne Roberts |
1:4a05f91c9c38 | 163 | "-----END CERTIFICATE-----\n"; |
| Wayne Roberts |
1:4a05f91c9c38 | 164 | |
| Wayne Roberts |
1:4a05f91c9c38 | 165 | |
| Wayne Roberts |
1:4a05f91c9c38 | 166 | void cmd_httpbin_post(uint8_t idx) |
| Wayne Roberts |
1:4a05f91c9c38 | 167 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 168 | const char body[] = "{\"hello\":\"world\"}"; |
| Wayne Roberts |
1:4a05f91c9c38 | 169 | |
| Wayne Roberts |
1:4a05f91c9c38 | 170 | #if DEMO == DEMO_HTTPS |
| Wayne Roberts |
1:4a05f91c9c38 | 171 | printf("\n----- HTTPS POST request -----\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 172 | HttpsRequest* post_req = new HttpsRequest(network, HTTBIN_ORG_SSL_CA_PEM, HTTP_POST, "https://httpbin.org/post"); |
| Wayne Roberts |
1:4a05f91c9c38 | 173 | #elif DEMO == DEMO_HTTP |
| Wayne Roberts |
1:4a05f91c9c38 | 174 | printf("\n----- HTTP POST request -----\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 175 | HttpRequest* post_req = new HttpRequest(network, HTTP_POST, "http://httpbin.org/post"); |
| Wayne Roberts |
1:4a05f91c9c38 | 176 | #endif |
| Wayne Roberts |
1:4a05f91c9c38 | 177 | |
| Wayne Roberts |
1:4a05f91c9c38 | 178 | post_req->set_header("Content-Type", "application/json"); |
| Wayne Roberts |
1:4a05f91c9c38 | 179 | |
| Wayne Roberts |
1:4a05f91c9c38 | 180 | HttpResponse* post_res = post_req->send(body, strlen(body)); |
| Wayne Roberts |
1:4a05f91c9c38 | 181 | if (!post_res) { |
| Wayne Roberts |
1:4a05f91c9c38 | 182 | printf("HttpRequest failed (error code %d)\n", post_req->get_error()); |
| Wayne Roberts |
1:4a05f91c9c38 | 183 | return; |
| Wayne Roberts |
1:4a05f91c9c38 | 184 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 185 | |
| Wayne Roberts |
1:4a05f91c9c38 | 186 | dump_response(post_res); |
| Wayne Roberts |
1:4a05f91c9c38 | 187 | delete post_req; |
| Wayne Roberts |
1:4a05f91c9c38 | 188 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 189 | |
| Wayne Roberts |
1:4a05f91c9c38 | 190 | |
| Wayne Roberts |
1:4a05f91c9c38 | 191 | void cmd_print_status(uint8_t idx) |
| Wayne Roberts |
1:4a05f91c9c38 | 192 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 193 | stat_t stat; |
| Wayne Roberts |
1:4a05f91c9c38 | 194 | uint8_t buf[4]; |
| Wayne Roberts |
1:4a05f91c9c38 | 195 | printf("[NWKH] IP address: %s\n", network->get_ip_address()); |
| Wayne Roberts |
1:4a05f91c9c38 | 196 | |
| Wayne Roberts |
1:4a05f91c9c38 | 197 | stat.word = Radio::radio.xfer(OPCODE_GET_VERSION, 0, 0, NULL); |
| Wayne Roberts |
1:4a05f91c9c38 | 198 | stat.word = Radio::radio.xfer(0x0000, 0, 4, buf); |
| Wayne Roberts |
1:4a05f91c9c38 | 199 | if (stat.bits.cmdStatus == CMD_DAT) { |
| Wayne Roberts |
1:4a05f91c9c38 | 200 | printf("LR1110 chip:%02x use:%02x fw-v%u.%u\r\n", |
| Wayne Roberts |
1:4a05f91c9c38 | 201 | buf[0], /* silicon rev */ |
| Wayne Roberts |
1:4a05f91c9c38 | 202 | buf[1], /* use case */ |
| Wayne Roberts |
1:4a05f91c9c38 | 203 | buf[2], /* firmware major */ |
| Wayne Roberts |
1:4a05f91c9c38 | 204 | buf[3] /* firmware minor */ |
| Wayne Roberts |
1:4a05f91c9c38 | 205 | ); |
| Wayne Roberts |
1:4a05f91c9c38 | 206 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 207 | |
| Wayne Roberts |
1:4a05f91c9c38 | 208 | stat.word = Radio::radio.xfer(OPCODE_GET_STATUS, 4, 0, buf); |
| Wayne Roberts |
1:4a05f91c9c38 | 209 | printf("chipMode:%d, cmdStatus:%d\r\n", stat.bits.chipMode, stat.bits.cmdStatus); |
| Wayne Roberts |
1:4a05f91c9c38 | 210 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 211 | |
| Wayne Roberts |
1:4a05f91c9c38 | 212 | const menu_item_t menu_items[] = |
| Wayne Roberts |
1:4a05f91c9c38 | 213 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 214 | { "phb", cmd_httpbin_post, "","test post to httpbin.org"}, |
| Wayne Roberts |
1:4a05f91c9c38 | 215 | { "ws", cmd_wifi_scan, "","local wifi scan"}, |
| Wayne Roberts |
1:4a05f91c9c38 | 216 | { ".", cmd_print_status, "","print status"}, |
| Wayne Roberts |
1:4a05f91c9c38 | 217 | { "?", cmd_help, "","this list of commands"}, |
| Wayne Roberts |
1:4a05f91c9c38 | 218 | { NULL, NULL, NULL, NULL } |
| Wayne Roberts |
1:4a05f91c9c38 | 219 | }; |
| Wayne Roberts |
1:4a05f91c9c38 | 220 | |
| Wayne Roberts |
1:4a05f91c9c38 | 221 | void |
| Wayne Roberts |
1:4a05f91c9c38 | 222 | console() |
| Wayne Roberts |
1:4a05f91c9c38 | 223 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 224 | int i; |
| Wayne Roberts |
1:4a05f91c9c38 | 225 | uint8_t user_cmd_len; |
| Wayne Roberts |
1:4a05f91c9c38 | 226 | |
| Wayne Roberts |
1:4a05f91c9c38 | 227 | if (pcbuf_len < 0) { |
| Wayne Roberts |
1:4a05f91c9c38 | 228 | printf("abort\r\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 229 | pcbuf_len = 0; |
| Wayne Roberts |
1:4a05f91c9c38 | 230 | return; |
| Wayne Roberts |
1:4a05f91c9c38 | 231 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 232 | |
| Wayne Roberts |
1:4a05f91c9c38 | 233 | printf("\r\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 234 | |
| Wayne Roberts |
1:4a05f91c9c38 | 235 | if (pcbuf_len > 0) { |
| Wayne Roberts |
1:4a05f91c9c38 | 236 | /* get end of user-entered command */ |
| Wayne Roberts |
1:4a05f91c9c38 | 237 | user_cmd_len = 1; // first character can be any character |
| Wayne Roberts |
1:4a05f91c9c38 | 238 | for (i = 1; i <= pcbuf_len; i++) { |
| Wayne Roberts |
1:4a05f91c9c38 | 239 | if (pcbuf[i] < 'A' || (pcbuf[i] > 'Z' && pcbuf[i] < 'a') || pcbuf[i] > 'z') { |
| Wayne Roberts |
1:4a05f91c9c38 | 240 | user_cmd_len = i; |
| Wayne Roberts |
1:4a05f91c9c38 | 241 | break; |
| Wayne Roberts |
1:4a05f91c9c38 | 242 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 243 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 244 | |
| Wayne Roberts |
1:4a05f91c9c38 | 245 | |
| Wayne Roberts |
1:4a05f91c9c38 | 246 | for (i = 0; menu_items[i].cmd != NULL ; i++) { |
| Wayne Roberts |
1:4a05f91c9c38 | 247 | int mi_len = strlen(menu_items[i].cmd); |
| Wayne Roberts |
1:4a05f91c9c38 | 248 | if (menu_items[i].handler && user_cmd_len == mi_len && (strncmp(pcbuf, menu_items[i].cmd, mi_len) == 0)) { |
| Wayne Roberts |
1:4a05f91c9c38 | 249 | while (pcbuf[mi_len] == ' ') // skip past spaces |
| Wayne Roberts |
1:4a05f91c9c38 | 250 | mi_len++; |
| Wayne Roberts |
1:4a05f91c9c38 | 251 | menu_items[i].handler(mi_len); |
| Wayne Roberts |
1:4a05f91c9c38 | 252 | break; |
| Wayne Roberts |
1:4a05f91c9c38 | 253 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 254 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 255 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 256 | |
| Wayne Roberts |
1:4a05f91c9c38 | 257 | pcbuf_len = 0; |
| Wayne Roberts |
1:4a05f91c9c38 | 258 | printf("> "); |
| Wayne Roberts |
1:4a05f91c9c38 | 259 | fflush(stdout); |
| Wayne Roberts |
1:4a05f91c9c38 | 260 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 261 | |
| Wayne Roberts |
1:4a05f91c9c38 | 262 | void echo(char c) |
| Wayne Roberts |
1:4a05f91c9c38 | 263 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 264 | if (c == 8) { |
| Wayne Roberts |
1:4a05f91c9c38 | 265 | pc.putc(8); |
| Wayne Roberts |
1:4a05f91c9c38 | 266 | pc.putc(' '); |
| Wayne Roberts |
1:4a05f91c9c38 | 267 | pc.putc(8); |
| Wayne Roberts |
1:4a05f91c9c38 | 268 | } else |
| Wayne Roberts |
1:4a05f91c9c38 | 269 | pc.putc(c); |
| Wayne Roberts |
1:4a05f91c9c38 | 270 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 271 | |
| Wayne Roberts |
1:4a05f91c9c38 | 272 | uint8_t serial_rx_buf; |
| Wayne Roberts |
1:4a05f91c9c38 | 273 | |
| Wayne Roberts |
1:4a05f91c9c38 | 274 | void serialCb(int events) |
| Wayne Roberts |
1:4a05f91c9c38 | 275 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 276 | if (events & SERIAL_EVENT_RX_COMPLETE) { |
| Wayne Roberts |
1:4a05f91c9c38 | 277 | char c = serial_rx_buf; |
| Wayne Roberts |
1:4a05f91c9c38 | 278 | static uint8_t pcbuf_idx = 0; |
| Wayne Roberts |
1:4a05f91c9c38 | 279 | static uint8_t prev_len = 0;; |
| Wayne Roberts |
1:4a05f91c9c38 | 280 | if (c == 8) { |
| Wayne Roberts |
1:4a05f91c9c38 | 281 | if (pcbuf_idx > 0) { |
| Wayne Roberts |
1:4a05f91c9c38 | 282 | queue.call(echo, 8); |
| Wayne Roberts |
1:4a05f91c9c38 | 283 | pcbuf_idx--; |
| Wayne Roberts |
1:4a05f91c9c38 | 284 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 285 | } else if (c == 3) { // ctrl-C |
| Wayne Roberts |
1:4a05f91c9c38 | 286 | pcbuf_len = -1; |
| Wayne Roberts |
1:4a05f91c9c38 | 287 | queue.call(console); |
| Wayne Roberts |
1:4a05f91c9c38 | 288 | } else if (c == '\r') { |
| Wayne Roberts |
1:4a05f91c9c38 | 289 | if (pcbuf_idx == 0) { |
| Wayne Roberts |
1:4a05f91c9c38 | 290 | pcbuf_len = prev_len; |
| Wayne Roberts |
1:4a05f91c9c38 | 291 | } else { |
| Wayne Roberts |
1:4a05f91c9c38 | 292 | pcbuf[pcbuf_idx] = 0; // null terminate |
| Wayne Roberts |
1:4a05f91c9c38 | 293 | prev_len = pcbuf_idx; |
| Wayne Roberts |
1:4a05f91c9c38 | 294 | pcbuf_idx = 0; |
| Wayne Roberts |
1:4a05f91c9c38 | 295 | pcbuf_len = prev_len; |
| Wayne Roberts |
1:4a05f91c9c38 | 296 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 297 | queue.call(console); |
| Wayne Roberts |
1:4a05f91c9c38 | 298 | } else if (pcbuf_idx < sizeof(pcbuf)) { |
| Wayne Roberts |
1:4a05f91c9c38 | 299 | pcbuf[pcbuf_idx++] = c; |
| Wayne Roberts |
1:4a05f91c9c38 | 300 | queue.call(echo, c); |
| Wayne Roberts |
1:4a05f91c9c38 | 301 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 302 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 303 | |
| Wayne Roberts |
1:4a05f91c9c38 | 304 | if (pc.read(&serial_rx_buf, 1, serialCb) != 0) |
| Wayne Roberts |
1:4a05f91c9c38 | 305 | printf("Serial-Read-Fail\r\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 306 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 307 | |
| Wayne Roberts |
1:4a05f91c9c38 | 308 | void cmd_help(uint8_t args_at) |
| Wayne Roberts |
1:4a05f91c9c38 | 309 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 310 | int i; |
| Wayne Roberts |
1:4a05f91c9c38 | 311 | |
| Wayne Roberts |
1:4a05f91c9c38 | 312 | for (i = 0; menu_items[i].cmd != NULL ; i++) { |
| Wayne Roberts |
1:4a05f91c9c38 | 313 | printf("%s%s\t%s\r\n", menu_items[i].cmd, menu_items[i].arg_descr, menu_items[i].description); |
| Wayne Roberts |
1:4a05f91c9c38 | 314 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 315 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 316 | |
| Wayne Roberts |
1:4a05f91c9c38 | 317 | |
| Wayne Roberts |
1:4a05f91c9c38 | 318 | void print_wifi_result(const uint8_t *result) |
| Wayne Roberts |
1:4a05f91c9c38 | 319 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 320 | char out[96]; |
| Wayne Roberts |
1:4a05f91c9c38 | 321 | char str[24]; |
| Wayne Roberts |
1:4a05f91c9c38 | 322 | unsigned n, macStart; |
| Wayne Roberts |
1:4a05f91c9c38 | 323 | wifiType_t wt; |
| Wayne Roberts |
1:4a05f91c9c38 | 324 | wifiChanInfo_t ci; |
| Wayne Roberts |
1:4a05f91c9c38 | 325 | wt.octet = result[0]; |
| Wayne Roberts |
1:4a05f91c9c38 | 326 | ci.octet = result[1]; |
| Wayne Roberts |
1:4a05f91c9c38 | 327 | out[0] = 0; |
| Wayne Roberts |
1:4a05f91c9c38 | 328 | strcat(out, "802.11"); |
| Wayne Roberts |
1:4a05f91c9c38 | 329 | switch (wt.bits.signal) { |
| Wayne Roberts |
1:4a05f91c9c38 | 330 | case 1: strcat(out, "b"); break; |
| Wayne Roberts |
1:4a05f91c9c38 | 331 | case 2: strcat(out, "g"); break; |
| Wayne Roberts |
1:4a05f91c9c38 | 332 | case 3: strcat(out, "n"); break; |
| Wayne Roberts |
1:4a05f91c9c38 | 333 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 334 | sprintf(str, " %s %.1fMbps", wifiDatarates[wt.bits.datarate].txt, wifiDatarates[wt.bits.datarate].Mbps); |
| Wayne Roberts |
1:4a05f91c9c38 | 335 | strcat(out, str); |
| Wayne Roberts |
1:4a05f91c9c38 | 336 | strcat(out, " "); |
| Wayne Roberts |
1:4a05f91c9c38 | 337 | |
| Wayne Roberts |
1:4a05f91c9c38 | 338 | sprintf(str, "ch%u ", ci.bits.channelID); |
| Wayne Roberts |
1:4a05f91c9c38 | 339 | strcat(out, str); |
| Wayne Roberts |
1:4a05f91c9c38 | 340 | switch (ci.bits.channelID) { |
| Wayne Roberts |
1:4a05f91c9c38 | 341 | // table 10-5 |
| Wayne Roberts |
1:4a05f91c9c38 | 342 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 343 | strcat(out, " "); |
| Wayne Roberts |
1:4a05f91c9c38 | 344 | sprintf(str, "mv:%u ", ci.bits.macValidationID); |
| Wayne Roberts |
1:4a05f91c9c38 | 345 | strcat(out, str); |
| Wayne Roberts |
1:4a05f91c9c38 | 346 | switch (ci.bits.macValidationID) { |
| Wayne Roberts |
1:4a05f91c9c38 | 347 | case 1: strcat(out, "gateway"); break; |
| Wayne Roberts |
1:4a05f91c9c38 | 348 | case 2: strcat(out, "phone"); break; |
| Wayne Roberts |
1:4a05f91c9c38 | 349 | case 3: strcat(out, "?"); break; |
| Wayne Roberts |
1:4a05f91c9c38 | 350 | // table 10.8 |
| Wayne Roberts |
1:4a05f91c9c38 | 351 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 352 | |
| Wayne Roberts |
1:4a05f91c9c38 | 353 | strcat(out, " "); |
| Wayne Roberts |
1:4a05f91c9c38 | 354 | |
| Wayne Roberts |
1:4a05f91c9c38 | 355 | if (wifiResultFormatBasic) { |
| Wayne Roberts |
1:4a05f91c9c38 | 356 | macStart = 3; |
| Wayne Roberts |
1:4a05f91c9c38 | 357 | } else { |
| Wayne Roberts |
1:4a05f91c9c38 | 358 | macStart = 4; |
| Wayne Roberts |
1:4a05f91c9c38 | 359 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 360 | for (n = 0; n < 6; n++) { |
| Wayne Roberts |
1:4a05f91c9c38 | 361 | sprintf(str, "%02x", result[n+macStart]); |
| Wayne Roberts |
1:4a05f91c9c38 | 362 | strcat(out, str); |
| Wayne Roberts |
1:4a05f91c9c38 | 363 | if (n < 5) |
| Wayne Roberts |
1:4a05f91c9c38 | 364 | strcat(out, ":"); |
| Wayne Roberts |
1:4a05f91c9c38 | 365 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 366 | |
| Wayne Roberts |
1:4a05f91c9c38 | 367 | sprintf(str, " rssi:%d ", (int8_t)result[2]); |
| Wayne Roberts |
1:4a05f91c9c38 | 368 | strcat(out, str); |
| Wayne Roberts |
1:4a05f91c9c38 | 369 | |
| Wayne Roberts |
1:4a05f91c9c38 | 370 | if (!wifiResultFormatBasic) { |
| Wayne Roberts |
1:4a05f91c9c38 | 371 | sprintf(str, "frameCtrl:%02x ", result[3]); |
| Wayne Roberts |
1:4a05f91c9c38 | 372 | strcat(out, str); |
| Wayne Roberts |
1:4a05f91c9c38 | 373 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 374 | printf("%s\r\n", out); |
| Wayne Roberts |
1:4a05f91c9c38 | 375 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 376 | |
| Wayne Roberts |
1:4a05f91c9c38 | 377 | void take_result() |
| Wayne Roberts |
1:4a05f91c9c38 | 378 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 379 | printf("result %f, %f, %d\r\n", |
| Wayne Roberts |
1:4a05f91c9c38 | 380 | geoloc_result.lat, |
| Wayne Roberts |
1:4a05f91c9c38 | 381 | geoloc_result.lng, |
| Wayne Roberts |
1:4a05f91c9c38 | 382 | geoloc_result.accuracy |
| Wayne Roberts |
1:4a05f91c9c38 | 383 | ); |
| Wayne Roberts |
1:4a05f91c9c38 | 384 | |
| Wayne Roberts |
1:4a05f91c9c38 | 385 | /* TODO: store result to database and show on map */ |
| Wayne Roberts |
1:4a05f91c9c38 | 386 | |
| Wayne Roberts |
1:4a05f91c9c38 | 387 | if (send_reply) { |
| Wayne Roberts |
1:4a05f91c9c38 | 388 | unsigned len; |
| Wayne Roberts |
1:4a05f91c9c38 | 389 | memcpy(Radio::radio.tx_buf, remote_chip_eui, 8); |
| Wayne Roberts |
1:4a05f91c9c38 | 390 | Radio::radio.tx_buf[8] = 0; // rfu |
| Wayne Roberts |
1:4a05f91c9c38 | 391 | Radio::radio.tx_buf[9] = 0; // rfu |
| Wayne Roberts |
1:4a05f91c9c38 | 392 | len = sprintf((char*)(Radio::radio.tx_buf + HEADER_LENGTH), "%f, %f, %u", |
| Wayne Roberts |
1:4a05f91c9c38 | 393 | geoloc_result.lat, |
| Wayne Roberts |
1:4a05f91c9c38 | 394 | geoloc_result.lng, |
| Wayne Roberts |
1:4a05f91c9c38 | 395 | geoloc_result.accuracy |
| Wayne Roberts |
1:4a05f91c9c38 | 396 | ); |
| Wayne Roberts |
1:4a05f91c9c38 | 397 | Radio::Send(len + HEADER_LENGTH, 0, 0, 0); /* begin transmission */ |
| Wayne Roberts |
1:4a05f91c9c38 | 398 | send_reply = false; // sent |
| Wayne Roberts |
1:4a05f91c9c38 | 399 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 400 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 401 | |
| Wayne Roberts |
1:4a05f91c9c38 | 402 | void service() |
| Wayne Roberts |
1:4a05f91c9c38 | 403 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 404 | irq_t irq; |
| Wayne Roberts |
1:4a05f91c9c38 | 405 | irq.dword = Radio::radio.service(); |
| Wayne Roberts |
1:4a05f91c9c38 | 406 | if (irq.bits.WifiDone) { |
| Wayne Roberts |
1:4a05f91c9c38 | 407 | stat_t stat; |
| Wayne Roberts |
1:4a05f91c9c38 | 408 | uint8_t nbResults; |
| Wayne Roberts |
1:4a05f91c9c38 | 409 | json_start(); |
| Wayne Roberts |
1:4a05f91c9c38 | 410 | stat.word = Radio::radio.xfer(OPCODE_GET_WIFI_NB_RESULTS, 0, 0, NULL); |
| Wayne Roberts |
1:4a05f91c9c38 | 411 | stat.word = Radio::radio.xfer(0x0000, 0, 1, &nbResults); |
| Wayne Roberts |
1:4a05f91c9c38 | 412 | if (stat.bits.cmdStatus == CMD_DAT) { |
| Wayne Roberts |
1:4a05f91c9c38 | 413 | unsigned n; |
| Wayne Roberts |
1:4a05f91c9c38 | 414 | printf("%ums nbResults:%u\r\n", (unsigned)wifi_scan_dur, nbResults); |
| Wayne Roberts |
1:4a05f91c9c38 | 415 | for (n = 0; n < nbResults; n++) { |
| Wayne Roberts |
1:4a05f91c9c38 | 416 | uint8_t buf[3]; |
| Wayne Roberts |
1:4a05f91c9c38 | 417 | uint8_t resultBuf[22]; |
| Wayne Roberts |
1:4a05f91c9c38 | 418 | buf[0] = n; |
| Wayne Roberts |
1:4a05f91c9c38 | 419 | buf[1] = 1; // number of results in this read |
| Wayne Roberts |
1:4a05f91c9c38 | 420 | buf[2] = wifiResultFormatBasic ? 4 : 1; |
| Wayne Roberts |
1:4a05f91c9c38 | 421 | stat.word = Radio::radio.xfer(OPCODE_WIFI_READ_RESULTS, 3, 0, buf); |
| Wayne Roberts |
1:4a05f91c9c38 | 422 | // basic = 9byte length |
| Wayne Roberts |
1:4a05f91c9c38 | 423 | // full = 22byte length |
| Wayne Roberts |
1:4a05f91c9c38 | 424 | stat.word = Radio::radio.xfer(0x0000, 0, wifiResultFormatBasic ? 9 : 22, resultBuf); |
| Wayne Roberts |
1:4a05f91c9c38 | 425 | if (stat.bits.cmdStatus == CMD_DAT) { |
| Wayne Roberts |
1:4a05f91c9c38 | 426 | wifiChanInfo_t ci; |
| Wayne Roberts |
1:4a05f91c9c38 | 427 | print_wifi_result(resultBuf); |
| Wayne Roberts |
1:4a05f91c9c38 | 428 | ci.octet = resultBuf[1]; |
| Wayne Roberts |
1:4a05f91c9c38 | 429 | if (ci.bits.macValidationID == 1) // 1 is AP |
| Wayne Roberts |
1:4a05f91c9c38 | 430 | wifi_result_to_json(n == 0, resultBuf, wifiResultFormatBasic ? 3 : 4, 2); |
| Wayne Roberts |
1:4a05f91c9c38 | 431 | } else |
| Wayne Roberts |
1:4a05f91c9c38 | 432 | printf("readResult:%s\r\n", Radio::radio.cmdStatus_toString(stat.bits.cmdStatus)); |
| Wayne Roberts |
1:4a05f91c9c38 | 433 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 434 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 435 | json_end(); |
| Wayne Roberts |
1:4a05f91c9c38 | 436 | //printf("JSON %s\r\n", json); |
| Wayne Roberts |
1:4a05f91c9c38 | 437 | if (post_enable) { |
| Wayne Roberts |
1:4a05f91c9c38 | 438 | printf("post_enabled\r\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 439 | if (nbResults > MINIMUM_REQUIRED_ACCESS_POINTS) { |
| Wayne Roberts |
1:4a05f91c9c38 | 440 | post_scan_result(json, &geoloc_result.lat, &geoloc_result.lng, &geoloc_result.accuracy); |
| Wayne Roberts |
1:4a05f91c9c38 | 441 | queue.call(take_result); |
| Wayne Roberts |
1:4a05f91c9c38 | 442 | } else |
| Wayne Roberts |
1:4a05f91c9c38 | 443 | printf("only %u access points\r\n", nbResults); |
| Wayne Roberts |
1:4a05f91c9c38 | 444 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 445 | |
| Wayne Roberts |
1:4a05f91c9c38 | 446 | cfg_lora(); |
| Wayne Roberts |
1:4a05f91c9c38 | 447 | Radio::Rx(0); |
| Wayne Roberts |
1:4a05f91c9c38 | 448 | } // ..if (irq.bits.WifiDone) |
| Wayne Roberts |
1:4a05f91c9c38 | 449 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 450 | |
| Wayne Roberts |
1:4a05f91c9c38 | 451 | void radio_irq_handler() |
| Wayne Roberts |
1:4a05f91c9c38 | 452 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 453 | wifi_scan_dur = Kernel::get_ms_count() - wifi_start_at; |
| Wayne Roberts |
1:4a05f91c9c38 | 454 | queue.call(service); |
| Wayne Roberts |
1:4a05f91c9c38 | 455 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 456 | |
| Wayne Roberts |
1:4a05f91c9c38 | 457 | void txDoneCB() |
| Wayne Roberts |
1:4a05f91c9c38 | 458 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 459 | Radio::Rx(0); |
| Wayne Roberts |
1:4a05f91c9c38 | 460 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 461 | |
| Wayne Roberts |
1:4a05f91c9c38 | 462 | void parse_remote_wifi_scan(uint8_t pktLen) |
| Wayne Roberts |
1:4a05f91c9c38 | 463 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 464 | uint8_t ap_cnt = 0; |
| Wayne Roberts |
1:4a05f91c9c38 | 465 | uint8_t pkt_idx = HEADER_LENGTH; |
| Wayne Roberts |
1:4a05f91c9c38 | 466 | json_start(); |
| Wayne Roberts |
1:4a05f91c9c38 | 467 | while (pkt_idx < pktLen) { |
| Wayne Roberts |
1:4a05f91c9c38 | 468 | wifi_result_to_json(pkt_idx == HEADER_LENGTH, Radio::radio.rx_buf + pkt_idx, 0, 6); |
| Wayne Roberts |
1:4a05f91c9c38 | 469 | if (strlen(json) >= sizeof(json)) { |
| Wayne Roberts |
1:4a05f91c9c38 | 470 | printf("json-overrun\r\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 471 | return; |
| Wayne Roberts |
1:4a05f91c9c38 | 472 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 473 | pkt_idx += 7; |
| Wayne Roberts |
1:4a05f91c9c38 | 474 | ap_cnt++; |
| Wayne Roberts |
1:4a05f91c9c38 | 475 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 476 | json_end(); |
| Wayne Roberts |
1:4a05f91c9c38 | 477 | |
| Wayne Roberts |
1:4a05f91c9c38 | 478 | if (ap_cnt > MINIMUM_REQUIRED_ACCESS_POINTS) { |
| Wayne Roberts |
1:4a05f91c9c38 | 479 | post_scan_result(json, &geoloc_result.lat, &geoloc_result.lng, &geoloc_result.accuracy); |
| Wayne Roberts |
1:4a05f91c9c38 | 480 | queue.call(take_result); |
| Wayne Roberts |
1:4a05f91c9c38 | 481 | } else |
| Wayne Roberts |
1:4a05f91c9c38 | 482 | printf("only %u access points\r\n", ap_cnt); |
| Wayne Roberts |
1:4a05f91c9c38 | 483 | |
| Wayne Roberts |
1:4a05f91c9c38 | 484 | send_reply = true; |
| Wayne Roberts |
1:4a05f91c9c38 | 485 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 486 | |
| Wayne Roberts |
1:4a05f91c9c38 | 487 | void rxDoneCB(uint8_t size, float rssi, float snr) |
| Wayne Roberts |
1:4a05f91c9c38 | 488 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 489 | unsigned i; |
| Wayne Roberts |
1:4a05f91c9c38 | 490 | printf("%.1fdBm snr:%.1fdB\t", rssi, snr); |
| Wayne Roberts |
1:4a05f91c9c38 | 491 | |
| Wayne Roberts |
1:4a05f91c9c38 | 492 | for (i = 0; i < size; i++) { |
| Wayne Roberts |
1:4a05f91c9c38 | 493 | printf("%02x ", Radio::radio.rx_buf[i]); |
| Wayne Roberts |
1:4a05f91c9c38 | 494 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 495 | printf("\r\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 496 | |
| Wayne Roberts |
1:4a05f91c9c38 | 497 | for (i = 0; i < 8; i++) |
| Wayne Roberts |
1:4a05f91c9c38 | 498 | remote_chip_eui[i] = Radio::radio.rx_buf[i]; |
| Wayne Roberts |
1:4a05f91c9c38 | 499 | |
| Wayne Roberts |
1:4a05f91c9c38 | 500 | parse_remote_wifi_scan(size); |
| Wayne Roberts |
1:4a05f91c9c38 | 501 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 502 | |
| Wayne Roberts |
1:4a05f91c9c38 | 503 | const RadioEvents_t rev = { |
| Wayne Roberts |
1:4a05f91c9c38 | 504 | /* Dio0_top_half */ radio_irq_handler, |
| Wayne Roberts |
1:4a05f91c9c38 | 505 | /* TxDone_topHalf */ NULL, |
| Wayne Roberts |
1:4a05f91c9c38 | 506 | /* TxDone_botHalf */ txDoneCB, |
| Wayne Roberts |
1:4a05f91c9c38 | 507 | /* TxTimeout */ NULL, |
| Wayne Roberts |
1:4a05f91c9c38 | 508 | /* RxDone */ rxDoneCB, |
| Wayne Roberts |
1:4a05f91c9c38 | 509 | /* RxTimeout */ NULL, |
| Wayne Roberts |
1:4a05f91c9c38 | 510 | /* RxError */ NULL, |
| Wayne Roberts |
1:4a05f91c9c38 | 511 | /* FhssChangeChannel */NULL, |
| Wayne Roberts |
1:4a05f91c9c38 | 512 | /* CadDone */ NULL |
| Wayne Roberts |
1:4a05f91c9c38 | 513 | }; |
| Wayne Roberts |
1:4a05f91c9c38 | 514 | |
| Wayne Roberts |
1:4a05f91c9c38 | 515 | int main() |
| Wayne Roberts |
1:4a05f91c9c38 | 516 | { |
| Wayne Roberts |
1:4a05f91c9c38 | 517 | { /* wifi scan defaults, see LR1110 user manual section 10.2 */ |
| Wayne Roberts |
1:4a05f91c9c38 | 518 | unsigned chanmask = 0x0421; // ch1, ch6, ch11 |
| Wayne Roberts |
1:4a05f91c9c38 | 519 | unsigned timeout = 105; // in milliseconds, 100 wifi TUs (beacon interval) |
| Wayne Roberts |
1:4a05f91c9c38 | 520 | |
| Wayne Roberts |
1:4a05f91c9c38 | 521 | wifiScan_buf[0] = 0x01; // wifi type |
| Wayne Roberts |
1:4a05f91c9c38 | 522 | wifiScan_buf[2] = chanmask; // chanmask-lo |
| Wayne Roberts |
1:4a05f91c9c38 | 523 | chanmask >>= 8; |
| Wayne Roberts |
1:4a05f91c9c38 | 524 | wifiScan_buf[1] = chanmask; // chanmask-hi |
| Wayne Roberts |
1:4a05f91c9c38 | 525 | wifiScan_buf[3] = 0x02; // acqMode |
| Wayne Roberts |
1:4a05f91c9c38 | 526 | wifiScan_buf[4] = 0x0a; // NbMaxRes |
| Wayne Roberts |
1:4a05f91c9c38 | 527 | wifiScan_buf[5] = 0x10; // NbScanPerChan |
| Wayne Roberts |
1:4a05f91c9c38 | 528 | wifiScan_buf[7] = timeout; // Timeout-lo |
| Wayne Roberts |
1:4a05f91c9c38 | 529 | timeout >>= 8; |
| Wayne Roberts |
1:4a05f91c9c38 | 530 | wifiScan_buf[6] = timeout; // Timeout-hi |
| Wayne Roberts |
1:4a05f91c9c38 | 531 | wifiScan_buf[8] = 0x00; // AbortOnTimeout |
| Wayne Roberts |
1:4a05f91c9c38 | 532 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 533 | |
| Wayne Roberts |
1:4a05f91c9c38 | 534 | serialEventCb = serialCb; |
| Wayne Roberts |
1:4a05f91c9c38 | 535 | |
| Wayne Roberts |
1:4a05f91c9c38 | 536 | if (pc.read(&serial_rx_buf, 1, serialCb) != 0) |
| Wayne Roberts |
1:4a05f91c9c38 | 537 | printf("serial-read-fail\r\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 538 | |
| Wayne Roberts |
1:4a05f91c9c38 | 539 | // Connect to the network with the default networking interface |
| Wayne Roberts |
1:4a05f91c9c38 | 540 | // if you use WiFi: see mbed_app.json for the credentials |
| Wayne Roberts |
1:4a05f91c9c38 | 541 | network = connect_to_default_network_interface(); |
| Wayne Roberts |
1:4a05f91c9c38 | 542 | if (!network) { |
| Wayne Roberts |
1:4a05f91c9c38 | 543 | printf("Cannot connect to the network, see serial output\n"); |
| Wayne Roberts |
1:4a05f91c9c38 | 544 | return 1; |
| Wayne Roberts |
1:4a05f91c9c38 | 545 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 546 | |
| Wayne Roberts |
1:4a05f91c9c38 | 547 | Radio::Init(&rev); |
| Wayne Roberts |
1:4a05f91c9c38 | 548 | |
| Wayne Roberts |
1:4a05f91c9c38 | 549 | Radio::Standby(); |
| Wayne Roberts |
1:4a05f91c9c38 | 550 | cfg_lora(); |
| Wayne Roberts |
1:4a05f91c9c38 | 551 | Radio::Rx(0); |
| Wayne Roberts |
1:4a05f91c9c38 | 552 | |
| Wayne Roberts |
1:4a05f91c9c38 | 553 | queue.dispatch(); |
| Wayne Roberts |
1:4a05f91c9c38 | 554 | } |
| Wayne Roberts |
1:4a05f91c9c38 | 555 |