热门标签 | 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版本可能存在兼容性问题)。


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文介绍了在安装或运行 Python 项目时遇到的 'ModuleNotFoundError: No module named setuptools_rust' 错误,并提供了解决方案。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 深入解析JMeter中的JSON提取器及其应用
    本文详细介绍了如何在JMeter中使用JSON提取器来获取和处理API响应中的数据。特别是在需要将一个接口返回的数据作为下一个接口的输入时,JSON提取器是一个非常有用的工具。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本文介绍如何使用 Python 编写程序,检查给定列表中的元素是否形成交替峰值模式。我们将探讨两种不同的方法来实现这一目标,并提供详细的代码示例。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
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社区 版权所有