linux c 读取摄像头,Linux下onvif客户端获取ipc摄像头 获取能力:GetCapabilities

getcapabilities:获取能力,主要目的获取设备能力信息(获取媒体服务地址)

鉴权:但是在调用获取设备能力之前是需要鉴权的。onvif协议规定,部分接口需要鉴权,部分接口不需要鉴权,在调用需要鉴权的接口时不使用鉴权,会导致接口调用失败。实现鉴权的方式之一可以调用gsoap源码中的 soap_wsse_add_usernametokendigest()函数。要安装依赖库openssl

实现代码:

1 #include

2 #include

3 #include

4 #include

5

6 #include "soaph.h"

7 #include "stdsoap2.h"

8 #include "soapstub.h"

9 #include "wsseapi.h"

10

11 #include "wsdd.nsmap" //命名空间

12

13 static struct soap* onvif_initsoap(struct soap_env__header *header, const char *was_to, const char *was_action, int timeout)

14 {

15 struct soap *soap = null; // soap环境变量

16 unsigned char macaddr[6];

17 char _hwid[1024];

18 unsigned int flagrand;

19

20 soap = soap_new();

21 if(soap == null)

22 {

23 printf("[%d]soap = null\n", __line__);

24 return null;

25 }

26

27 soap_set_namespaces(soap, namespaces); // 设置soap的namespaces,即设置命名空间

28

29 // 设置超时(超过指定时间没有数据就退出)

30 if(timeout > 0)

31 {

32 soap->recv_timeout = timeout;

33 soap->send_timeout = timeout;

34 soap->connect_timeout = timeout;

35 }

36 else

37 {

38 //maximum waittime : 20s

39 soap->recv_timeout = 20;

40 soap->send_timeout = 20;

41 soap->connect_timeout = 20;

42 }

43

44 soap_default_soap_env__header(soap, header);

45

46 //create sessionid randomly,生成uuid(windows下叫guid,linux下叫uuid),格式为urn:uuid:8-4-4-4-12,由系统随机产生

47 srand((int)time(0));

48 flagrand = rand()%9000 + 8888;

49 macaddr[0] = 0x1;

50 macaddr[1] = 0x2;

51 macaddr[2] = 0x3;

52 macaddr[3] = 0x4;

53 macaddr[4] = 0x5;

54 macaddr[5] = 0x6;

55 sprintf(_hwid, "urn:uuid:%ud68a-1dd2-11b2-a105-%02x%02x%02x%02x%02x%02x", flagrand, macaddr[0], macaddr[1], macaddr[2],macaddr[3],macaddr[4],macaddr[5]);

56 header->wsa__messageid = (char *)malloc(100);

57 memset(header->wsa__messageid, 0, 100);

58 strncpy(header->wsa__messageid, _hwid, strlen(_hwid)); //wsa__messageid存放的是uuid

59

60 if(was_action != null)

61 {

62 header->wsa__action = (char*)malloc(1024);

63 memset(header->wsa__action, '\0', 1024);

64 strncpy(header->wsa__action, was_action, 1024); //

65 }

66 if(was_to != null)

67 {

68 header->wsa__to = (char *)malloc(1024);

69 memset(header->wsa__to, '\0', 1024);

70 strncpy(header->wsa__to, was_to, 1024);//"urn:schemas-xmlsoap-org:ws:2005:04:discovery";

71 }

72 soap->header = header;

73 return soap;

74 }

75

76

77 //释放函数

78 void onvif_soap_delete(struct soap *soap)

79 {

80 soap_destroy(soap); // remove deserialized class instances (c++ only)

81 soap_end(soap); // clean up deserialized data (except class instances) and temporary data

82 soap_free(soap); // reset and deallocate the context created with soap_new or soap_copy

83 }

84

85

86 //鉴权

87 static int onvif_setauthinfo(struct soap *soap, const char *username, const char *password)

88 {

89 int result = 0;

90 if((null != username) || (null != password)){

91 soap_wsse_add_usernametokendigest(soap, null, username, password);

92 }else{

93 printf("un etauth\n");

94 result = -1;

95 }

96

97 return result;

98 }

99

100

101

102 int main(int argc,char *argv[])

103 {

104 int ret = 0;

105 char sercer_addr[] = "http://172.168.0.211/onvif/device_service"; //设备搜索得到的地址

106

107 struct soap_env__header header;

108 struct soap* soap = onvif_initsoap(&header, null, null, 5);

109

110 struct _tds__getcapabilities *req;

111 struct _tds__getcapabilitiesresponse *response;

112

113 if(null == (req = (struct _tds__getcapabilities *)calloc(1,sizeof(struct _tds__getcapabilities))))

114 {

115 printf("calloc is error \n");

116 ret = -1;

117 return ret;

118 }else{

119 req->__sizecategory = 1;

120 req->category = (enum tt__capabilitycategory *)soap_malloc(soap, sizeof(int));

121 *(req->category) = (enum tt__capabilitycategory)5; //5表示:tt__capabilitycategory__media

122

123 onvif_setauthinfo(soap,"admin","hk123456"); //鉴权,输入摄像头的用户名、密码

124 ret = soap_call___tds__getcapabilities(soap, sercer_addr, null,req, response);

125 if(soap->error){

126 ret = -1;

127 printf("soap error: %d, %s, %s\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap));

128 return ret;

129 }else{;

130 if(null != response->capabilities)

131 {

132 if (response->capabilities->media != null){

133 if (response->capabilities->media->xaddr != null){

134 printf(" media_addr: %s \n", response->capabilities->media->xaddr);

135 }

136 }

137 }

138 }

139 }

140

141 if(null != req)

142 {

143 free(req);

144 req = null;

145 }

146

147 onvif_soap_delete(soap);

148 return ret;

149 }

在编译之前要把:stdsoap2.c  soapc.c  md5.c dom.c mecevp.c smdevp.c threads.c wsaapi.c wsseapi.c soapclient.c   把这些.c 还有有些配套的.h  拷贝到当前工作目录下。

60f8a9d7b9b0999afe6c064bb61b9325.png

如果出现以下错误要在编译的时候加:-dwith_openssl

/tmp/cccao7u5.o:在函数‘soap_mec_init’中:

mecevp.c:(.text+0xe):对‘soap_ssl_init’未定义的引用

/tmp/ccv2yl3q.o:在函数‘soap_smd_init’中:

smdevp.c:(.text+0x24c):对‘soap_ssl_init’未定义的引用

e44d842ea2e7d23d9be0a1728b087e82.png

编译:gcc -o test get_uri_test.c stdsoap2.c soapc.c md5.c dom.c mecevp.c smdevp.c threads.c wsaapi.c wsseapi.c soapclient.c -i import/ -dwith_openssl -lssl -lcrypto -ldl -pthread

结果:成功得到我们想要的媒体地址

f490ce58ec9148e12425931d4b95e117.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[计算机网络][HTTP]

定义 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是互联网上应用最为广泛的一种网络协 议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由 统一资…

8次c语言上机作业答案,计算机二级C语言上机题库及答案2017

计算机二级C语言上机题库及答案2017引导语:我们将要迎来2017年9月份的计算机考试,大家准备好了吗,以下是百分网小编分享给大家的计算机二级C语言上机题库及答案2017,欢迎测试!一、填空题给定程序中已建立一个带有头结点的单向链表…

Swagger Learing - Spring Boot 整合swagger

学习了一下swagger。 这是编写的Demo 源码 https://github.com/AmberBar/Learning/tree/master/swagger-learning/swagger 需要的小伙伴可以clone直接运行 访问地址 http://localhost:9999/swagger-ui.html#/ 转载于:https://www.cnblogs.com/amberbar/p/10308256.html

[Leedcode][JAVA][第202题][快乐数]

【问题描述】 编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为…

Java类加载机制的理解

算上大学,尽管接触Java已经有4年时间并对基本的API算得上熟练应用,但是依旧觉得自己对于Java的特性依然是一知半解。要成为优秀的Java开发人员,需要深入了解Java平台的工作方式,其中类加载机制和JVM字节码这样的核心特性。今天我将…

[剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]

【问题描述】[第3题][无重复字符的最长字串] 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:输入: "bb…

java学习(172): 使用class实现反射编程,创建对象

//class反射编程 //定义一个学生类 public class test124 {public String name;protected int age;double height;private double money;public test124(String name,Integer age){this.namename;this.ageage;}public test124(String name,int age,double money){this.namename…

关于mysql中GROUP_CONCAT函数的使用

偶然看到公司存储过程中有个字符串拼接的函数,改bug过程中使用到了,还挺有用的,于是记录下来方便记忆,帮助有需要的人。 这是我需要整理的串,他是调用了一个存储过程,传入组织机构的id和迭代层数&#xff0…

java学习(173):class反射编程方法

//class反射编程 //定义一个学生类 public class test124 {public String name;protected int age;double height;private double money;public test124(String name,Integer age){this.namename;this.ageage;}public test124(String name,int age,double money){this.namename…

[剑指offer]面试题第[25]题[Leedcode][JAVA][第21题][合并两个有序链表]

【问题描述】[简单] 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4【解答思路】 1. 非递归 时间复杂度&…

Windos下navcat连接虚拟机中的mysql

进入mysql命令行, 使用root用户,密码:youpassword(你的root密码)连接到mysql服务器:  # mysql -u root -proot   mysql>GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY youpassword WITH GRAN…

第二十三期:大规模网站架构?你是否熟悉?

大规模网站架构 •PHP –facebook,yahoo •Java –taobao,163 •Python –google •.NET –MySpace 语言不是可伸缩性的关键,架构才是关键 网站架构的目标 •高可用性(High Availability) •可伸缩性(Scalability) •高性能(High Performance) 事务 …

[Leedcode][JAVA][第98题][验证二叉搜索树]

【问题描述】[第98题][验证二叉搜索树][中等] 给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜…

图解CPU?

了解CPU 芯片组 CPU微观图 Cache层次结构 Cache-续 Xeon 5600系列CPU CPU内部各部件访问速度 False sharing问题 Cache lines Intel Sandy Bridge来了 CPU拓扑结构图 Cache相关硬件事件

c语言获取dll文件路径,C语言URLDownloadToFile获取文件下载进度

URLDownloadToFile是urlmon.dll提供的网络操作API,可以用于从指定的URL下载文件到本地,在C中通过类很容易实现下载进度的获取,今天需要在C语言中使用到这个函数,这里记录一下使用方法。该函数的定义如下所示。HRESULT URLDownload…

HOG特征人体检测

1. 引言 HOG(Histogram of Oriented Gradient),即方向梯度直方图。它通过计算和统计局部区域的梯度方向直方图来构成特征,一般与SVM分类器结合用于目标的图像识别。由于人体姿势和外表的多变,在图像中检测人体是一项具…

[Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

【问题描述】[Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。【解答思路】 1. 动态规划 超时 第 1 步&…

大型动态应用系统平台系统架构?这些大家并不陌生

大型动态应用系统平台系统架构[多图] 动态应用,是相对于网站静态内容而言,是指以c/c、php、Java、perl、.net等服务器端语言开发的网络应用软件,比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通常与数据库系统、缓存系统、分布式…

c语言round函数能四舍五入吗,怎么利用round函数实现四舍五入?

Excel强大的制表功能让很多人都对它无比依赖,它也早已成为日常必备的工具。我们在办公室工作时,经常会遇到要用 Excel处理数字的情况,需要对其进行四舍五入。那么实现这一操作,我们需要使用哪些Excel函数呢?今日小编就…

InnoDB 事务/锁/多版本分析?你了解多少?

目录 • InnoDB事务 – 事务结构/功能 – XA事务/Group Commit – mini-transaction• InnoDB锁 – 锁结构/类型/功能 – 锁等待/死锁检测 – 自增序列锁(autoinc lock) – 半一致读(semi-consistent read) – 隐式锁(implicit lock) • InnoDB多版本 – ReadView –…