您當前的位置是:  首頁 > 新聞 > 文章精選 >
 首頁 > 新聞 > 文章精選 >

FreeSWITCH:不按規(guī)矩出牌

2019-01-08 16:36:26   作者:   來源:CTI論壇   評論:0  點擊:


  WRONG_CALL_STATE
  在使用FreeSWITCH的過程中,經(jīng)常會看到日志中顯示W(wǎng)RONG_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,跟蹤下信令就知道原因了。不過,這種事情比較麻煩的是,你不知道它什么時候會出現(xiàn)。
  好在,F(xiàn)reeSWITCH是開源軟件,直接打開源代碼查看日志中描述文件的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),里面有個計數(shù)器,如果狀態(tài)機連續(xù)有500次處于CS_NEW狀態(tài),則打印錯誤日志W(wǎng)RONG_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字 …
  好吧,既然我知道這個問題的原因我就不賣關(guān)子了。
  問題的原因在于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服務器部署在公網(wǎng)上,上面的問題多半是來自壞人的攻擊,小半是由于NAT問題等導致客戶端發(fā)送的ACK或INVITE到不了FreeSWITCH,小概率事件是你自己寫了個SIP客戶端半道崩潰了。
  具體的SIP消息我這里也沒有,大家不妨自己驗證下。
  有的同學說了,怎么驗證呢?嗯,就是不好驗證所以我才沒有SIP消息。因為,大家手頭的SIP客戶端都是按規(guī)矩出牌的,一下子想不按規(guī)矩出牌還真不容易做到。
  有沒有工具能發(fā)送任意我想要的SIP呢?還真有,你直接用nc,或者sipsak,或sipp都可以發(fā)送任意的SIP消息。不過,今天我就寫到這里了,有沒有人接龍呢?
  如果你想學好SIP,歡迎參加5月1-4日在阿姆斯特丹舉辦的OpenSIPS大會,查看如下網(wǎng)址或點擊「閱讀原文」直達。
  http://www.opensips.org/events/Summit-2018Amsterdam/
【免責聲明】本文僅代表作者本人觀點,與CTI論壇無關(guān)。CTI論壇對文中陳述、觀點判斷保持中立,不對所包含內(nèi)容的準確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔全部責任。

相關(guān)熱詞搜索: FreeSWITCH

上一篇:AI時代、FreeSWITCH能做什么?

下一篇:最后一頁

專題

CTI論壇會員企業(yè)