热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cgo+gSoap+onvif学习总结:1、方案初衷、资料收集及cgo实现helloworld

cgogSoaponvif学习总结:1、方案初衷、资料收集及cgo实现helloworld文章目录cgogSoaponvif学习总结:1、方案初衷、资料
cgo+gSoap+onvif学习总结:1、方案初衷、资料收集及cgo实现helloworld


文章目录

  • cgo+gSoap+onvif学习总结:1、方案初衷、资料收集及cgo实现helloworld
    • 1. 前言
    • 2. 资料收集
    • 3. cgo hello world
    • 4. 最后


1. 前言

在尝试使用过纯go的方案和python方案实现onvif协议用来控制摄像头后,发现了一些问题:1、纯Go的开源方案受到soap协议繁琐的影响,部分摄像头不兼容,比如使用海康大华相机ptz控制正常,但是宇视相机无法正常ptz,抓包发现发送的协议内容差别比较大,如果要兼容需要对现有的Go开源库进行重构,这个对于个人来说开发工作量比较大,而且有点造轮子的嫌疑,显然不是目前国内开发风气所能接受的,这个也是Go目前比较尴尬的地方,很多轮子不太成熟,写代码是流畅了(不用写分号括号之类的真的开发起来够快够流畅),但是确实家底还比较薄弱,还需要一些成长时间,所以这个路适合一些人手多的大厂,有足够的人手去专门造轮子和维护轮子(这些轮子在开源风气受到影响的当下有可能无法开放);2、Go+python的方案可以弥补一些go不兼容的地方,python脚本补漏也是比较方便的,但是python作为脚本的先天缺点’慢’导致对于音视频开发来说有时候有些无法接受,AI的处理很多时候也需要考虑处理效率,我不确定是不是我的用法不对,目前python的onvif包进行ptz时延迟比较大,很多时候无法容忍。所以,在综合考虑之后,还是得走上c/c++的方案,这也是目前音视频开发大多使用c/c++的原因,稳定,低延迟。

由于目前使用的Go的一些接口和服务已经跑稳定了,除了ptz收到一些兼容性影响外,基本上其它的不用动,前期设计封装的接口也考虑到onvif的底层实现可能会修改,因此即使将ptz改为python或者c/c++也不会影响上层交互接口,python只需要安装运行环境后使用Go调用shell命令控制即可,而c/c++则需要考虑cgo方式来使go和c/c++相互传参(这也是后来语言需要考虑的一个点,要预留和c/c++交互的方式,少了这个交互相当于放弃c/c++长久以来留下的宝藏),所以将这个学习过程做下总结,说明cgo+gSoap+onvif的学习和使用,在实际开发中,一般需要go工程师和c++开发工程师和流媒体工程师通力合作,将go、c++、流媒体各个部分的优点融合起来实现业务功能的快速实现和迭代,AI在用到这些流媒体信息的时候也能兼顾性能和云交互等带来的便捷性。

综合下来,如果开发团队c++的人手比较多,可以考虑一开始就使用c++搭建整个框架,但是由于c++的复杂性,目前很多公司都不太具备这样的条件,所以可以使用cgo方式来搭建团队,c++开发只需要部分专门处理底层流媒体相关部分,上层业务应用及云交互使用go处理,新人也可以快速上手,对于项目的长期维护也比较好。

2. 资料收集

主要分成三部分,onvif、gSoap、cgo,onvif的部分我们之前已经有过一些总结和学习了,这里就不多说了,不太清楚的可以看前面的内容,gSopa这个可以理解成c/c++用来生成soap协议代码的框架软件,可以利用其快速生成soap协议代码,之后我们再结合cgo知识将原本的go接口和生成的协议c/c++代码相互传参即可,由于涉及到c/c++代码和go代码,如果开发环境和运行环境有差异的话还需要考虑交叉编译。(这部分的go接口如果你的运行环境资源比较充足,也可以考虑使用Java方式替代,但是就个人使用来看,在某些情况下Java代码写起来以及编译显得有些繁琐,特别涉及jar包打包到一个包里的时候maven等工具使用起来也比较让人头大)

gSoap:

https://github.com/Genivia/gsoap

https://www.genivia.com/

https://www.genivia.com/dev.html

https://www.genivia.com/examples/onvif/index.html

包括实现onvif客户端和服务端,此外gSoap还有一些其它的功用,可以看官网详细了解一下,实现onvif协议只是其中一部分。

cgo:

如何将go和c进行交互,这个go官方资料和网上资料也是比较多的,看下然后实例操作一下很快就可以使用起来,对新手主要难的可能是c和go代码的交叉编译,这个建议了解一些概念后实操一下,没有一些嵌入式的基础的话可能开始的时候会有一些理解上的难点。

https://golang.google.cn/blog/cgo

https://golang.google.cn/cmd/cgo/

3. cgo hello world

package main// #include
//
// typedef int (*intFunc) ();
//
// int
// bridge_int_func(intFunc f)
// {
// return f();
// }
//
// int fortytwo()
// {
// return 42;
// }
//
// void print_hello_world()
// {
// printf("Hello World\n");
// }
import "C"
import "fmt"func main() {f := C.intFunc(C.fortytwo)fmt.Println(int(C.bridge_int_func(f)))// Output: 42C.print_hello_world()
}

GOOS=linux GOARCH=amd64 CGO_ENABLED=1 go build -o main main.go

在这里插入图片描述

windows系统的话建议在wsl上编译使用,因为Windows下编译使用可能会报错:cc1.exe: sorry, unimplemented: 64-bit mode not compiled in …

这个是由于默认一般我们会安装Qt,而安装Qt一般自带mingw32位的编译器,所以如果没有wsl环境要解决这个Windows下的编译问题只要安装64位的mingw即可,这个在之前使用sqlite的go库时总结过,不清楚的可以看一下:https://blog.csdn.net/weixin_39510813/article/details/119608495

4. 最后

接下来我们还是整体使用cgo+gSoap+onvif对设备搜索、鉴权、连接设备、获取设备信息、获取profileToken、rtsp流地址、快照、ptz、预置点等进行测试,测试过程中会同步对海大宇摄像头进行兼容性测试(主要是onvif版本可能存在兼容性问题)。


推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了包的基础知识,包是一种模块,本质上是一个文件夹,与普通文件夹的区别在于包含一个init文件。包的作用是从文件夹级别组织代码,提高代码的维护性。当代码抽取到模块中后,如果模块较多,结构仍然混乱,可以使用包来组织代码。创建包的方法是右键新建Python包,使用方式与模块一样,使用import来导入包。init文件的使用是将文件夹变成一个模块的方法,通过执行init文件来导入包。一个包中通常包含多个模块。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
author-avatar
和谐家于社会
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有