簡介
本檔案介紹如何在思科呼叫管理器(CCM)中使用會話初始協定(SIP)規範化指令碼,僅提供幾個基本示例。
必要條件
需求
思科建議您瞭解以下主題:
- Cisco Unified Communications Manager(CUCM)版本8.x及更高版本
- SIP通訊協定
- 指令碼知識
採用元件
本檔案中的資訊是根據CCM 11.5版。
本文中的資訊是根據特定實驗室環境內的裝置所建立。文中使用到的所有裝置皆從已清除(預設)的組態來啟動。如果您的網路運作中,請確保您瞭解任何指令可能造成的影響。
設定
在CUCM的中繼上應用指令碼
對於SIP中繼,指令碼需要直接應用於SIP中繼。在SIP配置檔案上而不是中繼上使用指令碼將不起作用。
以下是您需要遵循的步驟:
- 導覽至Device > Device Setting > SIP Normalization Script Configuration,然後新增指令碼,如下圖所示。
2.導航至Device > Trunk。
選擇要應用指令碼的Trunk(中繼),並在該指令碼的配置頁面上選擇之前建立的指令碼。選擇Enable Trace選項,它將在訊號分佈層(SDL)日誌中列印指令碼所做的更改,如下圖所示。儲存配置、應用配置,然後重置中繼,以使更改生效。
在SIP電話上應用指令碼
對於SIP電話,必須使用電話SIP配置檔案上的指令碼。
以下是您需要遵循的步驟。
- 導航到Device > Device Setting > SIP Normalization Script,然後新增New Script。
- 導航到Device > Device Setting > SIP profile。選擇要應用指令碼的SIP配置檔案,或通過複製標準SIP配置檔案來建立新指令碼。
- 在SIP Profile的Configuration頁面上,依次選擇Script和Apply Config並重置配置檔案。
- 導覽至Device > Phone。選擇要應用指令碼的電話並使用建立的指令碼更改其SIP配置檔案,然後儲存它,應用配置並重置電話以便進行更改。
制定常見方案的指令碼
有關如何開發SIP規範化指令碼的詳細步驟的主要來源如下:SIP透明度和規範化開發人員指南。
本指南包含可在SIP消息和會話描述協定(SDP)內容及其他高級API中執行操作的不同功能。
下面是幾個基本的示例指令碼:
修改標題
您可以在此處替換傳出SIP INVITE/REINVITE消息的From報頭。
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函式,用於從字串中替換特定內容 |
修改標題 |
同樣,在CCM中有一個可用函式,用於修改報頭內容 |
刪除標題
此處,從傳入SIP INVITE/REINVITE消息中刪除Cisco-Guide報頭:
M = {}
function M.inbound_INVITE(msg)
msg:removeHeader("Cisco-Guid")
end
return M
新增標題
您可以在此處將INFO新增到Allow標題的內容中。
該內容將新增到逗號後允許的原始內容中。
M = {}
function M.outbound_INVITE(msg)
msg:addHeader("Allow", "INFO")
end
return M
操作SDP內容
有可用的API用於修改SIP消息中的SDP內容。為了修改SDP,它必須使用SIP消息對象提供的getSdp()API從Lua SIP消息對象獲取SDP內容主體。然後,指令碼可以使用包含思科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
驗證
使用本節內容,確認您的組態是否正常運作。
在應用指令碼時啟用Trace Option,以便驗證指令碼是否在SDL日誌中運行。
疑難排解
本節提供的資訊可用於對組態進行疑難排解。
下面是一些檢查指令碼是否未按預期工作:
- 如果指令碼本身沒有執行(在SDL日誌中查詢Before Normalization/After Normalization),則很可能該指令碼沒有正確應用到裝置上,或者存在某種語法錯誤。
- 從開發人員指南驗證CUCM規範化函式,對於Lua,使用任何可用的編譯器對其進行驗證。
- 如果指令碼確實被執行,但並未進行任何更改,則檢查指令碼中使用的方向、消息型別和邏輯。
相關資訊