目录

简介

先决条件

要求

使用的组件

配置

在CUCM中的中继上应用脚本

在SIP电话上应用脚本

为常见场景开发脚本

修改报头

删除标题

添加报头

处理SDP内容

验证

故障排除

相关信息

简介

本文档介绍如何在Cisco Call Manager(CCM)中使用会话初始协议(SIP)规范化脚本，其中包含一些基本示例。

先决条件

要求

Cisco 建议您了解以下主题：

- 思科统一通信管理器(CUCM)8.x版及更高版本

- SIP 协议

- 脚本知识

使用的组件

本文档中的信息基于CCM版本11.5。

本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始（默认）配置。如果您的网络处于活动状态，请确保您了解所有命令的潜在影响。

配置

在CUCM中的中继上应用脚本

对于SIP中继，脚本需要直接应用于SIP中继。在SIP配置文件而非中继上使用脚本将不起作用。

以下是您需要遵循的步骤：

1. 导航至Device > Device Setting > SIP Normalization Script Configuration，然后添加新脚本，如图所示。

2.导航至“设备”>“中继”。

选择要应用脚本的Trunk，并在其配置页面上选择之前创建的脚本。选择Enable Trace选项，它将在信号分布层(SDL)日志中打印脚本所做的更改，如图所示。保存配置，然后应用配置，然后重置中继，以使更改生效。

在SIP电话上应用脚本

对于SIP电话，您必须使用电话的SIP配置文件上的脚本。

以下是您需要遵循的步骤。

1. 导航至Device > Device Setting > SIP Normalization Script并添加新脚本。

2. 导航至Device > Device Setting > SIP profile。选择要应用脚本的SIP配置文件，或通过复制标准SIP配置文件创建新脚本。

3. 在SIP配置文件的Configuration页面上，选择Script，然后选择Apply Config，并重置配置文件。

4. 导航至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，使用任何可用的编译器对其进行验证。

- 如果脚本确实被执行，但没有进行任何更改，则检查脚本中使用的方向、消息类型和逻辑。

相关信息

- https://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cucm/sip_tn/8_5_1/sip_t_n/8-trace.html

- https://supportforums.cisco.com/t5/collaboration-voice-and-video/a-guide-to-sip-normalization-on-cucm-and-lua-scripting/ba-p/3099409

- 技术支持和文档 - Cisco Systems