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

2023-11-17

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


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<stdio.h>
//
// 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: 42
    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版本可能存在兼容性问题)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • vue-grid-layout 使用以及所有属性

    vue grid layout 作用 下载及引入 版本 案例 以及所有属性 作用 1 实现桌面拖拽布局功能 2 可调整每个部件的大小 3 可以在不重新构建网格的情况下添加或删除小部件 下载及引入 下载 install with npm 用n
  • Ant design vue 的table实现点击字段,直接在表格编辑功能(举个栗子)

    大概需求 就点击table上某列的字段 然后即可在table上编辑数据 数据失去焦点后即可触发保存的事件 关于无关紧要的代码 你可以不看 因为灭有用 看重点代码 1 table中添加插槽名字如 栗子 重点位置 scopedSlots cus
  • Qt信号槽的两种写法

    Qt信号槽connect是什么 connect 函数的形式 connect sender signal receiver slot type 参数示意 sender 发出信号的对象 signal 发送对象发出的信号 receiver 要接收
  • Sort List

    Merge Sort 链表的merge Sort 就是 找中间结点 算法 merge sorted List 算法 1 快慢指针法定位到中间结点p 从p前面断开 维护prev p是后半部分链表头 得到两个子链表 2 分别递归merge两个子
  • OWTTT

    如何在开放世界进行测试段训练 基于动态原型扩展的自训练方法 本文首次提出一种针对开放世界的测试段训练方法 提高模型泛化能力是推动基于视觉的感知方法落地的重要基础 测试段训练和适应 Test Time Training Adaptation
  • 【网络】静态路由的原理与配置

    路由器的工作原理 路由 是指从源主机到目标主机的转发过程 用来寻找目标地址的位置 路径 路由器 能够将数据包转发到目标地址 并保证是按最佳路径转发的设备 路由器根据路由表转发数据 并以作为工作原理 例题 下图中 主机1 1要发送数据到主机4
  • GIT统计代码量

    GIT统计代码量 Git统计个人提交代码行数 git log format aN sort u while read name do echo en name t git log author name pretty tformat num
  • 【NodeJs】使用ffmpeg将视频webm转换为mp4

    使用Chrome浏览器录制视频文件是webm格式 但是很多媒体播放器是不支持的 不利于分享 需要转换为mp4格式才行 接下来给大家讲 ffmpeg ffmpeg是什么呢 一个免费开源的视频转换工具 一款音视频编解码工具 一组音视频编解码开发
  • Python 输出有颜色的字体

    https www cnblogs com hellojesson p 5961570 html 转载于 https www cnblogs com Presley lpc p 9867058 html
  • typeAliasesPackage的作用

    mybatis和spring整合 typeAliasesPackage自动配置别名
  • JAVA——SWING界面开发

    要开发一个界面 我们一般通过写一个窗体并在这个窗体上放置其它元素组件来实现 一个界面是一个JFrame对象 代码实现如下 package com qsj login1220 public class Login public static
  • 数据结构学习(1)----数组之螺旋矩阵Ⅱ

    题目 给你一个正整数 n 生成一个包含 1 到 n2 所有元素 且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 思路 模拟过程 设置边界 生成一个 n n 空矩阵 res 二维数组 随后模拟整个向内环绕的填入过程 定义当
  • 【PCL】—RANSAC点云分割算法详解

    参考 https www bbsmax com A rV57lnmVdP 1 点云分割的概念 点云分割可谓是点云处理的精髓 也是三维图像相对二维图像最大优势的体现 点云分割的目的是提取点云中的不同物体 从而实现分而治之 突出重点 单独处理的
  • 什么叫机器人编程课

    什么叫机器人编程课 小孩的学习一直都是家长们非常关心和重视一件事情 很多的家长在培养孩子的学习方面也是非常的多的 就拿现在很多的家长给孩子选择机器人编程的课程来说 有的家长对于什么叫机器人编程课并不是很清楚 今天我们就一起来了解一下什么叫机
  • AFX_PMSG数据结构

    AFX PMSG数据结构 定义 typedef void AFX MSG CALL CCmdTarget AFX PMSG void void AFX MSG CALL CCmdTarget AFX PMSG void AFX MSG CA
  • QT5.12在windows上边的安装

    使用国内镜像源在线安装QT 2023 3 25更新 qt国内镜像 Iotfsd的博客 CSDN博客 先下载 STEP1 下载qt online installer Index of official releases online inst
  • 汽车 Automotive > T-BOX GNSS高精定位测试相关知识

    参考 https en wikipedia org wiki Global Positioning System GPS和GNSS的关系 GPS Global Positioning System 全球定位系统是美国军民两用的导航定位卫星系
  • rsa生成公私钥php,php中rsa生成公私钥和加解密

    php中rsa生成公私钥和加解密 注意 php使用RSA时需要开启openssl扩展 生成公私钥 创建公私钥 res openssl pkey new 获取私钥 openssl pkey export res private key 获取公
  • Python跨平台应用-BeeWare打造移动端应用和构建Android时的异常处理

    目录 简介 安装 创建demo 运行 打包为Windows程序 打包为安卓APP 构建安卓错误处理 gt gt gradle改为本地 报错1 Could not resolve all artifacts for configuration
  • cgo+gSoap+onvif学习总结:1、方案初衷、资料收集及cgo实现helloworld

    cgo gSoap onvif学习总结 1 方案初衷 资料收集及cgo实现helloworld 文章目录 cgo gSoap onvif学习总结 1 方案初衷 资料收集及cgo实现helloworld 1 前言 2 资料收集 3 cgo h