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
import "C"
import "fmt"func main() {f := C.intFunc(C.fortytwo)fmt.Println(int(C.bridge_int_func(f)))C.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版本可能存在兼容性问题)。