Add local network camera monitor (#138)
This feature is located at `http://[camera-ip]/monitor` and gives quick access to up to 5 cameras running the web server example. Features: - Finds up to 5 cameras in the local network through mDNS - Grabs periodicaly and image from each camera (period can be set or turned off) - Cycles the cameras at given period (off when camera is selected manually) - Shows basic info for each camera (model, sensor, resolution) - Allows for easy access to each camer's control panel - Allows change of resolution and XCLK - Can save current snapshotidfv3.3.1
parent
3a734c0d69
commit
0ba76f0a59
|
@ -13,6 +13,7 @@ set(COMPONENT_REQUIRES
|
||||||
set(COMPONENT_EMBED_FILES
|
set(COMPONENT_EMBED_FILES
|
||||||
"www/index_ov2640.html.gz"
|
"www/index_ov2640.html.gz"
|
||||||
"www/index_ov3660.html.gz"
|
"www/index_ov3660.html.gz"
|
||||||
"www/index_ov5640.html.gz")
|
"www/index_ov5640.html.gz"
|
||||||
|
"www/monitor.html.gz")
|
||||||
|
|
||||||
register_component()
|
register_component()
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
menu "Camera Web Server"
|
menu "Camera Web Server"
|
||||||
|
|
||||||
menu "WiFi Settings"
|
menu "WiFi Settings"
|
||||||
|
config ESP_HOST_NAME
|
||||||
|
string "Camera Host Name"
|
||||||
|
default ""
|
||||||
|
help
|
||||||
|
Hostname that the camera will advertise over mDNS.
|
||||||
|
|
||||||
config ESP_WIFI_SSID
|
config ESP_WIFI_SSID
|
||||||
string "WiFi STA SSID"
|
string "WiFi STA SSID"
|
||||||
default ""
|
default ""
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
//#include "camera_index.h"
|
//#include "camera_index.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "app_mdns.h"
|
#include "app_mdns.h"
|
||||||
|
#include "app_camera.h"
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG)
|
#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG)
|
||||||
#include "esp32-hal-log.h"
|
#include "esp32-hal-log.h"
|
||||||
|
@ -840,6 +841,9 @@ static esp_err_t status_handler(httpd_req_t *req)
|
||||||
p+=print_reg(p, s, 0x132, 0xFF);
|
p+=print_reg(p, s, 0x132, 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p += sprintf(p, "\"board\":\"%s\",", CAM_BOARD);
|
||||||
|
p += sprintf(p, "\"xclk\":%u,", s->xclk_freq_hz / 1000000);
|
||||||
|
p += sprintf(p, "\"pixformat\":%u,", s->pixformat);
|
||||||
p += sprintf(p, "\"framesize\":%u,", s->status.framesize);
|
p += sprintf(p, "\"framesize\":%u,", s->status.framesize);
|
||||||
p += sprintf(p, "\"quality\":%u,", s->status.quality);
|
p += sprintf(p, "\"quality\":%u,", s->status.quality);
|
||||||
p += sprintf(p, "\"brightness\":%d,", s->status.brightness);
|
p += sprintf(p, "\"brightness\":%d,", s->status.brightness);
|
||||||
|
@ -1086,10 +1090,20 @@ static esp_err_t index_handler(httpd_req_t *req)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static esp_err_t monitor_handler(httpd_req_t *req)
|
||||||
|
{
|
||||||
|
extern const unsigned char monitor_html_gz_start[] asm("_binary_monitor_html_gz_start");
|
||||||
|
extern const unsigned char monitor_html_gz_end[] asm("_binary_monitor_html_gz_end");
|
||||||
|
size_t monitor_html_gz_len = monitor_html_gz_end - monitor_html_gz_start;
|
||||||
|
httpd_resp_set_type(req, "text/html");
|
||||||
|
httpd_resp_set_hdr(req, "Content-Encoding", "gzip");
|
||||||
|
return httpd_resp_send(req, (const char *)monitor_html_gz_start, monitor_html_gz_len);
|
||||||
|
}
|
||||||
|
|
||||||
void app_httpd_main()
|
void app_httpd_main()
|
||||||
{
|
{
|
||||||
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
|
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
|
||||||
config.max_uri_handlers = 10;
|
config.max_uri_handlers = 12;
|
||||||
|
|
||||||
httpd_uri_t index_uri = {
|
httpd_uri_t index_uri = {
|
||||||
.uri = "/",
|
.uri = "/",
|
||||||
|
@ -1157,6 +1171,12 @@ void app_httpd_main()
|
||||||
.handler = mdns_handler,
|
.handler = mdns_handler,
|
||||||
.user_ctx = NULL};
|
.user_ctx = NULL};
|
||||||
|
|
||||||
|
httpd_uri_t monitor_uri = {
|
||||||
|
.uri = "/monitor",
|
||||||
|
.method = HTTP_GET,
|
||||||
|
.handler = monitor_handler,
|
||||||
|
.user_ctx = NULL};
|
||||||
|
|
||||||
ra_filter_init(&ra_filter, 20);
|
ra_filter_init(&ra_filter, 20);
|
||||||
|
|
||||||
#if CONFIG_ESP_FACE_DETECT_ENABLED
|
#if CONFIG_ESP_FACE_DETECT_ENABLED
|
||||||
|
@ -1201,6 +1221,7 @@ void app_httpd_main()
|
||||||
httpd_register_uri_handler(camera_httpd, &win_uri);
|
httpd_register_uri_handler(camera_httpd, &win_uri);
|
||||||
|
|
||||||
httpd_register_uri_handler(camera_httpd, &mdns_uri);
|
httpd_register_uri_handler(camera_httpd, &mdns_uri);
|
||||||
|
httpd_register_uri_handler(camera_httpd, &monitor_uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
config.server_port += 1;
|
config.server_port += 1;
|
||||||
|
|
|
@ -177,11 +177,6 @@ void app_mdns_main()
|
||||||
}
|
}
|
||||||
xSemaphoreGive(query_lock);
|
xSemaphoreGive(query_lock);
|
||||||
|
|
||||||
if (esp_read_mac(mac, ESP_MAC_WIFI_STA) != ESP_OK) {
|
|
||||||
ESP_LOGE(TAG, "esp_read_mac() Failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sensor_t * s = esp_camera_sensor_get();
|
sensor_t * s = esp_camera_sensor_get();
|
||||||
switch(s->id.PID){
|
switch(s->id.PID){
|
||||||
case OV2640_PID: model = "OV2640"; break;
|
case OV2640_PID: model = "OV2640"; break;
|
||||||
|
@ -190,7 +185,17 @@ void app_mdns_main()
|
||||||
case OV7725_PID: model = "OV7725"; break;
|
case OV7725_PID: model = "OV7725"; break;
|
||||||
default: model = "UNKNOWN"; break;
|
default: model = "UNKNOWN"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strlen(CONFIG_ESP_HOST_NAME) > 0) {
|
||||||
|
snprintf(iname, 64, "%s", CONFIG_ESP_HOST_NAME);
|
||||||
|
} else {
|
||||||
|
if (esp_read_mac(mac, ESP_MAC_WIFI_STA) != ESP_OK) {
|
||||||
|
ESP_LOGE(TAG, "esp_read_mac() Failed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
snprintf(iname, 64, "%s-%s-%02X%02X%02X", CAM_BOARD, model, mac[3], mac[4], mac[5]);
|
snprintf(iname, 64, "%s-%s-%02X%02X%02X", CAM_BOARD, model, mac[3], mac[4], mac[5]);
|
||||||
|
}
|
||||||
|
|
||||||
snprintf(framesize, 4, "%d", s->status.framesize);
|
snprintf(framesize, 4, "%d", s->status.framesize);
|
||||||
snprintf(pixformat, 4, "%d", s->pixformat);
|
snprintf(pixformat, 4, "%d", s->pixformat);
|
||||||
|
|
||||||
|
|
|
@ -9,3 +9,4 @@
|
||||||
COMPONENT_EMBED_FILES := www/index_ov2640.html.gz
|
COMPONENT_EMBED_FILES := www/index_ov2640.html.gz
|
||||||
COMPONENT_EMBED_FILES += www/index_ov3660.html.gz
|
COMPONENT_EMBED_FILES += www/index_ov3660.html.gz
|
||||||
COMPONENT_EMBED_FILES += www/index_ov5640.html.gz
|
COMPONENT_EMBED_FILES += www/index_ov5640.html.gz
|
||||||
|
COMPONENT_EMBED_FILES += www/monitor.html.gz
|
||||||
|
|
File diff suppressed because one or more lines are too long
Binary file not shown.
Loading…
Reference in New Issue