Onvif協議客戶端開發(7)--獲取前端攝像頭的名稱

獲取前端攝像頭的名稱

一、介紹

攝像頭的名稱可能是標註攝像頭位置,因此獲取攝像頭的名稱對於對接前端攝像頭是一個必須的流程。

在此作者通過Onvif協議獲取前端攝像頭OSD的信息獲取到前端攝像頭的名稱,這種辦法可能存在一些問題:比如如果前端攝像頭有設置名稱但是沒有顯示在界面,那通過Onvif協議獲取的攝像頭名稱就會失敗。或許還有其他問題,暫時還沒遇到。如果有其他途徑獲取前端攝像頭名稱,方便的話知會一下,不勝感激。

同樣通過接口獲取前端OSD的信息同樣需要有一個token信息,而這個token信息不同於前面的media的token,而應該是stProfilesResponse.Profiles[i].VideoSourceConfiguration->token,獲取配置信息的token。

二、代碼實現

struct soap *stSoapNew = soap_new();
if (stSoapNew == nullptr)
{
	return nullptr;
}

soap_set_namespaces(stSoapNew, namespaces);                                 // 設置soap的namespaces
stSoapNew->recv_timeout = 5;                                           					 // 設置超時5秒(超過指定時間沒有數據就退出)
stSoapNew->send_timeout = 5;
stSoapNew->connect_timeout = 5;

soap_set_mode(stSoapNew, SOAP_C_UTFSTRING);                          // 設置爲UTF-8編碼,否則疊加中文OSD會亂碼
if (stSoapNew == nullptr)
{
	printf( "Onvif New Soap error!");			
	return;
}

// 如果服務要求鑑權,則以下接口就需要加上用戶名密碼進行鑑權
soap_wsse_add_UsernameTokenDigest(stSoapNew, NULL, pUserName, pPassWord);//對用戶名密碼進行加密

// 構建請求的結構體
_trt__GetOSDs stGetOsdsReq;
_trt__GetOSDsResponse stGetOsdsRsp;
memset(&m_sChannelName, 0, ONVIFSDK_MAXCHANNELNAME);
memset(&stGetOsdsReq, 0x00, sizeof(stGetOsdsReq));
memset(&stGetOsdsRsp, 0x00, sizeof(stGetOsdsRsp));
stGetOsdsReq.ConfigurationToken = VideoSourceConfigurationToken;

nRet = soap_call___trt__GetOSDs(stSoapInfo, m_pMediaAddr, nullptr, &stGetOsdsReq, &stGetOsdsRsp);
if (nRet != SOAP_OK || stSoapInfo->error != SOAP_OK)
{
	printf( "Dev ip is %s,ChannelIndex is %d Gsoap return is %d labbuf is %s", m_pIpInfo, nChannelIndex, nRet, stSoapInfo->labbuf);
	return;
}

stGetOsdsRsp.OSDs[j].TextString->PlainText,		// 這個就是獲取到的OSD通道名稱,遍歷所有stGetOsdsRsp.OSDs,直到找到非空的參數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章