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
- 10.基本技能
- 基本技能
- 基本技能
- 计算机网络基本技能
- Android基本技能
- 程序员基本技能
- 电脑基本技能
- fiddler基本技能
- oracle 基本技能
- VIM 基本技能
- git 基本技能
- 学习测试的基本技能
- 程序员的基本技能
- 程序员七种基本技能
- 程序员的基本技能
- 控制台基本技能1
- 控制台基本技能0
- 应该掌握的基本技能
- POJ2192(Zipper)
- 跟小博老师一起学Servlet ——Servlet之监听器
- Qt for IOS:build from source
- segue跳转
- CF
- 10.基本技能
- maven+struts2
- 分支
- 二层多播数据分析
- [BOZJ 1188][HNOI2007]分裂游戏(博弈论)
- Oracle sqlldr
- BestCoder Round #92-1002 Count the Sheep
- LeetCode 59. Spiral Matrix II
- Linux学习(2)—Linux 系统安装搜狗输入法