Ejemplo n.º 1
0
  PROCESS_THREAD(sense_process, ev, data) {
  PROCESS_BEGIN();

  etimer_set(&timer, CLOCK_SECOND*20);
  make_url();

  while (1) {
    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer));

    process_start(&httpd_ws_process, NULL);

    post_json();
    etimer_reset(&timer);
  }

  PROCESS_END();
}
Ejemplo n.º 2
0
void ICACHE_FLASH_ATTR server_recv_cb(void *arg, char *http_raw, unsigned short length) {
    struct espconn *pespconn = (struct espconn *)arg;
    //print("[server_recv_cb] Received data:");

    char method[10];
    char path[60];
    char headers[60];
    char body[256];
    parse_http(http_raw, length, method, path, headers, body);

    int GET = (os_strcmp(method, "GET") == 0);
    int POST = (os_strcmp(method, "POST") == 0);

    if (GET) { // No body if not [post/put/patch]ing

        // Static files

        if (os_strcmp(path, "/base.css") == 0) { send_ok(pespconn, base_css); }
        else if (os_strcmp(path, "/connect.js") == 0) { send_ok(pespconn, connect_js); }
        else if (os_strcmp(path, "/register.js") == 0) { send_ok(pespconn, register_js); }

        // JSON responses

        else if (os_strcmp(path, "/connection.json") == 0) {
            int station_connect_status = wifi_station_get_connect_status();

            if (station_connect_status == STATION_GOT_IP) {
                struct ip_info ipConfig;
                wifi_get_ip_info(STATION_IF, &ipConfig);
                char json_str[54];
                os_sprintf(json_str, "{\"status\": \"connected\", \"ip\": \"%d.%d.%d.%d\"}", IP2STR(&ipConfig.ip));
                send_json(pespconn, json_str);
            }

            else {
                char *status_str;

                if (connection_status == CONNECTION_UNCONFIGURED) status_str = "unconfigured";
                else
                switch (station_connect_status) {
                    case STATION_CONNECTING: status_str = "connecting"; break;
                    case STATION_WRONG_PASSWORD: status_str = "failed"; break;
                    case STATION_NO_AP_FOUND: status_str = "failed"; break;
                    case STATION_CONNECT_FAIL: status_str = "failed"; break;
                }

                char json_str[54];
                os_sprintf(json_str, "{\"status\": \"%s\"}", status_str);
                send_json(pespconn, json_str);
            }

        }

        else if (os_strcmp(path, "/registration.json") == 0) {
            char *status_str;

            switch (registration_status) {
                case REGISTER_UNREGISTERED: status_str = "unregistered"; break;
                case REGISTER_REGISTERING: status_str = "registering"; break;
                case REGISTER_REGISTERED: status_str = "registered"; break;
                case REGISTER_FAILED: status_str = "failed"; break;
            }

            char json_str[54];
            os_sprintf(json_str, "{\"status\": \"%s\"}", status_str);
            send_json(pespconn, json_str);
        }

        // HTML pages

        else if (os_strcmp(path, "/read") == 0) {
            if (registration_status == REGISTER_REGISTERED) {
                char temp_json_str[128];
                char hum_json_str[128];
                measurement_json(temp_json_str, "temperature", "F", last_temp);
                measurement_json(hum_json_str, "humidity", "%", last_hum);
                char full_json_str[256] = "";
                strcat(full_json_str, temp_json_str);
                strcat(full_json_str, hum_json_str);
                full_json_str[os_strlen(temp_json_str)+os_strlen(hum_json_str)] = 0;
                send_ok_templated(pespconn, full_json_str);
            } else {
                send_ok_templated(pespconn, last_unknown);
            }

        }

        else if (os_strcmp(path, "/register") == 0) {
            send_ok_templated(pespconn, register_html);
        }

        else if (os_strcmp(path, "/scan.json") == 0) {
            char json_str[256] = "[";
            
            int si = 0;
            for (; si < n_scanned; si++) {
                char json_obj[100];
                os_sprintf(json_obj, "{\"ssid\": \"%s\", \"rssi\": %d}", scanned_stations[si], scanned_dbs[si]);
                os_strcat(json_str, json_obj);
                if (si < n_scanned - 1) {
                    os_strcat(json_str, ",");
                } else {
                    os_strcat(json_str, "]");
                }
            }

            send_json(pespconn, json_str);
        }

        else if (os_strcmp(path, "/") == 0) {
            send_ok_templated(pespconn, index_html);
        }

        else {
            send_404(pespconn);
        }

        return;
    }

    else if (POST) {

        // Parse JSON with jsmn
        jsmn_parser parser;
        jsmn_init(&parser);
        jsmntok_t tokens[32];
        jsmnerr_t r;
        r = jsmn_parse(&parser, body, 1024, tokens, 256);
        if (r < 0) {
            //print("JSON Parse error?");
            return;
        }

        // Look for ssid and pass
        char station_ssid[20];
        char station_pass[20];

        //print("JSON Parse success?");

        if (os_strcmp(path, "/connect.json") == 0) {
            // Parse ssid and pass from JSON
            int ti = 0;
            int has_ssid = 0;
            int has_pass = 0;
            int on_ssid = 0;
            int on_pass = 0;
            for(; tokens[ti].end; ti++) {
                char tv[256];
                token_string(tv, body, tokens[ti]);
                if (on_ssid) {
                    //print("Found ssid");
                    on_ssid = 0;
                    os_strcpy(station_ssid, tv);
                    has_ssid = 1;
                }
                if (on_pass) {
                    //print("Found pass");
                    on_pass = 0;
                    os_strcpy(station_pass, tv);
                    has_pass = 1;
                    if (has_ssid) { break; }
                }
                on_ssid = ti % 2 == 1 && os_strcmp(tv, "ssid") == 0;
                on_pass = ti % 2 == 1 && os_strcmp(tv, "pass") == 0;
            }

            //ets_uart_printf("Hopefully ssid=%s and pass=%s\r\n", station_ssid, station_pass);
            send_ok(pespconn, "<h1>maia</h1><p>OK</p>");
            setup_station(station_ssid, station_pass);
        }

        else if (os_strcmp(path, "/register.json") == 0) {
            // Parse email and password from JSON
            int ti = 0;
            char user_email[64];
            char user_password[64];
            int has_email = 0;
            int has_password = 0;
            int on_email = 0;
            int on_password = 0;
            for(; tokens[ti].end; ti++) {
                char tv[256];
                token_string(tv, body, tokens[ti]);
                if (on_email) {
                    //print("Found email");
                    on_email = 0;
                    os_strcpy(user_email, tv);
                    has_email = 1;
                }
                if (on_password) {
                    //print("Found password");
                    on_password = 0;
                    os_strcpy(user_password, tv);
                    has_password = 1;
                    if (has_email) { break; }
                }
                on_email = ti % 2 == 1 && os_strcmp(tv, "email") == 0;
                on_password = ti % 2 == 1 && os_strcmp(tv, "password") == 0;
            }

            char register_response[256];
            os_sprintf(register_response, "Registering as %d...", DEVICE_ID);
            send_ok_templated(pespconn, register_response);
            char register_json[256];
            os_sprintf(register_json, "{"
                "\"device_id\": \"0x%x\","
                "\"kind\": \"%s\","
                "\"email\": \"%s\","
                "\"password\": \"%s\""
            "}", DEVICE_ID, DEVICE_KIND, user_email, user_password);
            registration_status = REGISTER_REGISTERING;
            post_json(API_BASE "/devices.json", register_json);
        }

        else {
            send_404(pespconn);
        }

        return;
    }

    send_404(pespconn);
    return;
}
Ejemplo n.º 3
0
void post_measurement(char *kind, char *unit, char *value) {
    char json_str[128] = "";
    measurement_json(json_str, kind, unit, value);
    post_json(API_BASE "/measurements.json", json_str);
}