1、前言
之前我们已经简单介绍过use-go的开源方案,其也是通过其它的开源方案进行的封装,提供了初步的接口,我们这里利用对onvif协议的学习,然后结合该开源库进行设备发现、设备IP设置、Profiles token获取、流媒体Uri地址获取、PTZ云台控制、预置点设置等功能进行进一步的实现和封装,以此加深对Onvif协议的了解和加深Go语言的使用。
2、设备搜索思路
这个不清楚原理的再去看一下我们Onvif学习时的设备搜索那里的内容,主要是通过WS-Discovery实现设备的搜索,你可以简单理解为局域网广播和组播说:我在找符合Onvif协议的设置,然后设备回复说:我是,并且会发送相关的设备ip等信息给到客户端。
这里我们使用的Go开源方案提供了对应接口用于搜索设备,我们直接使用就好了。
3、搜索设备Go源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
package client import ( "fmt" "github.com/beevik/etree" goonvif "github.com/use-go/onvif" "github.com/use-go/onvif/device" "github.com/use-go/onvif/gosoap" "github.com/use-go/onvif/media" "github.com/use-go/onvif/ptz" "github.com/use-go/onvif/xsd" "github.com/use-go/onvif/xsd/onvif" "io/ioutil" "log" "net/http" "strings" ) type Code int32 const ( OK Code = 0 SearchErr Code = - 1 ConnectErr Code = - 2 CreateUserErr Code = - 20 GetProfilesErr Code = - 30 GetStreamUriErr Code = - 40 PTZErr Code = - 50 SetPresetErr Code = - 70 GotoPresetErr Code = - 71 RemovePresetErr Code = - 72 GetSnapShotUriErr Code = - 100 ) type returnInfo struct { //状态码 Code Code //错误或者返回信息 ErrInfo string } /** * @Description: 搜索设备,返回搜索到的设备列表 * @Author:ZY * @time: 2021-03-25 14:23:04 * @receiver client * @return returnInfo */ func (client *GoOnvifClient) SearchDevice() returnInfo { devices := goonvif.GetAvailableDevicesAtSpecificEthernetInterface( "eth0" ) if devices == nil { return returnInfo{SearchErr, "search devices failed." } } client.Devices = devices return returnInfo{OK, "search device success" } } |
client是我们定义的调用者,是一个包含我们需要传递的各类信息的结构体,模拟面向对象思想创建的Onvif客户端,即创建一个Onvif客户端,客户端来处理外部调用参数和内部处理库的数据交互,简化对外展现的接口参数。
4、问题
一个主要问题就是当我们搜索到多个符合Onvif协议的设备后如何进行区分,目前我们先采用暴力轮询的方式对每个设备进行设备信息获取,然后解析返回的XML信息结合我们传递的搜索条件(比如设备类型、设备mac地址等)进行进一步的区分。
以上就是Go语言Onvif协议客户端设备搜索示例实现的详细内容,更多关于Onvif客户端设备搜索的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/weixin_39510813/article/details/115215368