事情的經(jīng)過是這樣的。
有人聯(lián)系我們想幫忙解決個(gè)問題,并給出了問題的簡(jiǎn)單描述:
8根線不穩(wěn)定半小時(shí)就得重啟FreeSWITCH。
問題描述太過簡(jiǎn)略,因此我們建議用戶交納一定的費(fèi)用,我們進(jìn)一步溝通后再?zèng)Q定具體價(jià)格,為了便于理解,我們管這個(gè)費(fèi)用叫掛號(hào)費(fèi)。
但是客戶不太接受這個(gè)方案,不過愿意出更高的價(jià)格只要我們能夠保證解決。
其實(shí)客戶的這種方案對(duì)雙方風(fēng)險(xiǎn)都很大。我們最近挺忙,不想接這樣的單子。
不過,經(jīng)不住客戶再三溝通,最后簡(jiǎn)單問了一下客戶使用的什么網(wǎng)關(guān)評(píng)估了一下可能出現(xiàn)的問題。
其中有一個(gè)可能是迅時(shí)根本沒掛斷電話,可能是信號(hào)音檢測(cè)問題,也可能是NAT穿越問題導(dǎo)致FreeSWITCH掛機(jī)后BYE消息沒到達(dá)迅時(shí)因此電話未掛機(jī),所以導(dǎo)致所有端口都被占用因此打不通電話。
但是為什么重啟FreeSWITCH就能解決我們還不得而知。
這也是為什么我們要收掛號(hào)費(fèi),我們需要一些時(shí)間做進(jìn)一步檢測(cè)以便確認(rèn)問題。多數(shù)情況下,如果解決方法極其簡(jiǎn)單,我們也就不再多收費(fèi)用了;蛘吒嬖V用戶我們解決不了,去其它大醫(yī)院看看。當(dāng)然,如果我們認(rèn)為還得進(jìn)一步治療則評(píng)估下一步治療的價(jià)格。我們一直是這么做的。
不過,這次不同,客戶給了我們一些錢讓我們保證解決問題。好吧,藝高人膽大,把單子接下了。
事實(shí)證明這是個(gè)坑。
事實(shí)跟我們想象的完全不同。
1)客戶用Windows版的FreeSWITCH。我們更熟悉Linux,一般都默認(rèn)是Linux,在Linux上處理問題一般比Windows上快很多;
2)客戶的Windows只能用Teamviewer訪問,而Linux如果SSH訪問效率會(huì)高很多
3)客戶使用迅時(shí)MX8全FXS口網(wǎng)關(guān),而我們之前一直以為是FXO口網(wǎng)關(guān)
4)客戶使用SIP中繼對(duì)接到某運(yùn)營(yíng)商,但之前客戶根本就沒跟我們提到這個(gè)問題
5)客戶實(shí)際上是為客戶的客戶服務(wù),客戶也是用Teamviewer連接到客戶的客戶的Windows上,而客戶的客戶描述問題很不清
但騎上虎了也不能輕易就下來,硬新頭皮看看?蛻粢辉俾暦Q摘機(jī)聽忙音,但從我們檢測(cè)后判斷是客戶撥號(hào)后才聽忙音的。而且問題原因是SIP中繼側(cè)不通,跟迅時(shí)網(wǎng)關(guān)關(guān)系不大。
后來發(fā)現(xiàn),外呼流程是這樣的:
客戶FSX話機(jī)通過迅時(shí)呼到FreeSWITCH,F(xiàn)reeSWITCH再通過SIP中繼呼出去,而問題就出現(xiàn)在SIP中繼方面,F(xiàn)reeSWITCH剛啟動(dòng)時(shí)是好的,但過一陣再外呼是就回480,只有重啟FreeSWITCH才能恢復(fù)正常狀態(tài)。
后來我們檢查了一番,決定不重啟FreeSWITCH,而是重新注冊(cè)一下網(wǎng)關(guān):
sofia profile external register 010-NNNNNNNN
其中010-NNNNNNNN是客戶設(shè)置的網(wǎng)關(guān)的名字。本來是一串?dāng)?shù)字,保護(hù)隱私我們打了馬賽克。
果然,注冊(cè)后呼叫正常。
再查看網(wǎng)關(guān)配置,注冊(cè)周期為默認(rèn)值,嘗試把注冊(cè)周期改小一點(diǎn):
告訴客戶問題解決了,收工。
此處省力一萬字。
客戶周末都在上班,也夠拼的。
客戶說問題并沒實(shí)際解決,而是出問題的周期縮短了。好像每次自動(dòng)注冊(cè)后打電話是好的,很短時(shí)間內(nèi)就不好。
好吧,我們告訴客戶,對(duì)方回480這么詭異的問題,應(yīng)該去找對(duì)方。
從SIP概念上講,4開頭的響應(yīng)碼是客戶端錯(cuò)誤,應(yīng)該在客戶端修正然后重新發(fā)起呼叫可能就好了。
是的,注意上句中的可能。
我們已經(jīng)在嘗試修正了,比如改User Agent,開啟Ping等。問題是這種錯(cuò)誤要是有對(duì)端配合,可能很快就找到原因改好了,但是,如果對(duì)端不配合,你可能需要嘗試一萬種組合才可能解決問題。
果然,我們所有的嘗試都失敗了。要知道,這種嘗試是非;ㄙM(fèi)時(shí)間的。你改了,必須等待它再次出現(xiàn),再改,再等……死循環(huán)
所以事實(shí)往往是很悲催的——對(duì)端如果是大運(yùn)營(yíng)商的話,你能找到的所有人幾乎都不懂技術(shù);對(duì)端如果是小的“運(yùn)營(yíng)商”(姑且稱之為是運(yùn)營(yíng)商吧)的話,往往也沒有幾個(gè)是懂技術(shù)的,他們往往只會(huì)告訴你一句話,人家別人用的都是好的……
說到別人,還真有。后來客戶又告訴我們一個(gè)線索,人家迅時(shí)網(wǎng)關(guān)直接用這個(gè)SIP中繼注冊(cè)上去,打電話就沒有問題!
也算是個(gè)線索吧,抓包,對(duì)比,直到我們的包改的跟迅時(shí)的一模一樣我們也是不能解決問題。
而且我們發(fā)現(xiàn)迅時(shí)發(fā)的REGISTER消息Expire域?yàn)?00,對(duì)方回的是60,但我們?cè)贔reeSWITCH里也寫了600,對(duì)方回的就是1800。沒頭緒。
留給我們的時(shí)間已經(jīng)不多了。
好吧,即然迅時(shí)好,那就讓迅時(shí)做這個(gè)工作就好了。
改方案。
直接讓迅時(shí)注冊(cè)這個(gè)SIP中繼。FSX口的話機(jī)打電話時(shí),先送到FreeSWITCH,F(xiàn)reeSWITCH再送到迅時(shí),再通過這個(gè)中繼出去。有點(diǎn)繞,但是這也算是一種解決方案吧。
迅時(shí)跟FreeSWITCH對(duì)接可以簡(jiǎn)單的通過IP對(duì)接,即將呼叫送到FreeSWITCH的5080端口,不過,這樣有點(diǎn)不安全不是。所以,我們需要FSX口發(fā)起的電話呼叫到達(dá)FreeSWITCH時(shí),F(xiàn)reeSWITCH對(duì)迅時(shí)網(wǎng)關(guān)進(jìn)行認(rèn)證。
認(rèn)證方式有兩種:
1)在FreeSWITCH中設(shè)置ACL,允許ACL中指定的IP(即迅時(shí)網(wǎng)關(guān)的IP)呼叫5060端口。這種方式需要改ACL及Profile的一些配置,客戶沒采用這種方式。
雖然沒有采用,我們簡(jiǎn)單說一下配置方案,供參考。
在ACL中添加迅時(shí)的IP。這樣,迅時(shí)網(wǎng)關(guān)過來的呼叫就直接信任,不再發(fā)Challenge。但FreeSWITCH默認(rèn)還是走public Dialplan,可以在internal.xml里設(shè)置將默認(rèn)的 context = public 設(shè)成 context = default 以及任何其它值。
2)在FreeSWITCH中添加跟SIP中繼網(wǎng)關(guān)上一樣的用戶名和密碼,當(dāng)迅時(shí)來的呼叫到達(dá)FreeSWITCH 5060端口時(shí)發(fā)起Challenge,此時(shí),由于迅時(shí)注冊(cè)到遠(yuǎn)端的SIP中繼上,因此會(huì)用遠(yuǎn)端的SIP中繼提供的用戶名和密碼回應(yīng)FreeSWITCH,即用戶010NNNNNNNN和密碼PPPPPPPP。
因此,我們就在FreeSWITCH中添加了一個(gè)用戶,用戶名是010NNNNNNNN密碼是PPPPPPPP。
這樣,迅時(shí)網(wǎng)關(guān)就能呼叫FreeSWITCH的5060端口并正確的認(rèn)證(僅在呼叫INVITE時(shí)認(rèn)證,不注冊(cè))。
好了,在迅時(shí)網(wǎng)關(guān)上的路由是這么設(shè)的
FXS x ROUTE IP 192.168.1.100 # 任何來自FSX的呼叫都路由到FreeSWITCH
IP 1001 ROUTE FSX 1 # 來自FreeSWITCH的呼到,如果被叫號(hào)碼是1001,則路由到第一個(gè)電話口
IP 1002 ROUTE FSX 2 # 以此類推
IP 1003 ROUTE FSX 3 # 以此類推
IP 1004 ROUTE FSX 4 # 以此類推
IP 1005 ROUTE FSX 5 # 以此類推
IP 1006 ROUTE FSX 6 # 以此類推
IP 1007 ROUTE FSX 7 # 以此類推
IP 1008 ROUTE FSX 8 # 以此類推
IP 010NNNNNNNN ROUTE IP 192.168.1.100:5080 #來自SIP中繼的呼叫,如果呼入,則路由到FreeSWITCH,放IVR
IP x ROUTE IP 1.2.3.4 # 其它任何號(hào)碼都路由到SIP中繼網(wǎng)關(guān),以1.2.3.4為例
測(cè)試撥打一切正常。
以前,迅時(shí)網(wǎng)關(guān)是直接注冊(cè)到FreeSWITCH上的,因此,一個(gè)回呼命令類似如下的樣子:
originate user/1001 &bridge(sofia/gateway/010-NNNNNNNN/18612345678)
其中,010-NNNNNNNN是SIP中繼網(wǎng)關(guān)的名字。
但經(jīng)我們改動(dòng)后,迅時(shí)不再向FreeSWITCH注冊(cè),因此沒有了本地用戶,所以,呼叫命令改成:
originate sofia/gatewayxunshi/1001 &bridge(sofia/gateway/xunshi/18612345678)
其中xunshi時(shí)迅時(shí)對(duì)應(yīng)的網(wǎng)關(guān)的名字。
小結(jié):
- 我們堅(jiān)持的掛號(hào)費(fèi)是對(duì)的,對(duì)雙方都是有利的
- 不要低估問題的復(fù)雜性,顯然很多問題也可以分分鐘解決,但不可否認(rèn),大部分問題都會(huì)有意外
- 有些問題不一定非得在FreeSWITCH里解決,本例就是一個(gè)例子