lua
复制代码
-- kamailio-test.lua
-- 定义主请求路由函数
function request_route()
-- 获取 SIP 请求方法(如 INVITE、REGISTER 等)
local method = KSR.pv.get("$rm")
-- 记录日志,输出接收到的 SIP 方法
KSR.log(LOG_NOTICE, "Received " .. method .. " request")
-- 检查 Max-Forwards 头字段,防止请求无限循环
-- KSR.maxfwd.process_maxfwd(10) 会递减 Max-Forwards 的值
-- 如果 Max-Forwards 的值小于 10,返回 -1
if KSR.maxfwd.process_maxfwd(10) < 0 then
-- 如果 Max-Forwards 值不合法,发送 483 Too Many Hops 响应
KSR.sl.send_reply(483, "Too Many Hops")
-- 终止脚本执行,不再处理该请求
return
end
-- 处理 REGISTER 请求
-- 检查 SIP 方法是否为 REGISTER
if KSR.pv.is_method("REGISTER") then
-- 调用 registrar 模块的 save 函数,保存用户位置信息
-- 如果保存失败(返回 -1),发送错误响应
if KSR.registrar.save("location") < 0 then
KSR.sl.reply_error()
end
-- 终止脚本执行,不再处理该请求
return
end
-- 处理 INVITE 请求
-- 检查 SIP 方法是否为 INVITE
if KSR.pv.is_method("INVITE") then
-- 调用 registrar 模块的 lookup 函数,查找被叫用户的位置
-- 如果查找失败(返回 -1),发送 404 User Not Found 响应
if KSR.registrar.lookup("location") < 0 then
KSR.sl.send_reply(404, "User Not Found")
-- 终止脚本执行,不再处理该请求
return
end
-- 如果查找成功,调用 tm 模块的 t_relay 函数,转发请求
KSR.tm.t_relay()
end
-- 处理其他 SIP 方法(如 BYE、ACK 等)
-- 如果不是 REGISTER 或 INVITE 请求,发送 405 Method Not Allowed 响应
KSR.sl.send_reply(405, "Method Not Allowed")
end
注释说明
1. 函数定义
lua
复制代码
function request_route()
- 定义了一个名为
request_route
的函数,这是 Kamailio 调用 Lua 脚本的入口函数。
2. 获取 SIP 方法
lua
复制代码
local method = KSR.pv.get("$rm")
- 使用
KSR.pv.get("$rm")
获取 SIP 请求的方法(如 INVITE
、REGISTER
等)。
$rm
是 Kamailio 的伪变量,表示 SIP 请求方法。
3. 记录日志
lua
复制代码
KSR.log(LOG_NOTICE, "Received " .. method .. " request")
- 使用
KSR.log()
记录日志,输出接收到的 SIP 方法。
LOG_NOTICE
是日志级别,表示普通信息。
4. 检查最大跳数
lua
复制代码
if KSR.maxfwd.process_maxfwd(10) < 0 then
KSR.sl.send_reply(483, "Too Many Hops")
return
end
- 调用
KSR.maxfwd.process_maxfwd(10)
检查并递减 Max-Forwards
的值。
- 如果
Max-Forwards
的值小于 10,发送 483 Too Many Hops
响应并终止脚本执行。
5. 处理 REGISTER 请求
lua
复制代码
if KSR.pv.is_method("REGISTER") then
if KSR.registrar.save("location") < 0 then
KSR.sl.reply_error()
end
return
end
- 使用
KSR.pv.is_method("REGISTER")
检查是否为 REGISTER
请求。
- 如果是
REGISTER
请求,调用 KSR.registrar.save("location")
保存用户位置信息。
- 如果保存失败,发送错误响应并终止脚本执行。
6. 处理 INVITE 请求
lua
复制代码
if KSR.pv.is_method("INVITE") then
if KSR.registrar.lookup("location") < 0 then
KSR.sl.send_reply(404, "User Not Found")
return
end
KSR.tm.t_relay()
end
- 使用
KSR.pv.is_method("INVITE")
检查是否为 INVITE
请求。
- 如果是
INVITE
请求,调用 KSR.registrar.lookup("location")
查找被叫用户的位置。
- 如果查找失败,发送
404 User Not Found
响应并终止脚本执行。
- 如果查找成功,调用
KSR.tm.t_relay()
转发请求。
7. 处理其他请求
lua
复制代码
KSR.sl.send_reply(405, "Method Not Allowed")
- 如果不是
REGISTER
或 INVITE
请求,发送 405 Method Not Allowed
响应。