Files
gb-cms/common/sip.go
2025-08-26 17:36:04 +08:00

101 lines
2.6 KiB
Go

package common
import (
"context"
"database/sql/driver"
"errors"
"fmt"
"github.com/ghettovoice/gosip"
"github.com/ghettovoice/gosip/log"
"github.com/ghettovoice/gosip/sip"
"github.com/ghettovoice/gosip/sip/parser"
"github.com/ghettovoice/gosip/util"
)
var (
Logger log.Logger
SipStack SipServer
)
func init() {
Logger = log.NewDefaultLogrusLogger().WithPrefix("Server")
}
type SipServer interface {
SendRequestWithContext(ctx context.Context,
request sip.Request,
options ...gosip.RequestWithContextOption)
SendRequest(request sip.Request) sip.ClientTransaction
SendRequestWithTimeout(seconds int, request sip.Request, options ...gosip.RequestWithContextOption) (sip.Response, error)
Send(msg sip.Message) error
ListenAddr() string
}
// RequestWrapper sql序列化
type RequestWrapper struct {
sip.Request
}
func (r *RequestWrapper) Value() (driver.Value, error) {
if r == nil || r.Request == nil {
return "", nil
}
return r.Request.String(), nil
}
func (r *RequestWrapper) Scan(value interface{}) error {
if value == nil {
return nil
}
data, ok := value.(string)
if !ok {
return errors.New("invalid type for RequestWrapper")
} else if data == "" {
return nil
}
dialog, err := UnmarshalDialog(data)
if err != nil {
return err
}
*r = RequestWrapper{dialog}
return nil
}
func UnmarshalDialog(dialog string) (sip.Request, error) {
packetParser := parser.NewPacketParser(Logger)
message, err := packetParser.ParseMessage([]byte(dialog))
if err != nil {
return nil, err
} else if request := message.(sip.Request); request == nil {
return nil, fmt.Errorf("dialog message is not sip request")
} else {
return request, nil
}
}
type SIPUAOptions struct {
Name string `json:"name"` // display name, 国标DeviceInfo消息中的Name
Username string `json:"username"` // 用户名
ServerID string `json:"server_id"` // 上级ID, 必选. 作为主键, 不能重复.
ServerAddr string `json:"server_addr"` // 上级地址, 必选
Transport string `json:"transport"` // 上级通信方式, UDP/TCP
Password string `json:"password"` // 密码
RegisterExpires int `json:"register_expires"` // 注册有效期
KeepaliveInterval int `json:"keepalive_interval"` // 心跳间隔
Status OnlineStatus `json:"status"` // 在线状态
}
func SetToTag(response sip.Message) {
toHeader := response.GetHeaders("To")
to := toHeader[0].(*sip.ToHeader)
to.Params = sip.NewParams().Add("tag", sip.String{Str: util.RandString(10)})
}