ONVIF 修改ipc接口地址
本文的目的是如何通过onvif 提供的c版库函数获取和修改接口的ip地址信息。网上对这块的介绍比较少,设置ip地址是一个比较基础的功能,通过实际调试发现,主要是结构体参数的初始化比较复杂,需要好好理解。
修改ONVIF IPC 网络接口ip地址方法
- 通过调用soap_call___tds__GetNetworkInterfaces接口获取配置所需的interface token参数。
- 调用soap_call___tds__SetNetworkInterfaces设置接口ip地址,其中有几个点需要注意。
#define IPC_USERNAME "admin"
#define IPC_PASSWORD "admin"
#define SOAP_SOCK_TIMEOUT (10)
struct soap *onvif_soap_new(int timeout)
{
struct soap *soap = NULL;
soap = soap_new();
SYS_CHECK_PTR_RET(soap, ONVIF_ERROR, NULL);
//设置soap的namespaces
soap_set_namespaces(soap, namespaces);
soap->recv_timeout = timeout;
soap->send_timeout = timeout;
soap->connect_timeout = timeout;
#if defined(__linux__) || defined(__linux)
soap->socket_flags = MSG_NOSIGNAL;
#endif
//设置UTF-8编码方式,否则叠加中文OSD会乱码
soap_set_mode(soap, SOAP_C_UTFSTRING);
return soap;
}
/*
* @brief 获取IPC 网络接口配置信息
* @param DeviceXAddr 设备服务地址 例如:**http://192.168.42.4:80/onvif/device_service**
* @return
* @note
*/
int onvif_GetNetworkInterface(const char *DeviceXAddr)
{
int iRet = 0;
struct soap *soap = NULL;
struct _tds__GetNetworkInterfaces ip_req;
struct _tds__GetNetworkInterfacesResponse ip_resp;
/*Sanity check*/
SYS_CHECK_PTR_RET(DeviceXAddr, ONVIF_ERROR, ERROR);
soap = onvif_soap_new(SOAP_SOCK_TIMEOUT);
SYS_CHECK_PTR_RET(soap, ONVIF_ERROR, ERROR);
/*鉴权*/
onvif_SetAuthInfo(soap, IPC_USERNAME, IPC_PASSWORD);
memset(&ip_req, 0x0, sizeof(ip_req));
memset(&ip_resp, 0x0, sizeof(ip_resp));
iRet = soap_call___tds__GetNetworkInterfaces(soap, DeviceXAddr, NULL, &ip_req, &ip_resp);
if(soap->error)
{
ONVIF_ERROR("soap error:%d %s %s\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
}
else
{
dump_tds__GetNetworkInterfaces(&ip_resp);
}
onvif_soap_safe_delete(soap);
return iRet;
}
测试结果:
下面是实际的测试结果,主要是为了获取interface token参数,测试的ipc的interface token和interface name是相同的,也有两者是不相同,以实际测试结果为准。