【前言】好久沒更新Onvif的這個協議內容了,最近一段時間換成其他內容的開發之後,發現Onvif這部分的知識都快忘了,因此便趁着更新博客的機會重新將Onvif協議的內容再溫固一下。
Onvif獲取設備能力
一、介紹
Onvif獲取設備能力主要是爲了客戶端使用能知道Onvif的服務端能夠提供哪些服務功能。不僅服務端需要提供對應的服務,客戶端的開發同樣需要有對應的wsdl文件才能生成與服務端通信的接口。針對視頻監控方面Onvif服務端主要需要使用到的服務大概能有以下幾種:
- 1、媒體功能
- 2、事件功能
- 3、雲臺功能
- 4、錄像功能
- 5、查詢功能
- 6、顯示信息功能
- 7、取流功能
服務端返回的每一個設備能力都是一個地址,當我們需要使用到這些功能的實現通過調用對應功能的函數而函數訪問的地址則是服務端返回的地址。
獲取設備能力的地址爲:http://192.168.1.1:80/onvif/device_service ,其中192.168.1.1是Onvif服務端的IP地址,80是Onvif服務端提供的Onvif端口。
二、代碼實現
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;
}
struct _tds__GetCapabilities req;
struct _tds__GetCapabilitiesResponse rep;
memset(&req, 0x00, sizeof(req));
memset(&rep, 0x00, sizeof(rep));
enum tt__CapabilityCategory emCapCategory = tt__CapabilityCategory__All; // 獲取全部的設備能力,根據自己需要選擇
req.__sizeCategory = 1;
req.Category = &emCapCategory;
char tempInfo[128] = { 0 };
sprintf(tempInfo, "http://%s:%d/onvif/device_service", “192.168.1.1”, 80);
result = soap_call___tds__GetCapabilities(stSoapNew, tempInfo, NULL, &req, &rep);
if (result != SOAP_OK || rep.Capabilities == nullptr)
{
printf("Get capability error!Error code is %d", result);
return;
}