Onvif修改设备属性

算下来,断断续续的接触Onvif有近两个多星期了,刚开始实在不好懂,尤其它基于soap协议而来,之前对这个协议也没怎么了解,让我进度缓慢。 不过幸好有google大神在,帮助良多。闲扯了,由于项目需要,需要对摄像头模组(符合ONVIF的)的一些属性进行修改,比如网络配置、视频参数配置等。 OK,刚接到这个需求,就开始无穷的google,发现网上多是搜索设备的例子,涉及修改设备属性的帖子不多。 还好让我找到些类似的,再配合官方白皮书说明,终于把这个东西解决了。

/*
* endpoint: 操作ONVIF设备地址   如"http://192.168.1.100/onvif/device_service"
* ip_dst:   这是我用的全局变量,就是ip地址了
*/
int onvif_DeviceSetNetworkInterfaces(char *endpoint)
{
    int result = SOAP_ERR;
    if( endpoint == NULL || 0 == strlen(endpoint) )
    {
        printf("[%s][%d]\n", __func__, __LINE__);
        return result;
    }
    if( endpoint != NULL && 0 != strlen(endpoint) )
    {
        struct soap soap;
        soap_init(&soap);
        struct _tds__SetNetworkInterfaces req;
        struct _tds__SetNetworkInterfacesResponse rsp;

        rsp.RebootNeeded = 1;//设置后重启

        char interface[30] = "NetworkInterfaceToken_1";
        req.InterfaceToken = interface;//要设置的设备网络接口
        //char ipaddr[16] = "10.0.0.232";
        //xsd__boolean dhcp = xsd__boolean__true_;
        struct tt__NetworkInterfaceSetConfiguration network;
        soap_default_tt__NetworkInterfaceSetConfiguration(&soap, &network);

        //network.Enabled = 1;
        enum xsd__boolean netEnable = xsd__boolean__true_;
        enum xsd__boolean ipv4Enable = xsd__boolean__true_;
        enum xsd__boolean DHCP = xsd__boolean__false_;
        network.Enabled = &netEnable;

        struct tt__IPv4NetworkInterfaceSetConfiguration tt_ipv4;
        soap_default_tt__IPv4NetworkInterfaceSetConfiguration(&soap, &tt_ipv4);
        struct tt__PrefixedIPv4Address  tt_prefAddr;
        soap_default_tt__PrefixedIPv4Address(&soap, &tt_prefAddr);
        tt_prefAddr.Address = ip_dst;//modify ipaddr
        tt_prefAddr.PrefixLength = 24;
        tt_ipv4.Manual = &tt_prefAddr;
        tt_ipv4.__sizeManual = 1;//must understand  这里坑我最久,后面会说

        tt_ipv4.DHCP = &DHCP;
        tt_ipv4.Enabled = &ipv4Enable;
        network.IPv4 = &tt_ipv4;

        int mtuLen = 16436;
        network.MTU = &mtuLen;

        printf("%d\n", network.IPv4->Manual->PrefixLength);
        printf("%s\n", network.IPv4->Manual->Address);
        req.NetworkInterface = &network;

        result = soap_call___tds__SetNetworkInterfaces(&soap,endpoint, NULL, &req, &rsp);
        if(result == SOAP_OK)
        {
            printf("====================setNetworkInterfaces successful============================\n");
        }
        soap_destroy(&soap);
        soap_end(&soap);
        soap_done(&soap);
    }
    return result;
}

下面回顾一下我的调试经过:
1、 代码一开始一直报段错误,原因是有些结构体的成员赋值类型不对。 举个例子:tt__NetworkInterfaceSetConfiguration结构体里Enabled成员为xsd__boolean *, 那么就必须用这个类型来给值,不能直接用1或0。
2、soap_call___tds__SetNetworkInterfaces一直设置失败,后来通过wireshark去抓包发现别人工具(Onvif device Manager)发出的SetNetworkInterfaces命令,里面的InterfaceToken为”NetworkInterfaceToken_1”, 我之前一直用的是”lo”或“eth0”,后来修改好后,发现就能设置部分信息了,比如DHCP、MTU那些信息, 并且设置后模组能够自行重启。 但IP仍无法正常修改。
抓包如下:
这里写图片描述
3、后来在网上找寻答案无果,回来看看DEBUG信息,发现我的SENT.log如下

ENV:Body><tds:SetNetworkInterfaces><tds:InterfaceToken>NetworkInterfaceToken_1</tds:InterfaceToken><tds:NetworkInterface><tt:Enabled>true</tt:Enabled><tt:MTU>16436</tt:MTU><tt:IPv4><tt:Enabled>true</tt:Enabled><tt:DHCP>false</tt:DHCP></tt:IPv4></tds:NetworkInterface></tds:SetNetworkInterfaces></SOAP-ENV:Body>   

再对比一下Onvif device Manager设置OK的命令,抓包下来可以看到:

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SetNetworkInterfaces xmlns="http://www.onvif.org/ver10/device/wsdl">
<InterfaceToken>NetworkInterfaceToken_1</InterfaceToken>
<NetworkInterface>
<Enabled xmlns="http://www.onvif.org/ver10/schema">true</Enabled>
<MTU xmlns="http://www.onvif.org/ver10/schema">16436</MTU>
<IPv4 xmlns="http://www.onvif.org/ver10/schema">
<Enabled>true</Enabled>
<Manual><Address>10.0.0.231</Address><PrefixLength>24</PrefixLength></Manual>
<DHCP>false</DHCP>
</IPv4>
</NetworkInterface>
</SetNetworkInterfaces>
</s:Body>

难怪我的IP修改设置总不成功,soap都没把我的修改ip信息加上,里面没有找到Manual段,Manual段包括了地址信息的修改。
最后的最后,发现是自己没有设置tt__IPv4NetworkInterfaceSetConfiguration结构体的__sizeManual成员,少了设置Manual的size,soap不知道这个大小,所以没有将信息发送上。 所以我设置成1后,就全部work了,哈哈。 下面为成功后的SENT.log信息

ENV:Body><tds:SetNetworkInterfaces><tds:InterfaceToken>NetworkInterfaceToken_1</tds:InterfaceToken><tds:NetworkInterface><tt:Enabled>true</tt:Enabled><tt:MTU>16436</tt:MTU><tt:IPv4><tt:Enabled>true</tt:Enabled><tt:Manual><tt:Address>10.0.0.234</tt:Address><tt:PrefixLength>24</tt:PrefixLength></tt:Manual><tt:DHCP>false</tt:DHCP></tt:IPv4></tds:NetworkInterface></tds:SetNetworkInterfaces></SOAP-ENV:Body>

最后说明一下,我操作的设备是摄像头模组,可能代码里面有些跟你们用的设备信息不一样,这个需要根据实际情况进行修改。

需要工程的话,见下载链接: http://download.csdn.net/download/nszjh/8618129


参考

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: ONVIF是开放网络视频接口论坛(Open Network Video Interface Forum)的简称,是由一群网络视频设备制造商共同组成的一个开放性标准组织,旨在为网络视频设备制造商提供共同的标准和协议,使设备之间更加互通、兼容和易于部署。而在ONVIF生态圈中,IPC设备服务端则是指IPC设备提供的HTTP API接口,以便于设备接入ONVIF网络系统。 IPC设备服务端主要包括基本设备管理、视频独享、音频数据、运动检测、智能分析、元数据、事件、存储与再生、信令流管理、设备信息、网络配置等方面。通过ONVIF协议,用户可以通过设备服务端进行设备管理、视频监控、事件告警等操作,并可以与其他ONVIF兼容的厂商的设备集成。 ONVIF-IPC设备服务端的实现可以依据ONVIF协议和API文档,基于设备提供商提供的SDK或者API完成开发,或通过第三方开发人员提供的开发包进行实现。同时IPC设备也要支持ONVIF协议的规范和相关标准,才能保证其ONVIF-IPC设备服务端的正常运行。 总之,通过ONVIF-IPC设备服务端的实现,可以使得设备厂商提供的设备可以与其他ONVIF兼容的设备集成,为用户提供更为灵活、高效、可扩展的视频监控解决方案。 ### 回答2: ONVIF是一种标准化协议,用于IP视频监控设备之间的互通性。IPC设备是指网络摄像机,包括网络球机、固定枪机和卡口摄像机等。ONVIF-IPC设备服务端是指网络摄像机作为服务端(即提供服务)使用ONVIF协议与其他设备通信。 ONVIF协议是由IP视频监控行业的领导厂商共同制定的,旨在解决设备之间的互联互通问题。使用ONVIF协议的IPC设备可以与其他厂商的设备和软件进行互联,不受品牌限制,实现方便的互联互通。 ONVIF-IPC设备服务端需要实现ONVIF协议的各项功能,包括设备管理、媒体管理、事件管理等。同时,服务端需要支持视频编码格式、视频分辨率和码率等参数配置,以适应不同场景的需求。此外,服务端还需要支持网络设置、用户管理和安全防范等功能,为用户提供完整的安全保障和智能化管理。 总之,ONVIF-IPC设备服务端是一种遵循ONVIF协议的网络摄像机,可以作为服务端与其他设备进行通信,实现设备互联互通和智能化管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值