简介
本文档介绍如何在Cisco Call Manager(CCM)中使用会话初始协议(SIP)规范化脚本,其中包含一些基本示例。
先决条件
要求
Cisco 建议您了解以下主题:
- 思科统一通信管理器(CUCM)8.x版及更高版本
- SIP 协议
- 脚本知识
使用的组件
本文档中的信息基于CCM版本11.5。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
配置
在CUCM中的中继上应用脚本
对于SIP中继,脚本需要直接应用于SIP中继。在SIP配置文件而非中继上使用脚本将不起作用。
以下是您需要遵循的步骤:
- 导航至Device > Device Setting > SIP Normalization Script Configuration,然后添加新脚本,如图所示。
2.导航至“设备”>“中继”。
选择要应用脚本的Trunk,并在其配置页面上选择之前创建的脚本。选择Enable Trace选项,它将在信号分布层(SDL)日志中打印脚本所做的更改,如图所示。保存配置,然后应用配置,然后重置中继,以使更改生效。
在SIP电话上应用脚本
对于SIP电话,您必须使用电话的SIP配置文件上的脚本。
以下是您需要遵循的步骤。
- 导航至Device > Device Setting > SIP Normalization Script并添加新脚本。
- 导航至Device > Device Setting > SIP profile。选择要应用脚本的SIP配置文件,或通过复制标准SIP配置文件创建新脚本。
- 在SIP配置文件的Configuration页面上,选择Script,然后选择Apply Config,并重置配置文件。
- 导航至Device > Phone。选择要应用脚本的电话,并更改其SIP配置文件(创建脚本后保存脚本),应用配置并重置电话以进行更改。
为常见场景开发脚本
有关如何开发SIP规范化脚本的详细步骤的主要来源如下:《SIP透明度和规范化开发人员指南》
本指南包含可用于处理SIP消息和会话描述协议(SDP)内容和其他高级API的不同功能。
以下是几个基本示例脚本:
修改报头
在此,您将替换传出SIP INVITE/REINVITE消息的From Header中的匿名消息。
M = {}
function M.outbound_INVITE(msg)
-- Replacing the Anonymous from From Header
local from = msg:getHeader("From")
local newfrom = string.gsub(from, "anonymous" ,"1111")
msg:modifyHeader("From", newfrom)
end
return M
代码 |
解释 |
M={} |
消息内容的初始化。M在此处获取SIP消息的所有内容 |
函数M.outbound_INVITE(msg) |
应用于M(SIP消息)的出站方向INVITE/REINVITE消息的Lua函数。方向始终取决于CUCM,无论是传入还是传出。消息类型可以是不同类型,如INVITE、183、200。 有关详细信息,请参阅SIP规范化开发人员指南的概述部分。 |
local from = msg:getHeader("From") |
以局部变量形式存储From消息的内容 |
getHeader |
在CCM中可用于规范化的函数之一,以便获取变量中报头的内容 |
string.gsub |
Lua函数以替换字符串中的特定内容 |
modifyHeader |
同样,CCM中可用的函数用于修改报头的内容 |
删除标题
在此,您将从传入SIP INVITE/REINVITE消息中删除思科指南报头:
M = {}
function M.inbound_INVITE(msg)
msg:removeHeader("Cisco-Guid")
end
return M
添加报头
在此,您将INFO添加到“允许”报头的内容中。
这将添加到逗号后允许的原始内容中。
M = {}
function M.outbound_INVITE(msg)
msg:addHeader("Allow", "INFO")
end
return M
处理SDP内容
有可用的API,用于从SIP消息修改SDP内容。为了修改SDP,它必须从Lua SIP消息对象获取SDP内容正文,并且SIP消息对象提供了getSdp()API。然后,脚本可以使用包含思科API的字符串库来操作SDP。修改时,SDP将使用SIP消息对象提供的setSdp(sdp)API写回SIP消息对象。有关这些API的详细信息,请参阅SIP消息API。
local sdp = msg:getSdp()
-- modification of the SDP happens at this point
-- Update the SDP associated with the SIP message
msg: etSdp(sdp)
注意:代码将G.722编解码器的a=行更改为G722,不带圆点。
M = {}
function M.inbound_INVITE(msg)
local sdp = msg:getSdp()
if sdp
then
local g722_line = sdp:getLine("a=","G.722")
if g722_line
then
--Replace G.722 with G722. The dot is special and must be escaped using % when using gsub.
g722_line = g722_line:gsub("G%.722", "G722")
sdp = sdp:modifyLine("a=", "G.722", g722_line)
msg:setSdp(sdp)
end
end
end
return M
验证
使用本部分可确认配置能否正常运行。
在应用脚本时启用跟踪选项,以验证脚本是否在SDL日志中工作。
故障排除
本部分提供了可用于对配置进行故障排除的信息。
以下是一些检查脚本是否未按预期工作:
- 如果脚本本身未执行(在SDL日志中查找规范化前/规范化后),则很可能未在设备上正确应用或出现一些语法错误。
- 验证开发人员指南中的CUCM规范化函数,对于Lua,使用任何可用的编译器对其进行验证。
- 如果脚本确实被执行,但没有进行任何更改,则检查脚本中使用的方向、消息类型和逻辑。
相关信息