123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- /*
- Rui Santos
- Complete project details at https://RandomNerdTutorials.com/esp32-cam-post-image-photo-server/
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files.
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- */
- #include <Arduino.h>
- #include <WiFi.h>
- #include "soc/soc.h"
- #include "soc/rtc_cntl_reg.h"
- #include "esp_camera.h"
- #include <ArduinoWebsockets.h>
- const char* ssid = "goldin_lab1";
- const char* password = "goldin53743001";
- String serverName = "60.250.156.230"; // REPLACE WITH YOUR Raspberry Pi IP ADDRESS
- //String serverName = "example.com"; // OR REPLACE WITH YOUR DOMAIN NAME
- String serverPath = "/upload.php"; // The default serverPath should be upload.php
- const int serverPort = 80;
- const char* websocket_server_host = "60.250.156.230";
- const uint16_t websocket_server_port = 8093;
- void startCameraServer();
- using namespace websockets;
- WebsocketsClient webSocketClient;
- WiFiClient client;
- // CAMERA_MODEL_AI_THINKER
- #define PWDN_GPIO_NUM 32
- #define RESET_GPIO_NUM -1
- #define XCLK_GPIO_NUM 0
- #define SIOD_GPIO_NUM 26
- #define SIOC_GPIO_NUM 27
- #define Y9_GPIO_NUM 35
- #define Y8_GPIO_NUM 34
- #define Y7_GPIO_NUM 39
- #define Y6_GPIO_NUM 36
- #define Y5_GPIO_NUM 21
- #define Y4_GPIO_NUM 19
- #define Y3_GPIO_NUM 18
- #define Y2_GPIO_NUM 5
- #define VSYNC_GPIO_NUM 25
- #define HREF_GPIO_NUM 23
- #define PCLK_GPIO_NUM 22
- const int timerInterval = 30000; // time between each HTTP POST image
- unsigned long previousMillis = 0; // last time image was sent
- void setup() {
- WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
- Serial.begin(115200);
- webSocketClient.send("Hi Server!");
-
- WiFi.mode(WIFI_STA);
- Serial.println();
- Serial.print("Connecting to ");
- Serial.println(ssid);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) {
- Serial.print(".");
- delay(500);
- }
- Serial.println();
- Serial.print("ESP32-CAM IP Address: ");
- Serial.println(WiFi.localIP());
- camera_config_t config;
- config.ledc_channel = LEDC_CHANNEL_0;
- config.ledc_timer = LEDC_TIMER_0;
- config.pin_d0 = Y2_GPIO_NUM;
- config.pin_d1 = Y3_GPIO_NUM;
- config.pin_d2 = Y4_GPIO_NUM;
- config.pin_d3 = Y5_GPIO_NUM;
- config.pin_d4 = Y6_GPIO_NUM;
- config.pin_d5 = Y7_GPIO_NUM;
- config.pin_d6 = Y8_GPIO_NUM;
- config.pin_d7 = Y9_GPIO_NUM;
- config.pin_xclk = XCLK_GPIO_NUM;
- config.pin_pclk = PCLK_GPIO_NUM;
- config.pin_vsync = VSYNC_GPIO_NUM;
- config.pin_href = HREF_GPIO_NUM;
- config.pin_sscb_sda = SIOD_GPIO_NUM;
- config.pin_sscb_scl = SIOC_GPIO_NUM;
- config.pin_pwdn = PWDN_GPIO_NUM;
- config.pin_reset = RESET_GPIO_NUM;
- config.xclk_freq_hz = 20000000;
- config.pixel_format = PIXFORMAT_JPEG;
- // init with high specs to pre-allocate larger buffers
- if(psramFound()){
- config.frame_size = FRAMESIZE_SVGA;
- config.jpeg_quality = 10; //0-63 lower number means higher quality
- config.fb_count = 2;
- } else {
- config.frame_size = FRAMESIZE_CIF;
- config.jpeg_quality = 12; //0-63 lower number means higher quality
- config.fb_count = 1;
- }
-
- // camera init
- esp_err_t err = esp_camera_init(&config);
- if (err != ESP_OK) {
- Serial.printf("Camera init failed with error 0x%x", err);
- delay(1000);
- ESP.restart();
- }
- sendPhoto();
- while(!webSocketClient.connect(websocket_server_host, websocket_server_port, "/")){
- delay(500);
- Serial.print(".");
- }
- Serial.println("Websocket Connected!");
- }
- void loop() {
- unsigned long currentMillis = millis();
- if (currentMillis - previousMillis >= timerInterval) {
- sendPhoto();
- previousMillis = currentMillis;
- }
- }
- String sendPhoto() {
- String getAll;
- String getBody;
-
-
- camera_fb_t * fb = NULL;
- fb = esp_camera_fb_get();
- if(!fb) {
- Serial.println("Camera capture failed");
- delay(1000);
- ESP.restart();
- }
- webSocketClientent.sendBinary((const char*) fb->buf, fb->len);
- while(!webSocketClient.connect(websocket_server_host, websocket_server_port, "/")){
- delay(500);
- Serial.print(".");
- }
- Serial.println("Websocket Connected!");
-
- Serial.println("Connecting to server: " + serverName);
- if (client.connect(serverName.c_str(), serverPort)) {
- Serial.println("Connection successful!");
- String head = "--RandomNerdTutorials\r\nContent-Disposition: form-data; name=\"imageFile\"; filename=\"esp32-cam.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n";
- String tail = "\r\n--RandomNerdTutorials--\r\n";
- uint32_t imageLen = fb->len;
- uint32_t extraLen = head.length() + tail.length();
- uint32_t totalLen = imageLen + extraLen;
-
- client.println("POST " + serverPath + " HTTP/1.1");
- client.println("Host: " + serverName);
- client.println("Content-Length: " + String(totalLen));
- client.println("Content-Type: multipart/form-data; boundary=RandomNerdTutorials");
- client.println();
- client.print(head);
-
- uint8_t *fbBuf = fb->buf;
- size_t fbLen = fb->len;
- for (size_t n=0; n<fbLen; n=n+1024) {
- if (n+1024 < fbLen) {
- client.write(fbBuf, 1024);
- fbBuf += 1024;
- }
- else if (fbLen%1024>0) {
- size_t remainder = fbLen%1024;
- client.write(fbBuf, remainder);
- }
- }
- client.print(tail);
-
- esp_camera_fb_return(fb);
-
- int timoutTimer = 10000;
- long startTimer = millis();
- boolean state = false;
-
- while ((startTimer + timoutTimer) > millis()) {
- Serial.print(".");
- delay(100);
- while (client.available()) {
- char c = client.read();
- if (c == '\n') {
- if (getAll.length()==0) { state=true; }
- getAll = "";
- }
- else if (c != '\r') { getAll += String(c); }
- if (state==true) { getBody += String(c); }
- startTimer = millis();
- }
- if (getBody.length()>0) { break; }
- }
- Serial.println();
- client.stop();
- Serial.println(getBody);
- }
- else {
- getBody = "Connection to " + serverName + " failed.";
- Serial.println(getBody);
- }
- return getBody;
- }
|