A signaling server for GB28181
This commit is contained in:
68
pkg/service/stack/request.go
Normal file
68
pkg/service/stack/request.go
Normal file
@ -0,0 +1,68 @@
|
||||
package stack
|
||||
|
||||
import (
|
||||
"github.com/emiago/sipgo/sip"
|
||||
"github.com/ossrs/go-oryx-lib/errors"
|
||||
)
|
||||
|
||||
type OutboundConfig struct {
|
||||
Transport string
|
||||
Via string
|
||||
From string
|
||||
To string
|
||||
}
|
||||
|
||||
func newRequest(method sip.RequestMethod, body []byte, conf OutboundConfig) (*sip.Request, error) {
|
||||
if len(conf.From) != 20 || len(conf.To) != 20 {
|
||||
return nil, errors.Errorf("From or To length is not 20")
|
||||
}
|
||||
|
||||
dest := conf.Via
|
||||
to := sip.Uri{User: conf.To, Host: conf.To[:10]}
|
||||
from := &sip.Uri{User: conf.From, Host: conf.From[:10]}
|
||||
|
||||
fromHeader := &sip.FromHeader{Address: *from, Params: sip.NewParams()}
|
||||
fromHeader.Params.Add("tag", sip.GenerateTagN(16))
|
||||
|
||||
req := sip.NewRequest(method, to)
|
||||
req.AppendHeader(fromHeader)
|
||||
req.AppendHeader(&sip.ToHeader{Address: to})
|
||||
req.AppendHeader(&sip.ContactHeader{Address: *from})
|
||||
req.AppendHeader(sip.NewHeader("Max-Forwards", "70"))
|
||||
req.SetBody(body)
|
||||
req.SetDestination(dest)
|
||||
req.SetTransport(conf.Transport)
|
||||
|
||||
return req, nil
|
||||
}
|
||||
|
||||
func NewRegisterRequest(conf OutboundConfig) (*sip.Request, error) {
|
||||
req, err := newRequest(sip.REGISTER, nil, conf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.AppendHeader(sip.NewHeader("Expires", "3600"))
|
||||
|
||||
return req, nil
|
||||
}
|
||||
|
||||
func NewInviteRequest(body []byte, subject string, conf OutboundConfig) (*sip.Request, error) {
|
||||
req, err := newRequest(sip.INVITE, body, conf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.AppendHeader(sip.NewHeader("Content-Type", "application/sdp"))
|
||||
req.AppendHeader(sip.NewHeader("Subject", subject))
|
||||
|
||||
return req, nil
|
||||
}
|
||||
|
||||
func NewCatelogRequest(body []byte, conf OutboundConfig) (*sip.Request, error) {
|
||||
req, err := newRequest(sip.MESSAGE, body, conf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.AppendHeader(sip.NewHeader("Content-Type", "Application/MANSCDP+xml"))
|
||||
|
||||
return req, nil
|
||||
}
|
||||
25
pkg/service/stack/response.go
Normal file
25
pkg/service/stack/response.go
Normal file
@ -0,0 +1,25 @@
|
||||
package stack
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/emiago/sipgo/sip"
|
||||
)
|
||||
|
||||
const TIME_LAYOUT = "2024-01-01T00:00:00"
|
||||
const EXPIRES_TIME = 3600
|
||||
|
||||
func NewRegisterResponse(req *sip.Request, code sip.StatusCode, reason string) *sip.Response {
|
||||
resp := sip.NewResponseFromRequest(req, code, reason, nil)
|
||||
|
||||
newTo := &sip.ToHeader{Address: resp.To().Address, Params: sip.NewParams()}
|
||||
newTo.Params.Add("tag", sip.GenerateTagN(10))
|
||||
|
||||
resp.ReplaceHeader(newTo)
|
||||
resp.RemoveHeader("Allow")
|
||||
expires := sip.ExpiresHeader(EXPIRES_TIME)
|
||||
resp.AppendHeader(&expires)
|
||||
resp.AppendHeader(sip.NewHeader("Date", time.Now().Format(TIME_LAYOUT)))
|
||||
|
||||
return resp
|
||||
}
|
||||
Reference in New Issue
Block a user