sip

package module
v0.0.0-...-c6f535c Latest Latest
Warning

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

Go to latest
Published: Apr 7, 2022 License: MIT Imports: 9 Imported by: 0

README

sip

这是使用Go实现的RFC3261-SIP协议。

主要结构体为Message,对应一条完整的SDP信息。

使用方法

在Go中引用本库:

import "gitee.com/xiaochengtech/sip"

生成一个消息对象,解析外部收到的字符串:

sipMsg, err := sip.NewMessage(ioReader)

根据请求消息,生成一个应答消息对象:

rspMsg = sip.NewResponse(sip.StatusXXX, rspMsg)

将消息对象转换为字符串用于传输:

transferString := sipMsg.String()
TODO
  • 完善字段支持。
参考资料

Documentation

Index

Constants

View Source
const (
	// SIP版本号
	SIPVersion = "SIP/2.0"

	// 协议类型
	SchemeSip = "sip"

	// SIP请求方法-RFC3261
	MethodInvite   = "INVITE"
	MethodAck      = "ACK"
	MethodBye      = "BYE"
	MethodCancel   = "CANCEL"
	MethodOptions  = "OPTIONS"
	MethodRegister = "REGISTER"

	// SIP请求方法-其他协议
	MethodPrack     = "PRACK"     // [RFC3262]
	MethodSubscribe = "SUBSCRIBE" // [RFC6665]
	MethodNotify    = "NOTIFY"    // [RFC6665]
	MethodPublish   = "PUBLISH"   // [RFC3903]
	MethodInfo      = "INFO"      // [RFC6086]
	MethodRefer     = "REFER"     // [RFC3515]
	MethodMessage   = "MESSAGE"   // [RFC3428]
	MethodUpdate    = "UPDATE"    // [RFC3311]
	MethodPing      = "PING"      // [https://tools.ietf.org/html/draft-fwmiller-ping-03]
)
View Source
const CRLF = "\r\n"

行分隔符(CRLF)

Variables

View Source
var (
	HeaderFieldVia             = HeaderFieldItem{"Via", "v"}
	HeaderFieldFrom            = HeaderFieldItem{"From", "f"}
	HeaderFieldTo              = HeaderFieldItem{"To", "t"}
	HeaderFieldCallID          = HeaderFieldItem{"Call-ID", "i"}
	HeaderFieldCSeq            = HeaderFieldItem{"CSeq", ""}
	HeaderFieldMaxForwards     = HeaderFieldItem{"Max-Forwards", ""}
	HeaderFieldContentType     = HeaderFieldItem{"Content-Type", "c"}
	HeaderFieldContentLength   = HeaderFieldItem{"Content-Length", "l"}
	HeaderFieldContact         = HeaderFieldItem{"Contact", "m"}
	HeaderFieldExpires         = HeaderFieldItem{"Expires", ""}
	HeaderFieldRoute           = HeaderFieldItem{"Route", ""}
	HeaderFieldRecordRoute     = HeaderFieldItem{"Record-Route", ""}
	HeaderFieldUserAgent       = HeaderFieldItem{"User-Agent", ""}
	HeaderFieldAuthorization   = HeaderFieldItem{"Authorization", ""}
	HeaderFieldWWWAuthenticate = HeaderFieldItem{"WWW-Authenticate", ""}
)

SIP的头域字段名

View Source
var (
	ServerIP     string // 区域IP
	ServerDomain string // 区域域名,用于Via
	ServerPort   int    // 区域端口号
)
View Source
var (
	// 完全静默
	StatusMute = StatusCodeItem{0, "Do Nothing!"}

	// 1xx - 临时应答
	StatusTrying               = StatusCodeItem{100, "Trying"}
	StatusRinging              = StatusCodeItem{180, "Ringing"}
	StatusCallIsBeingForwarded = StatusCodeItem{181, "Call Is Being Forwarded"}
	StatusQueued               = StatusCodeItem{182, "Queued"}
	StatusSessionProgress      = StatusCodeItem{183, "Session Progress"}

	// 2xx - 成功处理
	StatusOK = StatusCodeItem{200, "OK"}

	// 3xx - 重定向
	StatusMultipleChoices    = StatusCodeItem{300, "Multiple Choices"}
	StatusMovedPermanently   = StatusCodeItem{301, "Moved Permanently"}
	StatusMovedTemporarily   = StatusCodeItem{302, "Moved Temporarily"}
	StatusUseProxy           = StatusCodeItem{305, "Use Proxy"}
	StatusAlternativeService = StatusCodeItem{380, "Alternative Service"}

	// 4xx - 客户端错误
	StatusBadRequest                  = StatusCodeItem{400, "Bad Request"}
	StatusUnauthorized                = StatusCodeItem{401, "Unauthorized"}
	StatusPaymentRequired             = StatusCodeItem{402, "Payment Required"}
	StatusForbidden                   = StatusCodeItem{403, "Forbidden"}
	StatusNotFound                    = StatusCodeItem{404, "Not Found"}
	StatusMethodNotAllowed            = StatusCodeItem{405, "Method Not Allowed"}
	StatusNotAcceptable               = StatusCodeItem{406, "Not Acceptable"}
	StatusProxyAuthenticationRequired = StatusCodeItem{407, "Proxy Authentication Required"}
	StatusRequestTimeout              = StatusCodeItem{408, "Request Timeout"}
	StatusGone                        = StatusCodeItem{410, "Gone"}
	StatusRequestEntityTooLarge       = StatusCodeItem{413, "Request Entity Too Large"}
	StatusRequestURITooLong           = StatusCodeItem{414, "Request-URI Too Long"}
	StatusUnsupportedMediaType        = StatusCodeItem{415, "Unsupported Media Type"}
	StatusUnsupportedURIScheme        = StatusCodeItem{416, "Unsupported URI Scheme"}
	StatusBadExtension                = StatusCodeItem{420, "Bad Extension"}
	StatusExtensionRequired           = StatusCodeItem{421, "Extension Required"}
	StatusIntervalTooBrief            = StatusCodeItem{423, "Interval Too Brief"}
	StatusNoResponse                  = StatusCodeItem{480, "No Response"}
	StatusCallTransactionDoesNotExist = StatusCodeItem{481, "Call/Transaction Does Not Exist"}
	StatusLoopDetected                = StatusCodeItem{482, "Loop Detected"}
	StatusTooManyHops                 = StatusCodeItem{483, "Too Many Hops"}
	StatusAddressIncomplete           = StatusCodeItem{484, "Address Incomplete"}
	StatusAmbigious                   = StatusCodeItem{485, "Ambiguous"}
	StatusBusyHere                    = StatusCodeItem{486, "Busy Here"}
	StatusRequestTerminated           = StatusCodeItem{487, "Request Terminated"}
	StatusNotAcceptableHere           = StatusCodeItem{488, "Not Acceptable Here"}
	StatusRequestPending              = StatusCodeItem{491, "Request Pending"}
	StatusUndecipherable              = StatusCodeItem{493, "Undecipherable"}

	// 5xx - 服务器错误
	StatusServerInternalError = StatusCodeItem{500, "Server Internal Error"}
	StatusNotImplemented      = StatusCodeItem{501, "Not Implemented"}
	StatusBadGateway          = StatusCodeItem{502, "Bad Gateway"}
	StatusServiceUnavailable  = StatusCodeItem{503, "Service Unavailable"}
	StatusServerTimeout       = StatusCodeItem{504, "Server Timeout"}
	StatusVersionNotSupported = StatusCodeItem{505, "Version Not Supported"}
	StatusMessageTooLarge     = StatusCodeItem{513, "Message Too Large"}

	// 6xx - 全局错误
	StatusBusyEverywhere       = StatusCodeItem{600, "Busy Everywhere"}
	StatusDecline              = StatusCodeItem{603, "Decline"}
	StatusDoesNotExistAnywhere = StatusCodeItem{604, "Does Not Exist Anywhere"}
	StatusUnacceptable         = StatusCodeItem{606, "Not Acceptable"}
)

SIP返回状态码

View Source
var MaxForwardsCount int = 70

默认最大跳数

Functions

func Clone

func Clone(src interface{}, target interface{})

TODO 克隆一个对象

func IsValidLine

func IsValidLine(line string) bool

是否是有效的行(CRLF)

func RemoveLineCRLF

func RemoveLineCRLF(line string) string

移除行的CRLF标志

func ServerDomainHost

func ServerDomainHost() string

区域名称,Domain:Port格式

func ServerIpHost

func ServerIpHost() string

区域名称,IP:Port格式

Types

type Args

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

头信息参数,在Header中,或者在某个字段中的key[=value]形式的参数

func NewArgs

func NewArgs(kvMap map[string]string) (item Args)

func ParseArgsComma

func ParseArgsComma(str string) (item Args)

func (Args) CommaString

func (h Args) CommaString() (result string)

通过逗号和空格,拼接成字符串

func (Args) Get

func (h Args) Get(key string) (value string, err error)

获取键对应的值

func (*Args) Set

func (h *Args) Set(key string, value string)

设置键对应的值

func (Args) String

func (h Args) String() string

使用分号开头,用key[=value]方式,通过分号拼接成字符串

type CSeq

type CSeq struct {
	CSeq   int    // 请求的序列号
	Method string // 请求的方法
}

Header中的CSeq序列号(RFC3261-8.1.1.5)

func (CSeq) String

func (m CSeq) String() string

字符串表达

type Expires

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

消息或内容过期时间

func (Expires) GetValue

func (e Expires) GetValue() *int

Get函数

func (Expires) IsRequestLogOut

func (e Expires) IsRequestLogOut() bool

是否是注销请求

func (*Expires) SetValue

func (e *Expires) SetValue(v *int)

Set函数

func (Expires) String

func (e Expires) String() string

字符串表达

type Header struct {
	Via             ViaList     // (RFC3261-8.1.1.7) 请求路径
	From            User        // (RFC3261-8.1.1.3) 请求的原始发起者
	To              User        // (RFC3261-8.1.1.2) 请求的原始到达者
	CallID          string      // (RFC3261-8.1.1.4) 唯一标志
	CSeq            CSeq        // (RFC3261-8.1.1.5) 命令序列号
	MaxForwards     MaxForwards // (RFC3261-8.1.1.6) 最大转发数量限制
	ContentLength   int         // 正文长度
	ContentType     string      // (可选) 正文格式描述
	Contact         *User       // (可选) (RFC3261-8.1.1.8) 直接访问方式
	Expires         Expires     // (可选) 消息或内容过期时间
	Route           Route       // (可选) 请求的路由表
	RecordRoute     RecordRoute // (可选) 后续消息流处理的服务器列表
	UserAgent       string      // (可选) UAC的信息
	Authorization   string      // (可选) 用户认证信息
	WWWAuthenticate string      // (可选) 支持的认证方式和适用realm的参数的拒绝原因
	UnsupportLines  []string    // 暂不支持的行
}

SIP头域(RFC3261-7.3) 行范式:header = "header-name" HCOLON header-value *(COMMA header-value) 头域至少包含TO、FROM、CSeq、Call-ID、Max-Forwards、Via字段

func (Header) String

func (h Header) String() (result string)

字符串表达

func (*Header) UpdateToTagWithFromTag

func (h *Header) UpdateToTagWithFromTag()

设置To的标签为From标签

type HeaderFieldItem

type HeaderFieldItem struct {
	Name string // 正常字段名
	Abbr string // 简写字段名
}

SIP的头域字段名信息

func (HeaderFieldItem) LowerName

func (f HeaderFieldItem) LowerName() string

type MaxForwards

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

数据包的最大转发次数

func (MaxForwards) GetValue

func (mf MaxForwards) GetValue() int

Get函数

func (*MaxForwards) Reduce

func (mf *MaxForwards) Reduce()

Max-Forwards数量

func (*MaxForwards) Reset

func (mf *MaxForwards) Reset()

重置Max-Forwards数量

func (*MaxForwards) SetValue

func (mf *MaxForwards) SetValue(v int)

Set函数

func (MaxForwards) String

func (mf MaxForwards) String() string

字符串表示

type Message

type Message struct {
	IsRequest    bool         // (二选一) 是否是请求
	IsResponse   bool         // (二选一) 是否是应答
	RequestLine  RequestLine  // 请求行
	ResponseLine ResponseLine // 应答行
	Header       Header       // 消息包头
	Body         *sdp.Message // 消息正文(RFC3261-7.4)
}

SIP通用消息(RFC3261-7)

func NewMessage

func NewMessage(rd io.Reader) (msg Message, err error)

func NewResponse

func NewResponse(code StatusCodeItem, req *Message) *Message

func (Message) RealAddress

func (m Message) RealAddress() string

获取连接协议

func (*Message) String

func (m *Message) String() (result string)

字符串表示

func (Message) Transport

func (m Message) Transport() string

获取连接协议

type RecordRoute

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

后续消息流处理的服务器列表

func (*RecordRoute) AddServerInfo

func (rr *RecordRoute) AddServerInfo()

将本机信息加入RecordRoute节点列表中

func (RecordRoute) GetValue

func (rr RecordRoute) GetValue() []User

Get函数

func (*RecordRoute) SetValue

func (rr *RecordRoute) SetValue(v []User)

Set函数

type RequestLine

type RequestLine struct {
	Method     string // 请求方法
	RequestURI URI    // SIP消息目标地址,无"<>"尖括号
	SIPVersion string // SIP版本号
}

SIP请求消息的起始行(RFC3261-7.1)

func NewRequestLine

func NewRequestLine(str string) (rl RequestLine, err error)

func (RequestLine) String

func (rl RequestLine) String() string

字符串表达

func (*RequestLine) UpdateRequestURI

func (rl *RequestLine) UpdateRequestURI(domain string)

更新URI地址

func (RequestLine) Username

func (rl RequestLine) Username() string

获取请求的用户名

type ResponseLine

type ResponseLine struct {
	SIPVersion   string // SIP版本号
	StatusCode   int    // 状态码
	ReasonPhrase string // 状态码的说明
}

SIP应答消息的起始行(RFC3261-7.2)

func NewResponseLine

func NewResponseLine(str string) (rl ResponseLine, err error)

func NewResponseLineWithStatusCode

func NewResponseLineWithStatusCode(code StatusCodeItem) ResponseLine

func (ResponseLine) String

func (rl ResponseLine) String() string

字符串表达

type Route

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

请求的路由表

func (Route) FirstIsCurrentDomain

func (r Route) FirstIsCurrentDomain() bool

检查第一个域是否是自己

func (Route) FirstItem

func (r Route) FirstItem() (item User, isExist bool)

获取第一条记录

func (Route) GetValue

func (r Route) GetValue() []User

Get函数

func (*Route) RemoveFirst

func (r *Route) RemoveFirst()

删除第一条记录

func (*Route) SetValue

func (r *Route) SetValue(v []User)

Set函数

type StatusCodeItem

type StatusCodeItem struct {
	Code   int
	Reason string
}

SIP返回状态码信息

type URI

type URI struct {
	Scheme    string // 协议类型
	Username  string // 用户名
	Password  string // 密码
	Domain    string // 域或IP地址
	Arguments Args   // 参数列表
}

URI信息(RFC3261-19.1) 格式:sip:user:password@host:port;uri-parameters?headers

func NewURI

func NewURI(str string) (item URI, err error)

func (URI) IsEqual

func (u URI) IsEqual(obj URI) bool

判断是否相等

func (URI) String

func (u URI) String() (result string)

字符串输出

type User

type User struct {
	DisplayName string // 显示姓名
	URI         URI    // RequestURI地址
	Arguments   Args   // 参数
}

SIP用户信息 Example:"1011" <sip:1011@192.168.0.2>;tag=213788011b

func (User) String

func (u User) String() (result string)

字符串输出

func (User) Username

func (u User) Username() string

获取用户名

type Via

type Via struct {
	SIPVersion string // SIP版本号
	Transport  string // 协议
	Client     string // 客户端地址
	Arguments  Args   // 参数列表
}

Via请求行的内容(RFC3261-8.1.1.7) Example:SIP/2.0/UDP 192.168.0.100:43188;branch=z9hG4bK111643fe9a9f389667c5e7d8873;rport

func (Via) String

func (v Via) String() string

字符串输出

type ViaList

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

Via信息列表

func (*ViaList) Add

func (vl *ViaList) Add(str string) (err error)

添加一条记录

func (*ViaList) AddServerInfo

func (vl *ViaList) AddServerInfo()

(转发请求) 添加当前服务器的信息到Via的开头

func (ViaList) FirstAddrInfo

func (vl ViaList) FirstAddrInfo() (string, bool)

获取第一个Via中的地址信息用于转发,bool代表是否使用了实际地址

func (ViaList) GetValue

func (vl ViaList) GetValue() []Via

Get函数

func (*ViaList) RemoveFirst

func (vl *ViaList) RemoveFirst()

(转发应答) 移除第一个是自己服务器的Via

func (*ViaList) SetReceivedInfo

func (vl *ViaList) SetReceivedInfo(transport string, address string)

(接收消息) 设置信息

func (*ViaList) SetValue

func (vl *ViaList) SetValue(v []Via)

Set函数

func (ViaList) TransactionBranch

func (vl ViaList) TransactionBranch() (result string)

获取当前事务标识

func (*ViaList) UpdateReceivedInfo

func (vl *ViaList) UpdateReceivedInfo()

(转发请求) 设置第一个Via的接收实际信息

Jump to

Keyboard shortcuts

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