实现海康接口
parent
ed35d74c94
commit
142fca3dd0
@ -0,0 +1,204 @@
|
||||
//
|
||||
// Created by Matthew on 2025/3/4.
|
||||
//
|
||||
|
||||
#include "HikonCtrl.h"
|
||||
#include "netcamera.h"
|
||||
#include "httpclient.h"
|
||||
#include <LogThread.h>
|
||||
|
||||
#include <SpecData_JSON.h>
|
||||
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
|
||||
HikonCtrl::~HikonCtrl()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool HikonCtrl::SetResolution(uint8_t channel, uint8_t streamID, uint32_t resX, uint32_t resY)
|
||||
{
|
||||
//流类型范围1-4,1为主流
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Streams/%u/1", m_ip.c_str(), (uint32_t)channel);
|
||||
|
||||
std::vector<uint8_t> resData;
|
||||
|
||||
int res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
||||
if (res != 0 || resData.empty())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string xmlString(resData.begin(), resData.end());
|
||||
|
||||
size_t widthStart = xmlString.find("<ResolutionWidth>");
|
||||
size_t widthEnd = xmlString.find("</ResolutionWidth>");
|
||||
if (widthStart != std::string::npos && widthEnd != std::string::npos) {
|
||||
widthStart += std::string("<ResolutionWidth>").length();
|
||||
xmlString.replace(widthStart, widthEnd - widthStart, std::to_string(resX));
|
||||
}
|
||||
|
||||
size_t heightStart = xmlString.find("<ResolutionHeigth>");
|
||||
size_t heightEnd = xmlString.find("</ResolutionHeigth>");
|
||||
if (heightStart != std::string::npos && heightEnd != std::string::npos) {
|
||||
heightStart += std::string("<ResolutionHeigth>").length();
|
||||
xmlString.replace(heightStart, heightEnd - heightStart, std::to_string(resY));
|
||||
}
|
||||
|
||||
res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
||||
|
||||
if (res != 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool HikonCtrl::SetOsd(uint8_t channel, std::string osdstring, uint8_t pos)
|
||||
{
|
||||
// /LAPI/V1.0/Channels/<ID>/Media/OSDs/Contents
|
||||
//左上OSD
|
||||
|
||||
bool hasDateTime = (osdstring.find("$$DATETIME$$") != std::string::npos);
|
||||
size_t posi = osdstring.find("$$DATETIME$$");
|
||||
if (posi != std::string::npos) {
|
||||
size_t endPos = posi + 12;
|
||||
while (endPos < osdstring.size() && (osdstring[endPos] == ' ' || osdstring[endPos] == '\n')) {
|
||||
endPos++;
|
||||
}
|
||||
osdstring.erase(posi, endPos - posi);
|
||||
}
|
||||
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Pictures/%u/MultiOSDV2", m_ip.c_str(), (uint32_t)channel);
|
||||
std::vector<uint8_t> resData;
|
||||
std::replace(osdstring.begin(), osdstring.end(), '\n', '^');
|
||||
string xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><MultiLineOSD><DisplayTime><Enable>" + string(hasDateTime ? "true" : "false") + "</Enable><PosX>8</PosX><PosY>0</PosY></DisplayTime><OSD><ID>1</ID><Enable>false</Enable><Text>"+ osdstring+ "</Text><x>8</x><y>" + string(hasDateTime ? "24" : "0") + "</y></MultiLineOSD>";
|
||||
int res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
||||
return res;
|
||||
}
|
||||
|
||||
void HikonCtrl::EnableOsd(bool enable, uint8_t channel)
|
||||
{
|
||||
//航煜 只能显示时间和一个OSD
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Pictures/%u/MultiOSDV2", m_ip.c_str(), (uint32_t)channel);
|
||||
|
||||
std::vector<uint8_t> resData;
|
||||
|
||||
int res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
||||
if (res != 0 || resData.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
std::string xmlString(resData.begin(), resData.end());
|
||||
|
||||
std::string enableStartTag = "<Enable>";
|
||||
std::string enableEndTag = "</Enable>";
|
||||
|
||||
size_t pos = 0;
|
||||
while ((pos = xmlString.find(enableStartTag, pos)) != std::string::npos) {
|
||||
size_t startPos = pos + enableStartTag.length();
|
||||
size_t endPos = xmlString.find(enableEndTag, startPos);
|
||||
if (endPos == std::string::npos) {
|
||||
break;
|
||||
}
|
||||
std::string newValue = enable ? "true" : "false";
|
||||
xmlString.replace(startPos, endPos - startPos, newValue);
|
||||
pos = endPos + enableEndTag.length();
|
||||
}
|
||||
|
||||
res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
||||
|
||||
if (res != 0)
|
||||
{
|
||||
// return;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
std::string HikonCtrl::GetStreamingUrl(uint8_t channel)
|
||||
{
|
||||
// /LAPI/V1.0/Channels/<ID>/Media/Video/Streams/<ID>/LiveStreamURL?TransType=<Tran
|
||||
// sType>&TransProtocol=<TransProtocol>
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Streams/%u/1/Transport", m_ip.c_str(), (uint32_t)channel);
|
||||
|
||||
std::vector<uint8_t> resData;
|
||||
|
||||
int res = 0;
|
||||
for (int idx = 0; idx < 10; idx++)
|
||||
{
|
||||
res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
||||
if (res == 0 && !resData.empty())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (res != 0 || resData.empty())
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
resData.push_back(0);
|
||||
const char* start = strstr((const char*)&resData[0], "<RTSPURI>");
|
||||
if (start == NULL)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
start += 9;
|
||||
const char* end = strstr(start, "</RTSPURI>");
|
||||
if (end == NULL)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
return std::string(start, end);
|
||||
}
|
||||
|
||||
bool HikonCtrl::UpdateTime(time_t ts)
|
||||
{
|
||||
// /LAPI/V1.0/System/Time
|
||||
|
||||
// <?xml version="1.0" encoding="utf-8"?>
|
||||
//<Time>
|
||||
//<DateTimeFormat>
|
||||
//<!--req,string,YYYYMMDDWhhmmss,YYYYMMDDhhmmss,MMDDYYYYWhhmmss,MMD
|
||||
// DYYYYhhmmss,DDMMYYYYWhhmmss,DDMMYYYYhhmmss-->
|
||||
//</DateTimeFormat>
|
||||
//<TimeFormat><!--req,xs:string,12hour,24hour--></TimeFormat>
|
||||
//<SystemTime><!--req,xs:datetime,” 20040503T173008+08”--></SystemTime>
|
||||
//<SyncNTPFlag><!--req,xs:string,"Sync,NoSync"--></SyncNTPFlag>
|
||||
//</Time>
|
||||
|
||||
std::string reqData = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Time><SystemTime>"
|
||||
+ FormatLocalDateTime("%d%02d%02dT%02d%02d%02d") + "+08</SystemTime></Time>";
|
||||
|
||||
std::string url = "http://" + m_ip + "/System/Time";
|
||||
std::vector<uint8_t> resData;
|
||||
int res = DoPutRequest(url.c_str(), HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, reqData.c_str(), resData);
|
||||
|
||||
if (res != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool HikonCtrl::TakePhoto(uint8_t streamID, std::vector<uint8_t>& img)
|
||||
{
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/ISAPI/Streaming/channels/1/picture?", m_ip.c_str());
|
||||
int nRet = DoGetRequest(url, HTTP_AUTH_TYPE_DIGEST, m_userName.c_str(), m_password.c_str(), m_netHandle, img);
|
||||
return nRet == 0;
|
||||
}
|
||||
|
||||
bool HikonCtrl::TakeVideo(uint8_t streamID, uint32_t duration, std::string path)
|
||||
{
|
||||
return false;
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
//
|
||||
// Created by Matthew on 2025/3/4.
|
||||
//
|
||||
|
||||
#ifndef __MICROPHOTO_HIKONCTRL_H__
|
||||
#define __MICROPHOTO_HIKONCTRL_H__
|
||||
|
||||
#include "VendorCtrl.h"
|
||||
|
||||
class HikonCtrl : public VendorCtrl
|
||||
{
|
||||
public:
|
||||
using VendorCtrl::VendorCtrl;
|
||||
virtual ~HikonCtrl();
|
||||
|
||||
virtual bool SetOsd(uint8_t channel, std::string osd, uint8_t pos);
|
||||
virtual void EnableOsd(bool enable, uint8_t channel);
|
||||
virtual std::string GetStreamingUrl(uint8_t channel);
|
||||
virtual bool UpdateTime(time_t ts);
|
||||
virtual bool TakePhoto(uint8_t streamID, std::vector<uint8_t>& img);
|
||||
virtual bool TakeVideo(uint8_t streamID, uint32_t duration, std::string path);
|
||||
virtual bool HasAuthOnStreaming() const { return true; }
|
||||
virtual bool SetResolution(uint8_t channel, uint8_t streamID, uint32_t resX, uint32_t resY);
|
||||
|
||||
private:
|
||||
bool QueryQuality(std::string& qualityContents);
|
||||
bool DowngradeQuality(std::string& originalConfig);
|
||||
bool UpdateQuality(const std::string& originalConfig);
|
||||
bool UpgradeQuality();
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif //__MICROPHOTO_HIKONCTRL_H__
|
Loading…
Reference in New Issue