go_GB28181

package module
v0.0.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 28, 2026 License: Apache-2.0 Imports: 21 Imported by: 0

README

go-GB28181

gb28181

只实现了一些功能

支持TCP UDP

内置了server,以下是使用教程

1.新建handler


var _ GB28181Handler = (*CameraHandler)(nil)

type CameraHandler struct{}

func (c *CameraHandler) ErrorVerifyHandle(err error) bool {
	if err == nil {
		return false
	}
	fmt.Println("套接字错误:" + err.Error())
	return false
}

func (c *CameraHandler) ServerClosedHandle(err error) {
	fmt.Println("服务器关闭:" + err.Error())
}

func (c *CameraHandler) ReceivedHandle(clientHost string, clientSIP string, frame string, err error) {
	fmt.Println("-------收到了消息--------")
	fmt.Println("clientHost:" + clientHost)
	fmt.Println("clientSIP:" + clientSIP)
	fmt.Println(frame)
	if err != nil {
		fmt.Println("解析错误:" + err.Error())
	}
}

func (c *CameraHandler) SentHandle(clientHost string, clientSIP string, frame string, err error) {
	fmt.Println("-------发送了消息--------")
	fmt.Println(clientHost)
	fmt.Println(clientSIP)
	fmt.Println(frame)
	if err != nil {
		fmt.Println("发送错误:" + err.Error())
	}
}

func (c *CameraHandler) PasswordHandle(clientHost string, cameraSIP string) string {
	fmt.Println("------获取密码-------")
	fmt.Println(clientHost)
	fmt.Println(cameraSIP)
	return "12345678"
}

func (c *CameraHandler) CameraOnHandle(clientHost string, clientSIP string) {
	fmt.Println("Camera上线:", clientHost, "  ", clientSIP)
}

func (c *CameraHandler) CameraDownHandle(clientHost string, clientSIP string, err error) {
	fmt.Println("Camera下线:", clientHost, "  ", clientSIP)
}

  1. 新建server
conf := NewDefaultConfig(15060, UdpTrans, "127.0.0.1", "34020000002000000001", &CameraHandler{})

server := NewServer(conf)
  1. 打开server
err := server.Open()
if err != nil {
    panic(err)
}
  1. 方法
//目录检索
taglogs, err := server.CatalogueSearch("34020000001110739997", 5*time.Second)
fmt.Println(taglogs)
fmt.Println(err)
//拉取实时流
err = server.FetchRealTimeStream("34020000001110739997", "127.0.0.1", 589, 5*time.Second, "")
fmt.Println(err)
//关流
err = server.StopFetchStream("34020000001110739997", 5*time.Second)
fmt.Println(err)
back := &PlayBack{
    TargetNumber:    "1000000001",
    SourceNumber:    "1000000001",
    ChanNumber:      0,
    StartTime:       time.Now().Add(-2 * time.Hour).Unix(),
    EndTime:         time.Now().Add(-1 * time.Hour).Unix(),
    VideoServerIp:   "127.0.0.1",
    videoServerPort: 9978,
}
err = server.FetchPlayBackStream("34020000001110789924", back, 5*time.Second)
//回放暂停
err = server.ControlPlayBackStop("34020000001110794199", 1, 5*time.Second)
start := time.Now().Add(-3 * time.Hour)
now := time.Now()
err = server.ControlPlayBackPlay("34020000001110794199", 1, 5*time.Second, &start, &now)
//回放定位
err = server.PlayBackPositioning("34020000001110794199", -211, 1, 1.0, 5*time.Second)
//控制,以ptz举例,ptz有聚焦、光圈的方法
ptz := &PTZ{
    Version: 0,
    Address: 0,
}
cmd, _ := ptz.BuildPTZ(ZoomIn, 1, TiltDown, 1, PanIdle, 1)
err = server.PTZControl("34020000001110004271", cmd, 5*time.Second)
//获取所有在线摄像头
cameras, err := server.CameraList()

Documentation

Index

Constants

View Source
const (
	ZoomOut  Zoom = 2 //镜头变倍,缩小
	ZoomIn   Zoom = 1 //镜头变倍,方法
	ZoomIdle Zoom = 0 //镜头变倍,静置

	TiltUp   Tilt = 2 //云台垂直方向控制,上
	TiltDown Tilt = 1 //云台垂直方向控制,下
	TiltIdle Tilt = 0 //云台垂直方向控制,静置

	PanLeft  Pan = 2 //云台水平方向控制,左
	PanRight Pan = 1 //云台水平方向控制,右
	PanIdle  Pan = 0 //云台水平方向控制,静置

	IrisLittle Iris = 2 //光圈缩小
	IrisBig    Iris = 1 //光圈方法
	IrisIdle   Iris = 0 //光圈不动

	FocusLittle Focus = 2 //聚焦近
	FocusBig    Focus = 1 //聚焦远
	FocusIdle   Focus = 0 //聚焦不动
)
View Source
const (
	DeviceControlType = "DeviceControl"
)
View Source
const (
	TryingType = "Trying"
)

Variables

This section is empty.

Functions

func CreateNoMsgTypeResponse

func CreateNoMsgTypeResponse(req sip.Request, statusCode int, conf *Config) sip.Message

CreateNoMsgTypeResponse SIP/2.0 200 OK 创建这种

func CreateServerRequestNoReq

func CreateServerRequestNoReq(messID sip.MessageID, method sip.RequestMethod, hdrs []sip.Header, body string, conf *Config, cameraSIP string, cameraHost string) sip.Message

Types

type Authenticate

type Authenticate struct {
	Auth string
}

func (Authenticate) Clone

func (a Authenticate) Clone() sip.Header

func (Authenticate) Equals

func (a Authenticate) Equals(other interface{}) bool

func (Authenticate) Name

func (a Authenticate) Name() string

func (Authenticate) String

func (a Authenticate) String() string

func (Authenticate) Value

func (a Authenticate) Value() string

type Camera

type Camera struct {

	//配置相关
	*Config

	LatestTime int64 //最后一次通讯时间,毫秒值

	CameraUa string
	// contains filtered or unexported fields
}

func (*Camera) CatalogueSearch

func (c *Camera) CatalogueSearch(timeout time.Duration) ([]*CatalogueResponse, error)

CatalogueSearch 目录检索

func (*Camera) Close

func (c *Camera) Close() error

func (*Camera) ControlPlayBackPlay

func (c *Camera) ControlPlayBackPlay(scale float32, timeout time.Duration, startTime *time.Time, endTime *time.Time) error

ControlPlayBackPlay 播放回放

func (*Camera) ControlPlayBackStop

func (c *Camera) ControlPlayBackStop(PauseTime int, timeout time.Duration) error

ControlPlayBackStop 回放暂停

func (*Camera) FetchPlayBackStream

func (c *Camera) FetchPlayBackStream(back *PlayBack, timeout time.Duration) error

FetchPlayBackStream 回放

func (*Camera) FetchRealTimeStream

func (c *Camera) FetchRealTimeStream(serverIp string, serverPort int, timeout time.Duration, pvrStr string) error

FetchRealTimeStream 拉取已经注册摄像头的实时流

func (*Camera) FlushRegistered

func (c *Camera) FlushRegistered(flag bool, err error)

FlushRegistered 刷新注册状态

func (*Camera) PTZControl

func (c *Camera) PTZControl(cmd string, timeout time.Duration) error

PTZControl 云台控制

func (*Camera) PlayBackPositioning

func (c *Camera) PlayBackPositioning(startTime int, endTime int, scale float32, timeout time.Duration) error

PlayBackPositioning 回放定位

func (*Camera) Registered

func (c *Camera) Registered() bool

func (*Camera) StopFetchStream

func (c *Camera) StopFetchStream(timeout time.Duration) error

func (*Camera) Write

func (c *Camera) Write(frame sip.Message) error

type CameraModel

type CameraModel struct {
	SIP        string `json:"sip"`
	UserAgent  string `json:"user_agent"`
	Host       string `json:"host"`
	KeepAlive  int64  `json:"keep_alive"`  //单位毫秒
	LatestTime int64  `json:"latest_time"` //最后一次通讯时间
}

type CatalogueResponse

type CatalogueResponse struct {
	XMLName    xml.Name   `xml:"Response"`
	CmdType    string     `xml:"CmdType"`
	SN         int        `xml:"SN"`
	DeviceID   string     `xml:"DeviceID"`
	SumNum     int        `xml:"SumNum"`
	DeviceList DeviceList `xml:"DeviceList"`
}

CatalogueResponse 目录检索响应

type Clienter

type Clienter interface {
	Read(buffer []byte) (int, error)
	SetDeadline(timeout time.Duration) error
	Write(frame sip.Message, writeTimeout time.Duration) (n int, err error)
	Close() error
}

type Config

type Config struct {
	Port            int16          //端口号
	WriteTimeout    time.Duration  //写超时
	ReadTimeout     time.Duration  //读超时
	Trans           LinkType       //连接类型
	ServerIP        string         //服务端IP
	ServerSIP       string         //服务端的sip
	MaxForwards     int            // 最大转发跳数,默认70
	ProtocolVersion string         //默认“2.0”
	ProtocolName    string         //默认“SIP”
	SipVersion      string         //默认"SIP/2.0"
	UserAgent       string         //服务端名称
	BuffSize        int            //缓冲区大小,建议不要小于1024
	Handle          GB28181Handler //回调处理器
	Auth            bool           //是否需要针对摄像头鉴权
}

Config 服务端配置

func NewDefaultConfig

func NewDefaultConfig(port int16, trans LinkType, serverIp string, serverSip string, handle GB28181Handler) *Config

NewDefaultConfig 创建SIP服务端的配置

type ControlResponse

type ControlResponse struct {
	XMLName  xml.Name `xml:"Response"`
	CmdType  string   `xml:"CmdType"`
	SN       int      `xml:"SN"`
	DeviceID string   `xml:"DeviceID"`
	Result   string   `xml:"Result"`
}

type DeviceList

type DeviceList struct {
	Num   int    `xml:"Num,attr"`
	Items []Item `xml:"Item"`
}

type Focus

type Focus byte

type GB28181Handler

type GB28181Handler interface {
	ErrorVerifyHandle(err error) bool                                            //错误校验,如果返回true,就代表服务端出问题,会关闭服务端
	ServerClosedHandle(err error)                                                //服务器已经关闭啦
	ReceivedHandle(clientHost string, clientSIP string, frame string, err error) //收到了消息
	SentHandle(clientHost string, clientSIP string, frame string, err error)     //发送了消息
	PasswordHandle(clientHost string, cameraSIP string) string                   //获取认证密码
	CameraOnHandle(clientHost string, clientSIP string)                          //摄像头上线
	CameraDownHandle(clientHost string, clientSIP string, err error)             //摄像头下线
}

GB28181Handler 服务端回调

type Iris

type Iris byte

type Item

type Item struct {
	DeviceID     string `xml:"DeviceID"`
	Name         string `xml:"Name"`
	Manufacturer string `xml:"Manufacturer"`
	Model        string `xml:"Model"`
	Owner        string `xml:"Owner"`
	CivilCode    string `xml:"CivilCode"`
	Address      string `xml:"Address"`
	Parental     int    `xml:"Parental"`
	ParentID     string `xml:"ParentID"`
	RegisterWay  int    `xml:"RegisterWay"`
	Secrecy      int    `xml:"Secrecy"`
	Status       string `xml:"Status"`
}

type LinkType

type LinkType string
const (
	TcpTrans LinkType = "tcp"
	UdpTrans LinkType = "udp"
)

两个连接类型

type MessageCar

type MessageCar struct {
	// contains filtered or unexported fields
}

func NewMessageCar

func NewMessageCar(resultSize int, timeout time.Duration) *MessageCar

func (*MessageCar) Close

func (m *MessageCar) Close()

Close 截断

func (*MessageCar) Down

func (m *MessageCar) Down() ([]any, error)

func (*MessageCar) OccError

func (m *MessageCar) OccError(err error)

OccError 发生了一个错误

func (*MessageCar) OccValue

func (m *MessageCar) OccValue(value any)

OccValue 新增一个结果

type Node

type Node struct {
	XMLName xml.Name
	Attrs   []xml.Attr `xml:",any,attr"`
	Content []byte     `xml:",innerxml"`
	Nodes   []Node     `xml:",any"`
}

type NoneUri

type NoneUri struct {
}

func (*NoneUri) Clone

func (n *NoneUri) Clone() sip.Uri

func (*NoneUri) Equals

func (n *NoneUri) Equals(other interface{}) bool

func (*NoneUri) Headers

func (n *NoneUri) Headers() sip.Params

func (*NoneUri) Host

func (n *NoneUri) Host() string

func (*NoneUri) IsEncrypted

func (n *NoneUri) IsEncrypted() bool

func (*NoneUri) IsWildcard

func (n *NoneUri) IsWildcard() bool

func (*NoneUri) Password

func (n *NoneUri) Password() sip.MaybeString

func (*NoneUri) Port

func (n *NoneUri) Port() *sip.Port

func (*NoneUri) SetEncrypted

func (n *NoneUri) SetEncrypted(flag bool)

func (*NoneUri) SetHeaders

func (n *NoneUri) SetHeaders(params sip.Params)

func (*NoneUri) SetHost

func (n *NoneUri) SetHost(host string)

func (*NoneUri) SetPassword

func (n *NoneUri) SetPassword(pass sip.MaybeString)

func (*NoneUri) SetPort

func (n *NoneUri) SetPort(port *sip.Port)

func (*NoneUri) SetUriParams

func (n *NoneUri) SetUriParams(params sip.Params)

func (*NoneUri) SetUser

func (n *NoneUri) SetUser(user sip.MaybeString)

func (*NoneUri) String

func (n *NoneUri) String() string

func (*NoneUri) UriParams

func (n *NoneUri) UriParams() sip.Params

func (*NoneUri) User

func (n *NoneUri) User() sip.MaybeString

type PTZ

type PTZ struct {
	Version byte   //版本信息,不能大于0x0F
	Address uint16 //地址
	// contains filtered or unexported fields
}

PTZ 云台控制

func (*PTZ) BuildFI

func (p *PTZ) BuildFI(iris Iris, irisValue byte, focus Focus, focusValue byte) (string, error)

BuildFI 聚焦,光圈

func (*PTZ) BuildPTZ

func (p *PTZ) BuildPTZ(zoom Zoom, zoomValue byte, tilt Tilt, tiltValue byte, pan Pan, panValue byte) (string, error)

BuildPTZ 构建一个控制镜头变倍、垂直方向控制、水平方向控制的PTZ

type Pan

type Pan byte

type PlayBack

type PlayBack struct {
	TargetNumber  string //目标通道号
	SourceNumber  string //源设备通道号
	ChanNumber    int    //通道号
	StartTime     int64  //开始时间,秒级时间戳
	EndTime       int64  //结束时间,秒级时间戳
	VideoServerIp string //接收IP

	Pvr string //自定义的播放参数,如果=="",就是用默认的
	// contains filtered or unexported fields
}

PlayBack 回放请求参数

type Query

type Query struct {
	XMLName  xml.Name `xml:"Query"`
	CmdType  string   `xml:"CmdType"`
	SN       string   `xml:"SN"`
	DeviceID string   `xml:"DeviceID"`
}

Query 请求目录检索

type Server

type Server struct {
	*Config
	// contains filtered or unexported fields
}

Server GB28181服务端

func NewServer

func NewServer(config *Config) *Server

NewServer 创建GB28181服务端

func (*Server) CameraList

func (s *Server) CameraList() ([]*CameraModel, error)

CameraList 获取所有在线摄像头

func (*Server) CatalogueSearch

func (s *Server) CatalogueSearch(cameraSIP string, timeout time.Duration) ([]*CatalogueResponse, error)

CatalogueSearch 目录检索 cameraSIP 摄像头的SIP timeout 超时

func (*Server) Close

func (s *Server) Close() error

Close 关闭服务端

func (*Server) ControlPlayBackPlay

func (s *Server) ControlPlayBackPlay(cameraSIP string, scale float32, timeout time.Duration, startTime *time.Time, endTime *time.Time) error

ControlPlayBackPlay 播放回放 cameraSIP 摄像头的SIP scale 倍速 timeout 超时 startTime 开始时间 endTime 结束时间

func (*Server) ControlPlayBackStop

func (s *Server) ControlPlayBackStop(cameraSIP string, PauseTime int, timeout time.Duration) error

ControlPlayBackStop 回放暂停 cameraSIP 摄像头的SIP PauseTime 回放的暂停延迟 timeout 超时

func (*Server) FetchPlayBackStream

func (s *Server) FetchPlayBackStream(cameraSIP string, back *PlayBack, timeout time.Duration) error

FetchPlayBackStream 回放 cameraSIP 摄像头的SIP PlayBack 回放请求参数 timeout 超时

func (*Server) FetchRealTimeStream

func (s *Server) FetchRealTimeStream(cameraSIP string, videoServerIp string, videoServerPort int, timeout time.Duration, pvr string) error

FetchRealTimeStream 拉取已经注册摄像头的实时流 cameraSIP 摄像头的SIP videoServerIp 流媒体服务器的IP videoServerPort 接收流的接口 timeout 超时 pvr "v=0\no=%s 0 0 IN IP4 %s\ns=Play\nc=IN IP4 %s\nt=0 0\nm=video %s RTP/AVP 96 98 97\na=recvonly\na=rtpmap:96 PS/90000\na=rtpmap:98 H264/90000\na=rtpmap:97 MPEG4/90000\ny=0100000001\nf=" 这种,传入""的话会使用默认的

func (*Server) Open

func (s *Server) Open() error

Open 打开服务端

func (*Server) PTZControl

func (s *Server) PTZControl(cameraSIP, cmd string, timeout time.Duration) error

PTZControl 云台控制

func (*Server) PlayBackPositioning

func (s *Server) PlayBackPositioning(cameraSIP string, startTime int, endTime int, scale float32, timeout time.Duration) error

PlayBackPositioning 回放定位 cameraSIP 摄像头的SIP startTime 开始时间,秒数,第几秒开始回放 endTime 结束时间,秒数,第几秒结束 scale 倍速 timeout 超时

func (*Server) StopFetchStream

func (s *Server) StopFetchStream(cameraSIP string, timeout time.Duration) error

StopFetchStream 停止拉流 cameraSIP 摄像头的SIP timeout 超时

type Subject

type Subject struct {
	Str string
}

func (*Subject) Clone

func (s *Subject) Clone() sip.Header

func (*Subject) Equals

func (s *Subject) Equals(other interface{}) bool

func (*Subject) Name

func (s *Subject) Name() string

func (*Subject) String

func (s *Subject) String() string

func (*Subject) Value

func (s *Subject) Value() string

type TCPClient

type TCPClient struct {
	// contains filtered or unexported fields
}

func (*TCPClient) Close

func (T *TCPClient) Close() error

func (*TCPClient) Read

func (T *TCPClient) Read(buffer []byte) (int, error)

func (*TCPClient) SetDeadline

func (T *TCPClient) SetDeadline(timeout time.Duration) error

func (*TCPClient) Write

func (T *TCPClient) Write(frame sip.Message, writeTimeout time.Duration) (n int, err error)

type Tilt

type Tilt byte

type UDPClient

type UDPClient struct {
	// contains filtered or unexported fields
}

func (*UDPClient) Close

func (U *UDPClient) Close() error

func (*UDPClient) Read

func (U *UDPClient) Read(buffer []byte) (int, error)

func (*UDPClient) SetDeadline

func (U *UDPClient) SetDeadline(timeout time.Duration) error

func (*UDPClient) Write

func (U *UDPClient) Write(frame sip.Message, writeTimeout time.Duration) (n int, err error)

type Zoom

type Zoom byte

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL