• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>
    您當(dāng)前的位置是:  首頁 > 新聞 > 文章精選 >
     首頁 > 新聞 > 文章精選 >

    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]
      好多同學(xué)都問這個問題,不知道是什么原因。其實,要檢查這個問題也很簡單,只需要用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)機(jī),核心狀態(tài)機(jī)是一個循環(huán),里面有個計數(shù)器,如果狀態(tài)機(jī)連續(xù)有500次處于CS_NEW狀態(tài),則打印錯誤日志W(wǎng)RONG_CALL_STATE,掛機(jī)。
      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),當(dāng)然至于為什么一直處于這個狀態(tài),還得進(jìn)一步的看代碼,那就不好找了。
      所以,最終分析該分題比較好的方法還是要配合SIP消息進(jìn)行分析。
      此處省略5000字 …
      好吧,既然我知道這個問題的原因我就不賣關(guān)子了。
      問題的原因在于SIP消息不完整,正常的SIP流程一般是:
      --> 主叫發(fā)送INVITE
      <-- FreeSWITCH回復(fù)100 Trying
      <-- 401 需要Challenge 驗證
      --> ACK
      --> 主叫發(fā)送帶認(rèn)證信息的INVITE
      … 繼續(xù)
      而此處的問題在于,主叫在收到401后,沒有回ACK,或者回了但沒有繼續(xù)發(fā)送INVITE消息,也就是,沒有按規(guī)矩出牌,導(dǎo)致FreeSWITCH一直處于等待狀態(tài),10秒后FreeSWITCH超時掛機(jī)。
      如果你的FreeSWITCH服務(wù)器部署在公網(wǎng)上,上面的問題多半是來自壞人的攻擊,小半是由于NAT問題等導(dǎo)致客戶端發(fā)送的ACK或INVITE到不了FreeSWITCH,小概率事件是你自己寫了個SIP客戶端半道崩潰了。
      具體的SIP消息我這里也沒有,大家不妨自己驗證下。
      有的同學(xué)說了,怎么驗證呢?嗯,就是不好驗證所以我才沒有SIP消息。因為,大家手頭的SIP客戶端都是按規(guī)矩出牌的,一下子想不按規(guī)矩出牌還真不容易做到。
      有沒有工具能發(fā)送任意我想要的SIP呢?還真有,你直接用nc,或者sipsak,或sipp都可以發(fā)送任意的SIP消息。不過,今天我就寫到這里了,有沒有人接龍呢?
      如果你想學(xué)好SIP,歡迎參加5月1-4日在阿姆斯特丹舉辦的OpenSIPS大會,查看如下網(wǎng)址或點擊「閱讀原文」直達(dá)。
      http://www.opensips.org/events/Summit-2018Amsterdam/
    【免責(zé)聲明】本文僅代表作者本人觀點,與CTI論壇無關(guān)。CTI論壇對文中陳述、觀點判斷保持中立,不對所包含內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔(dān)全部責(zé)任。

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

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

    下一篇:最后一頁

    專題

    CTI論壇會員企業(yè)

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 响水县| 津南区| 肃宁县| 成武县| 禹州市| 桦南县| 永顺县| 贵阳市| 德江县| 南皮县| 浠水县| 博客| 昌邑市| 九江县| 稷山县| 苍南县| 巴塘县| 崇阳县| 白银市| 广安市| 波密县| 麦盖提县| 宜春市| 遂平县| 天全县| 罗江县| 松阳县| 定结县| 西峡县| 济阳县| 阿巴嘎旗| 新田县| 凤庆县| 高邑县| 济源市| 台北市| 美姑县| 高台县| 庆城县| 双柏县| 兰州市| http://444 http://444 http://444 http://444 http://444 http://444