esp32cam代码
#include "esp_camera.h"
#include <WiFi.h>
#define CAMERA_MODEL_AI_THINKER // Has PSRAM
#include "camera_pins.h"
char* ssid = "xxx"; //wifi名
char* password = "xxxxxxxxx"; //wifi密码
char* ip = "xxx.xxx.xxx.xx"; //服务器ip地址
uint16_t port = 90; //服务器端口
WiFiClient client;
camera_fb_t* fb;
// StaticJsonDocument<1024*8> jsonBuffer;
uint32_t len = 0;
char* data;
void dataCopy(uint8_t* dest, uint8_t* src, size_t len);
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println();
WiFi.begin(ssid, password);
Serial.print("WiFi connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
};
Serial.println();
Serial.println("WiFi connected");
Serial.print("Client connecting");
while(!client.connect(ip, port)){
delay(500);
Serial.print(".");
};
Serial.println();
Serial.println("Client connected");
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;
// if PSRAM IC present, init with UXGA resolution and higher JPEG quality
// for larger pre-allocated frame buffer.
if(psramFound()){
config.frame_size = FRAMESIZE_UXGA;
config.jpeg_quality = 1;
config.fb_count = 2;
Serial.println("psramFound");
} else {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 50;
config.fb_count = 1;
Serial.println("psramNotFound");
}
#if defined(CAMERA_MODEL_ESP_EYE)
pinMode(13, INPUT_PULLUP);
pinMode(14, INPUT_PULLUP);
#endif
// camera init
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
sensor_t * s = esp_camera_sensor_get();
// initial sensors are flipped vertically and colors are a bit saturated
if (s->id.PID == OV3660_PID) {
s->set_vflip(s, 1); // flip it back
s->set_brightness(s, 1); // up the brightness just a bit
s->set_saturation(s, -2); // lower the saturation
}
// drop down frame size for higher initial frame rate
s->set_framesize(s, FRAMESIZE_QVGA);
#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
s->set_vflip(s, 1);
s->set_hmirror(s, 1);
#endif
}
void loop() {
//1.获取摄像头摄取的图片数据
fb = esp_camera_fb_get();
//2.图片数据大小格式化
uint32_t len = (uint32_t)fb->len;
//3.先发送图片数据大小
client.write((uint8_t *)&len, sizeof(len));
Serial.println(len);
//4.发送图片数据
client.write((uint8_t*)fb->buf, len);
//5.释放数据指针
esp_camera_fb_return(fb);
}
服务器代码
// server.js
const net = require('net')
const { Buffer } = require('node:buffer');
const { writeFile } =require('node:fs')
const server = net.createServer()
// 存储未处理的不完整的数据包
let dataBuffer = Buffer.alloc(0);
server.listen('8080', ()=>{console.log('开始监听')})
server.on('connection', socket => {
console.log('新用户连接')
socket.on('data', chunk => {
dataBuffer = Buffer.concat([dataBuffer, chunk])
while(dataBuffer.length > 4){
var len = dataBuffer.readUInt32LE()
if(dataBuffer.length < len + 4) break;
console.log(len)
writeFile('./image/img.jpg', dataBuffer.slice(4, len + 4), (err) => {
if (err) throw err;
console.log('The file has been saved!');
});
dataBuffer = dataBuffer.subarray(len + 4)
}
})
})
server.on('close',()=>{
console.log('client disconnection')
})
process.on('uncaughtException',(error)=>{
console.log('error:' + error)
})
具体细节后续更新……
版权声明:本文为qq_62573253原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。