TSINGSEE青犀視訊接入大華攝像機實現改變預置點名稱
TSINGSEE青犀視訊可以接入不同協議的視訊平臺,海康大華皆可,近期我們在研究接入大華攝像機改變預置點名稱的實現。下圖是新增大華的預置點:
在使用網頁新增預置點時,預置點標題是可以在網頁雙擊改變。如果通過大華的SDK需要怎麼去改變呢?在使用大華SDK去改變預置點標題,使用此函式(CLIENT_SetNewDevConfig)返回的是7,7在大華文件中是:使用者引數不合法。
呼叫CLIENT_SetNewDevConfig函式檢視文件得知:
在取文件檢視szCommand引數,找到修改預置點標題的名稱:
從文件中找到CFG_CMD_PTZ_PRESET巨集定義,所對應的是PTZ_PRESET_INFO,裡面有szName引數,此引數就是改變預置點標題:
下面是使用c++呼叫的修改預置點標題程式碼:
PTZ_PRESET_INFO info = { 0 };
int pNum = 0;
info.pstPtzPreset = (PTZ_PRESET *)malloc(sizeof(PTZ_PRESET) * MAX_PRESET);
memset(info.pstPtzPreset, 0x00, sizeof(PTZ_PRESET) * MAX_PRESET);
info.dwMaxPtzPresetNum = MAX_PRESET;
BOOL bRet = CLIENT_SetNewDevConfig(handle, CFG_CMD_PTZ_PRESET, -1, (char*)&info, sizeof(info), NULL, NULL, 10 * 1000);
free(info.pstPtzPreset);
if (bRet == FALSE) {
int err = CLIENT_GetLastError() & (0x7fffffff);
_EC(err);
return EasyGetLastError();
}
上面程式碼呼叫bRet為FALSE,err的值是7,所以不是這麼呼叫的。在檢視文件中,CLIENT_SetNewDevConfig函式的第四個引數不是這麼使用的,如下圖:
由上可知第三個引數必須不能是結構體轉char結構,否則會報使用者引數不正確。解決問題也是要從新分配一個char結構:
int get_err = 0;
const int len = 256 * 1024;
char get_info[len] = { 0 };
BOOL ret = CLIENT_GetNewDevConfig(handle, CFG_CMD_PTZ_PRESET, -1, get_info, len, &get_err, 10 * 1000);//此引數是獲取所有的預置點資訊, CFG_CMD_PTZ_PRESET
PTZ_PRESET_INFO info = { 0 };
int pNum = 0;
info.pstPtzPreset = (PTZ_PRESET *)malloc(sizeof(PTZ_PRESET) * MAX_PRESET);
memset(info.pstPtzPreset, 0x00, sizeof(PTZ_PRESET) * MAX_PRESET);
info.dwMaxPtzPresetNum = MAX_PRESET;
注意:get_info值是json結構(找個c++的json分析庫)。所以需要自己檢視記憶體找到所需要修改的資訊,下圖是get_info資訊:
最好別用官方的一個介面(CLIENT_PacketData(CFG_CMD_PTZ_PRESET, &info, sizeof(info), get_info, sizeof(get_info))),雖然CLIENT_GetNewDevConfig返回的是TRUE,進入到網頁重新整理預置點的使用居然沒了。 本人做法是自己拼接字元,拼接一個json:
char ch[len] = {0};
strcpy(ch, "[");
for (int i = 0;i < table.size();i++)
{
value = table[i];
if (value["Enable"].asBool()) {
float x = value["Position"][0].asFloat();
float y = value["Position"][1].asFloat();
float zoom = value["Position"][2].asFloat();
if (strcmp(ch, "[")) {
strcat(ch, ",");
}
strcat(ch, " {\"Enable\" : true, \"Name\" : ");
if ((i + 1) == presetNum) {
strcat(ch, "\"");
strcat(ch, presetName);
strcat(ch, "\"");
}
else
{
strcat(ch, "\"");
strcat(ch, value["Name"].asCString());
strcat(ch, "\"");
}
strcat(ch, ", \"Position\" : [ ");
strcat(ch, std::to_string(x).c_str());
strcat(ch, ", ");
strcat(ch, std::to_string(y).c_str());
strcat(ch, ", ");
strcat(ch, std::to_string(zoom).c_str());
strcat(ch, " ] }");
continue;
}
}
strcat(ch, " ]");
最後還是需要額外加個中括號,否則還是會出現7的錯誤碼。
std::string _info = "[" + std::string(ch) + "]";
strcpy(get_info, _info.c_str());
BOOL bRet = CLIENT_SetNewDevConfig(handle, CFG_CMD_PTZ_PRESET, -1, get_info, strlen(get_info), NULL