1. 程式人生 > 其它 >TSINGSEE青犀視訊接入大華攝像機實現改變預置點名稱

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