exsipclient - SIP 信令客户端,支持 REGISTER、呼叫信令、MESSAGE、UDP/TCP 以及 401/407 Digest 认证。#

示例

本库实现的是“信令侧”的最小 SIP UA,只处理 REGISTER、INVITE、ACK、CANCEL、BYE、MESSAGE,
不包含 RTP 或音频媒体收发。媒体协商完成后会通过 event_callback 抛出结果,供外部媒体模块继续处理。

支持特性:
1、支持 UDP 和 TCP 传输
2、支持 401/407 Digest 鉴权,适用于常见 qop=auth 场景
3、基于 socket 异步回调和 sys.task 后台循环,适合常驻运行
4、通过统一事件回调向外抛出注册、通话、媒体、消息、错误等状态

基本用法:
local sip = require "exsipclient"

sip.start({
    server = "192.168.1.10",
    port = 5060,
    domain = "example.com",
    user = "1001",
    password = "123456",
    transport = "tcp",
    event_callback = function(event, action, payload)
        if event == "register" and action == "ok" then
            log.info("sip", "register ok", payload.expires)
        elseif event == "call" and action == "incoming" then
            log.info("sip", "incoming call", payload.from)
        elseif event == "message" and action == "rx" then
            log.info("sip", "message rx", payload.text)
        elseif event == "error" and action == "net" then
            log.warn("sip", "network error", payload.event, payload.param)
        end
    end
})

注意事项:
1、回调运行在 socket 回调或 SIP 任务中,应保持短小,避免长时间阻塞
2、如果服务器要求 TCP 或 TLS,请同步匹配 transport 和底层 socket 配置
3、Contact 使用本地 IP 和端口,若设备位于 NAT 后,需要服务端支持 rport 或 received 等机制

exsipclient.start(opts)#

启动 SIP 客户端。

参数

传入值类型

解释

table

opts SIP 启动参数表,至少需要 server、port、domain、user、transport

返回值

返回值类型

解释

boolean

参数合法并成功启动后台任务返回 true,否则返回 false

例子

exsipclient.start({
    server = "192.168.1.10",
    port = 5060,
    domain = "example.com",
    user = "1001",
    password = "123456",
    transport = "tcp",
    local_port = 5062,
    expires = 600,
    rtp_port = 40000,
    codecs = {"PCMU", "PCMA"},
    ptime = 20,
    call_timeout = 30,
    event_callback = function(event, action, payload)
        -- event 可取 lifecycle、register、call、media、message、error
        -- lifecycle: online、offline、stopped
        -- register: ok、challenge
        -- call: incoming、established、ended、failed、auth_retry
        -- media: offer、ready、stop
        -- message: rx、sent、auth_retry、failed
        -- error: net、rx_failed
    end
})

exsipclient.stop()#

停止 SIP 客户端。

参数

返回值

返回值类型

解释

nil

无返回值

例子

exsipclient.stop()

exsipclient.on(fn)#

注册统一事件回调。

参数

传入值类型

解释

function

fn 事件回调函数,参数格式为 function(event, action, payload)

返回值

返回值类型

解释

boolean

设置成功返回 true,参数不是函数时返回 false

例子

exsipclient.on(function(event, action, payload)
    log.info("sip", event, action)
end)

exsipclient.call(target)#

发起外呼。

参数

传入值类型

解释

string

target 目标号码或 sip URI,例如 “1002” 或 “sip:1002@example.com”

返回值

返回值类型

解释

nil

无返回值

例子

exsipclient.call("1002")

exsipclient.answer()#

接听当前缓存的来电。

参数

返回值

返回值类型

解释

nil

无返回值

例子

exsipclient.answer()

exsipclient.hangup()#

挂断当前通话,或拒绝当前未接来电。

参数

返回值

返回值类型

解释

nil

无返回值

例子

exsipclient.hangup()

exsipclient.message(target, text)#

发送一条 SIP MESSAGE。

参数

传入值类型

解释

string

target 目标号码或 sip URI,例如 “1002” 或 “sip:1002@example.com”

string

text 要发送的消息文本

返回值

返回值类型

解释

nil

无返回值

例子

exsipclient.message("1002", "hello")