10.基本技能

来源:互联网 发布:软件打包有哪些 编辑:程序博客网 时间:2024/04/29 23:17

1.调试与排错

根据问题现象, 系统提供的日志, 线索等查找原因1)解决问题的一般方法和流程    发现问题, 定位问题, 分析问题, 解决问题    Alice告诉我们, 她通过Freeswitch呼叫Bob, 能打通,但没有声音        首先, 两端都听不到, 还是一方没有声音        其次, 每次都听不到,还是偶尔听不到, 偶尔是在什么情况下听不到        再次, Alice和Bob使用的是什么UA,什么型号        网络情况怎么样,用ADSL,宽带,还是手机上网    Alice普通用户, 她可能不知道这些, 这种情况下,我们需要多问一下Alice, 确认实际上是否与Alice描述的一致, 能否重新等        核实问题的现象, 假定Alice不可信,她可能描述不清楚, 最好自己试        问题能否重现        分段法            一个问题可能涉及多个环节,我们把这些环节从逻辑和功能上分开,一段段检查        换位思考法            Alice打给Bob没有声音, 那么Bob打开Alice有没有声音,能不能让Alice或Bob换其他话机试试    显示当前通话Channel的UUID        show channels    调试媒体相关的信息        uuid_debug_media uuid both on/off    使用回拨命令录音        originate user/1002 &record(/tmp/test.wav)2)查看日志    打开BEBUG级别的日志        console loglevel debug

2.使用外部工具抓包

对IP包进行全面分析,或存档,需要使用外部的工具抓包1)tcpdump    抓取5060端口上的SIP包        tcpdump -nq -s 0 -A -vvv -i etho0 port 5060        -n,q 表示不进行域名翻译及减少输出内容        -s 0 表示不限制包长,争取抓最大的长度        -A 表示以ASCII方式输出        -v 表示详细程度,v越多越详细        -i 表示指定的网卡        port 5060 表示过滤器    写入文件 -w        tcpdump -nq -s 0 -i eho0 -w /tmp/dump.pcap udp    针对用户抓包        tcpdump -i etho0 -s 0 -A host 192.168.7.5 and port 652722)tshark    直接在命令行运行tshark    从第一块网卡上抓包        tshark -i eth0    抓包结果写入pcap文件        tshark -i eth0 -w /tmp/dump.pcap    与tcpdump相比,tshark能认识更多的协议,能直观看到收发的SIP包        tshark host 192.168.1.9 and port 50603)ngrep    提供类似于Freeswitch内部抓包输出的显示方式, 比较直观        ngrep -p -q -W byline port 5060        -p 表示不使用混杂模式        -q 表示使用安静模式,仅输出包头和包的载荷        -W 表示选择一种显示输出方式,byline 按换行符进行换行        port 5060 是一个过滤器,只想看我们关心的包    对内容过滤        ngrep -p -q '139xxxxxxxxx' -W byline port 50604)pcapsipdump    将不同通话IP包存到不同的文件,某一路通话所有的SIP和RTP数据都存到同一个文件        pcapsipdump -i eth0 -d /tmp/sipdump/

…………….

4.originate命令示例解析

originate命令用于从Freeswitch中向外发起一个呼叫1)使用格式和参数    call url        呼叫字符串(Dial String)        originate user/1000 &echo        user/1000,就是呼叫字符串,表示从本地的注册用户中查找该用户的联系地址    同振: 同时呼叫1000和1001,哪个先接听则接通哪个,另一路自动挂断        originate user/1000,user/1001 &echo    顺振: 第一个呼叫失败则呼叫第二个        originate user/1000|user/1001 &echo2)转入Dialplan    接听后进入public Dialplan查找路由        originate user/1000 1001 XML public3)更改主叫号码    000000000,是Freeswitch发起呼叫时默认使用的主叫号码,我们可以指定主叫号码        originate user/1000 &echo XML default 'Seven Du' 777        如果参数有空格,需要用单引号引起来4)处理呼叫超时    不是对方不接电话超时的秒数, 而是对方在收到我们INVITE消息后, 不回复100 Trying消息的时间    一般来说这种情况下IP地址不可达        sofia profile internal siptrace on        originate sofia/internal/1000/192.168.100.100        由于地址不存在,发送INVITE消息后,没有收到100Trying,于是在1s后重发,如果还收不到则于2s,4s重发        10s超时,超过10s后失败,返回NO_ANSWER5)originate命令是阻塞的    如果执行上述命令, 则无法出入其他命令或取消呼叫    使用bgapi可以避免阻塞        bgapi originate sofia user/1000 &echo    开启另一个fs_cli,使用show channels找到呼叫UUID,然后uuid_kill6)使用通道变量    通道变量可以影响呼叫行为, 在使用originate时也可以使用通道变量    改变主号名称和号码        originate {origination_caller_id_name='Seven Du',origination_caller_id_number=7777}user/1000 &echo    多个通道变量之间使用逗号隔开, 可以使用反斜杠进行转义        originate {absolute_codec_string=G729\,PCMU} user/1000 &echo    局部通道变量,先呼叫某用户分机号, 超时则通过网关1呼叫手机号, 再超时通过网关2呼叫        originate {var1=1}[leg_timeout=0]user/1000 | [leg_timeout=20]sofia/gateway/gw1/1300000000| [leg_timeout=20]sofia/gateway/gw2/130000000        leg_timeout只应用于靠近它的一条腿, 用于定义超时, 等待对方返回媒体(183或200)的超时时间7)Early Media对呼叫的影响    如果我们呼叫本地的IP, 对方回180Ring, 同样的情况下如果通过网关对PSTN用户呼叫, 则PSTN往往返回Early Media, 也就是前期的振铃音或彩铃    PSTN呼叫失败也返回Early Media,如"您拨打的电话忙..."    Early Media对我们没有意义, 在主动外呼的应用中, 希望用户真正接听以后才对他放音    有一个参数可以做到        originate {ignore_early_media=true}sofia/gateway/gw/1380000000 &playback(/tmp/test.wav)        通过指定ingnore_early_media变量, Freeswitch在发起呼叫时忽略对方返回的Early Media,等收到正常应答(200)才返回8)bridge也使用originate    我们使用originate命令发起一个呼叫, 接通1000和1001两个号码        originate user/1000 &bridge(user/1001)    当originate发起呼叫时, 建立一个Channel, 然后呼叫1000, 1000接听后, 在该Channel执行bridge, bridge会建立另一个Channel来呼叫1001        1001接通后,bridge会把它们的媒体也桥接起来, 此时进入正常通话9)bridge中的Early Media    如果b-leg返回SIP的183, 则Freeswitch也会想a-leg返回183, 因此将b-leg收到的媒体发到a-leg上,a-leg就听到了回铃音(彩铃)    如果b-leg返回180, 则由于a-leg已经接听, 因此Freeswitch认为无法为a-leg发送180 Ringing消息,因此a-leg,b-leg振铃期间听不到任何声音10)bridge中的主叫号码    设置主叫号码        originate {origination_caller_id_number=7777} user/1000 &echo    我们使用bridge呼叫b-leg        originate {origination_caller_id_number=7777} user/1000 &bridge(user/1001)        Freeswitch发现a-leg是一个回呼, 当a-leg接听后, 再作为主叫去呼叫b-leg, a-leg的主叫号码变成了1000, 桥接的时候变成了1001, 显示主叫号码是1000

5.呼叫是怎么工作的?

假设从1000呼叫1001    1000的SIP话机作为UAC会发送INVITE请求到Freeswitch 5060端口,到达internal的Profile配置的UAS    UAS收到INVITE后返回100响应码, 表示我收到了你的请求,对INVITE鉴权,Freeswitch会到用户目录查找相应的用户    找到1000.xml配置的用户信息,并根据配置的用户名,密码鉴权,通过后,收到用户信息    进入路由阶段,查找Dialplan,        <user id="1000">            <variables>                <variable name="accountcod" value="1000"/>                <variable name="user_context" value="default"/>     -->default            .....        <include>            <context name="default">                                -->default                <extension name="record">                ....    查找Dialplan, 会帮你找到1001这个用户, 并执行bridge user/1001,        user/1001 被称为呼叫字符串    再次查找Directory, 找到1001.xml参数        1001是被叫, 它会找到1001实际注册的位置,用data-string参数表示        该参数放到directory/default.xml            <param name="dial_string" value="{sip_invite_domain=${dialed_domain},presence_id=${dialed_user}@${dialed_domain}}&{sofia_contact{${dialed_user}@${dialed_domain})}"/>        sofia_contact会查找数据库,找到1001实际注册的Contact地址,并返回真正的呼叫字符串        返回1001注册的Contact            sofia_contact 1001@192.168.1.109    找到呼叫字符串后, Freeswitch又启动另一个会话,作为UAC给1001发送INVITE请求, 如果1001接通,则向Freeswitch回送200,    Freeswitch向1000回200 OK, 通话开始        打开跟踪命令            sofia profile internal siptrace on        关闭调试命令            sofia profile internale siptrace off

6.Freeswitch图形用户界面简介

对于Freeswitch新手或维护人员来讲,更喜欢使用图形界面操作Freeswitch开发Freeswitch的GUI有两种方法:    提供图形界面, 后台修改Freeswitch的XML配置文件,调用reloadxml    使用Freeswitch提供的xml_curl接口, 提供一个HTTP服务器向Freeswitch提供XML, 可以管理多台Freeswitch, 并适合大规模部署1)FusionPBX    使用PGP开发的Freeswitch GUI, 支持Linux, Windows, BSD, Mac OS等多种操作系统, 支持POST供热SQL, MySQL, SQLite等    它通过将数据库存储到数据库中, 并修改本地的XML配置文件        支持无限的分机, IVR, 呼叫组, 传真, 会议, 队列, 呼叫前转, 点击拨号以及实时呼叫状态显示等诸多特性2)blue.box    使用PHP/MySQL技术开发, 基于Asterisk的GUI FreePBX, 号称FreePBX V3, 使用修改本地XML配置文件并重新加载的工作方式        支持普通用户, 分机, 路由管理, 支持多语言, 多租户3)Freeswitch Portal    与其他GUI系统不同, 它作为GUI系统的补充, 提供一些开发者常用的功能    Freeswitch Portal内置于Freeswitch, 依赖于mod_xml_rpc模块提供的Webserver    该模块是默认编译的,但不加载,只需要加载该模块,即可使用        load mod_xml_rpc    如果想让该模块随着Freeswitch启动而自动加载, 可以在conf/autoload_configs/modules.xml中将模块的注释去掉        <load module="mod_xml_rpc"/>    使用浏览器打开http://localhost:8080/portal,用户名,密码: freeswitch,works        密码在/conf/autoload_configs/xml_rpc.conf.xml配置    系统菜单        Users: 显示所有用户        Calls: 显示当前呼叫状态, 选中Auto Update,表示实时更新        Channels: 显示所有Channel的状态, 它是实时更新的        Show: 显示Freeswitch内部信息            注册信息, 已加载模块, App, API等    网页调试        控制台输入 event("ALL"),订阅全部事件            这时候打电话, 就可以看到调试窗口输出各种事件的名字            读者就知道打一个电话大体会产生那些事件        不想看详细信息, 控制台输入            global_debug_event = true        直接执行Freeswitch的API命令            api("status");            api("sofia status");            bgapi("originate user/1000 &echo");    Freeswitch致力于简单, 实用, 易用

7.小结

常用基本技能调试技巧实用工具
0 0