在使用FreeSWITCH的過程中,經常會看到日志中顯示WRONG_CALL_STATE,如:
2018-02-12 13:00:30.734977 [WARNING]
switch_core_state_machine.c:687
sofia/internal/41@1.2.3.4 Abandoned
2018-02-12 13:00:30.734977 [NOTICE]
switch_core_state_machine.c:690
Hangup sofia/internal/41@1.2.3.4
[CS_NEW] [WRONG_CALL_STATE]
好多同學都問這個問題,不知道是什么原因。其實,要檢查這個問題也很簡單,只需要用sofia profile internal siptrace on打開SIP Trace,跟蹤下信令就知道原因了。不過,這種事情比較麻煩的是,你不知道它什么時候會出現。
好在,FreeSWITCH是開源軟件,直接打開源代碼查看日志中描述文件的687~690行就好了,大致是這樣的:
while ((state = switch_channel_get_state(session->channel)) != CS_DESTROY) {
uint32_t new_loops = 500;
…
if (endstate == CS_NEW) {
switch_yield(20000);
switch_ivr_parse_all_events(session);
if (!--new_loops) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "%s %s Abandoned\n",
session->uuid_str, switch_core_session_get_name(session));
switch_channel_set_flag(session->channel, CF_NO_CDR);
switch_channel_hangup(session->channel, SWITCH_CAUSE_WRONG_CALL_STATE);
}
} else {
…
}
}
從代碼上看,問題發(fā)生在FreeSWITCH的核心狀態(tài)機,核心狀態(tài)機是一個循環(huán),里面有個計數器,如果狀態(tài)機連續(xù)有500次處于CS_NEW狀態(tài),則打印錯誤日志WRONG_CALL_STATE,掛機。
switch_yield(20000)是等待20毫秒,因為循環(huán)500次的時間大約是20毫秒 x 500 = 20000毫秒 = 10秒。
從日志中我們倒回10秒查找日志,果然能找到電話初始化時候的日志:
2018-02-12 13:00:20.714977 [NOTICE]
switch_channel.c:1104 New Channel sofia/…
也就是說,從電話初始化,到釋放,Channel的狀態(tài)一直處于CS_NEW狀態(tài),當然至于為什么一直處于這個狀態(tài),還得進一步的看代碼,那就不好找了。
所以,最終分析該分題比較好的方法還是要配合SIP消息進行分析。
此處省略5000字 …
好吧,既然我知道這個問題的原因我就不賣關子了。
問題的原因在于SIP消息不完整,正常的SIP流程一般是:
--> 主叫發(fā)送INVITE
<-- FreeSWITCH回復100 Trying
<-- 401 需要Challenge 驗證
--> ACK
--> 主叫發(fā)送帶認證信息的INVITE
… 繼續(xù)
而此處的問題在于,主叫在收到401后,沒有回ACK,或者回了但沒有繼續(xù)發(fā)送INVITE消息,也就是,沒有按規(guī)矩出牌,導致FreeSWITCH一直處于等待狀態(tài),10秒后FreeSWITCH超時掛機。
如果你的FreeSWITCH服務器部署在公網上,上面的問題多半是來自壞人的攻擊,小半是由于NAT問題等導致客戶端發(fā)送的ACK或INVITE到不了FreeSWITCH,小概率事件是你自己寫了個SIP客戶端半道崩潰了。
具體的SIP消息我這里也沒有,大家不妨自己驗證下。
有的同學說了,怎么驗證呢?嗯,就是不好驗證所以我才沒有SIP消息。因為,大家手頭的SIP客戶端都是按規(guī)矩出牌的,一下子想不按規(guī)矩出牌還真不容易做到。
有沒有工具能發(fā)送任意我想要的SIP呢?還真有,你直接用nc,或者sipsak,或sipp都可以發(fā)送任意的SIP消息。不過,今天我就寫到這里了,有沒有人接龍呢?
如果你想學好SIP,歡迎參加5月1-4日在阿姆斯特丹舉辦的OpenSIPS大會,查看如下網址或點擊「閱讀原文」直達。
http://www.opensips.org/events/Summit-2018Amsterdam/