开始学习onvif.
以下内容参考: http://blog.csdn.net/ghostyu/article/details/8182516 来修改添加的。
服务端与客户端的数据交互采用SOAP协议,音视频流则通过RTP/RTSP进行 。
在生成所需文件后,开始编写程序:
程序包括: 服务器(设备(ipc))、客户端(nvr)。
一个最简单的soap调用的例子:
服务端代码:
- #include "soapH.h"
- #include "add.nsmap"
- int main(int argc, char **argv)
- {
- int m, s;
- struct soap add_soap;
- soap_init(&add_soap);
- soap_set_namespaces(&add_soap, namespaces);
- soap_bind(&add_soap, NULL, atoi(argv[1]), 100); //失败调用soap_print_fault(&add_soap, stderr) 并退出;
- for (;;)
- {
- s = soap_accept(&add_soap); //失败调用soap_print_fault(&add_soap, stderr) 并退出;
- fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
- soap_serve(&add_soap);
- soap_end(&add_soap);
- }
- }
-
- int ns2__add(struct soap *add_soap, int num1, int num2, int *sum)
- {
- *sum = num1 + num2;
- return 0;
- }
-
客户端代码:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
#include "soapStub.h"
- #include "add.nsmap"
- int main(int argc, char **argv)
- {
- char server[128] = {0};
- int num1;
- int num2;
- int sum;
-
- strcpy(server,argv[1]);
- num1 = atoi(argv[2]);
- num2 = atoi(argv[3]);
- soap_init(&add_soap);
- soap_set_namespaces(&add_soap, namespaces);
- //这里是soap的soap_call_ns2__add接口关联到服务器上的那个ns2__add接口。
- soap_call_ns2__add(&add_soap, server, NULL, num1, num2, sum);
- soap_end(&add_soap);
- soap_done(&add_soap);
- printf("%d + %d = %d\n", num1, num2, sum);
- }
- struct soap类型的参数,这是soap全局运行环境,所有的函数都第一个包含这个参数
运行服务器:
运行客户端:
发现: 10 + 20 = 30
soap_call_ns2__add 实现了加法(实际是调用了ns2__add)
分析:
ns2__add真正的声明在自动产生的soapStub.h中,然后在自动产生的soapServer.c中被soap_serve_ns2__add()函数调用,
这样,就将真正的加法运算的ns2__add函数和soap代码框架联系了起来。
注:
编译server和client的时候复制了两个文件stdsoap2.h和stdsoap2.c,这里面的soap_init() soap_end()等函数来自他们
实现简图: