#include "onvif_server.h" #include "rtsp_server.h" #include #include #include "utils.h" WebServer onvifServer(8000); WiFiUDP onvifUDP; String getCapabilitiesResponse() { String ip = WiFi.localIP().toString(); return "" "" "" "" "" "" "http://" + ip + ":8000/onvif/device_service" "" "" "" "" ""; } String getDeviceInfoResponse() { return "" "" "" "" "ESP32-CAM-J0X" "ONVIF-ESPCAM" "1.0" "J0X-00001" "ESP32CAM-J0X" "" "" ""; } void handle_onvif_soap() { String req = onvifServer.arg(0); if (req.indexOf("GetCapabilities") > 0) { onvifServer.send(200, "application/soap+xml", getCapabilitiesResponse()); } else if (req.indexOf("GetStreamUri") > 0) { onvifServer.send(200, "application/soap+xml", getStreamUriResponse()); } else if (req.indexOf("GetDeviceInformation") > 0) { onvifServer.send(200, "application/soap+xml", getDeviceInfoResponse()); } else { onvifServer.send(200, "application/soap+xml", ""); } } void handle_onvif_discovery() { int packetSize = onvifUDP.parsePacket(); if (packetSize) { char packet[1024]; int len = onvifUDP.read(packet, 1024); packet[len] = 0; String pktStr = String(packet); if (pktStr.indexOf("Probe") > 0) { String ip = WiFi.localIP().toString(); String resp = "" "" "" "" "" "
urn:uuid:esp32-cam-onvif
" "dn:NetworkVideoTransmitter" "http://" + ip + ":8000/onvif/device_service" "onvif://www.onvif.org/Profile/Streaming" "1" "
" "
" "
" "
"; onvifUDP.beginPacket(onvifUDP.remoteIP(), onvifUDP.remotePort()); onvifUDP.write((const uint8_t*)resp.c_str(), resp.length()); onvifUDP.endPacket(); } } } void onvif_server_start() { onvifServer.on("/onvif/device_service", HTTP_POST, handle_onvif_soap); onvifServer.begin(); onvifUDP.beginMulticast(WiFi.localIP(), IPAddress(239,255,255,250), 3702); Serial.println("[INFO] ONVIF server started."); } void onvif_server_loop() { onvifServer.handleClient(); handle_onvif_discovery(); }