FreeSwitch的介绍(可以用lua写fs)
一、freeswitch中的lua api
session:getVariable 获取系统变量
session:setVariable 在会话中设置变量
session:ready
1、检查会话是否处于活动状态(在呼叫开始和挂断之间为true,即激活状态)
2、如果呼叫被转移(transfer),session.ready将返回false
session:answer 应答
session:flushDigits 清除输入缓冲区的dtmf数字
session:playAndGetDigits 自定义dtmf
session:streamFile 无限往一个会话中输入流文件
session:execute(app,data) 执行app
二、软电话的配置(fs里的配置)
docker里的conf/directory/default目录
dialplan目录---拨号计划
default.xml | 默认的拨号计划配置,一般用于内部用户路由 ,处理外呼场景
public.xml | 默认的拨号计划配置,一般用于外部来话路由 ,处理呼入场景
先执行dialplan下的xml文件,再到lua脚本,lua里有配置调用xml的会再回来执行xml
-默认配置,表示第一次匹配失败时停止
default和public不一定确定是呼入和呼出,会根据端口确定internal还是external,再根据对应的internal或external配置文件确定走哪个xml
<action application="answer"/> 指的是直接应答
<action application="bridge" data="user/13333333333"/> 可以通过模拟线路打给软电话
软电话的密码配置在/usr/local/freeswitch/conf/vars.xml文件里,密码错误一般会软电话会报错403forbiden
internal和external配置一般是看conf/sip_profiles/internal.xml或external.xml配置文件中的context
三、SIP协议
请求消息(request)参考的路由:如果有Route/Record-Route,request就应该根据Route发送,如果没有就根据Contact头域发送,如果连Contact都没有,就根据From头域发送。
请求消息有:
INVITE/reINVITE:INVITE 发起会话邀请。reINVITE(在一个已存在的对话中发送的INVITE称为reINVITE)修改已建立会话的参数。
ACK:完成会话建立的3次握手 [INVITE-200-ACK],仅仅用于INVITE
BYE :结束会话。
CANCEL:取消正在建立中会话(INVITE已发送,但尚未收到最终响应(final response))。
UPDATE:更新会话参数。它被建议用于替代 re-INVITE,与 re-INVITE不同在于:它可以在初始INVITE未完成时发送,能用于在早对话(early dialog)中更新会话参数。
PRACK:临时响应(Provisional
Response)确认。用于确认收到了临时响应,例如 “183 Session
Progress”,以支持临时响应的可靠传送。它不能应用于“100 Trying ”,只有101~199 临时响应需要可靠传送。如果没有收到
PRACK,响应消息将被重传。
响应消息(response)使用via头
1xxx属于临时响应,2xx~6xx属于最终响应。
uri是指
sip:x@y:Port
四、fs的常用命令
./fs_cli客户端下常用命令:
conference 会议室ID list #查看会议室成员id(member_id)
conference 会议室ID energy <member_id>|all <newval>
#设置会议室全体或者某个成员的降噪级别
conference 会议室ID recording start <路径> #开始录制会议室的音频
conference 会议室ID recording stop <路径> #结束录制,可以不写
record对应recording start,norecord对应recording stop,chkrecord对应recording check,
pause对应recording pause,resume对应recording resume它们功能完全一样
conference 会议室ID play /home/test.wav
uuid_broadcast <uuid> <path> [aleg|bleg|both]
#播放会议室音频,uuid可通过上面list查看,也是针对单个用户
sofia status 可以查看使用的端口
sofia global siptrace on/off 打开或者关闭呼叫信令的详细信息
/event plain all 查看所有的事件
originate {origination_caller_id_name=02100000000,origination_caller_id_number=02100000000}sofia/external/18888888888@1.16.15.18:5060 &echo()
#调用021号码给188打电话
originate {origination_caller_id_name=02100000000,origination_caller_id_number=02100000000}sofia/external/18888888888@1.16.15.18:5060 &conference(1000)
#建立1000会议室
五、线路分两种对接方式:
1、公网对接,也就是使用我们opensips的公网地址12.12.2.2:5080去对接,内网nat成公网,连接opensips进行路由
2、专线对接,直接实体线连到路由器,客户那边是内网地址进来,我们网络需要先nat成同网段内网,然后再连接opensips进行路由
六、opensips的介绍
opensips路由添加,在数据库里插入路由信息
外呼:address-->trunk_info-->dr_groups-->dr_rules-->dr_gateways
根据trunk_info表中的route_strategy区分是外呼(drouting)还是呼入(dispatcher)
十位数非0,是呼入,十位数为0,个位数取值0,1,2,是外呼,0表示优先主叫路由,主叫路由失败使用被叫路由,1表示使用主叫路由,2表示被叫路由
呼入:address-->trunk_info-->dispatcher
opensips脚本的变量
$fU获取from头的电话号码,$ai获取P-Asserted-Identity的完整uri(全部内容)
$var(xxx)自定义变量
只要$ai中的电话号码----$var(newai) = $(ai{uri.user})
路由顺序有影响
append_hf(txt) #最后行追加路由
_hf(txt) #第一行插入的路由
is_persent_hf(hf_name) #如果出现包含hf的字段,返回真
opensips -c #检查opensips配置文件是否正常
opensipsctl fifo dr_reload #dr_相关的表有改动时可以这样重新加载
opensipsctl fifo address_reload #address表有改动这样加载
七、其它
paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文
件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实
tostring 将变量转换成字符串类型
options探测包,检查网络是否正常
HOMER是一款100%开源的针对SIP/VOIP/RTC的抓包工具和监控工具,可以使用即时搜索、处理和存储大量的信令、RTC事件、日志和统计信息
抓包终端(freeswitch/opensips内置)--->抓包服务器(kamailiao,收集sip信令)--->数据库(mysql/postgres)--->HOMER API(web页面)--->USER(用户)
SDP协议:----offer/answer模式
主要是传输中的会话控制,通常是会话的音频、视频等,通信双方也需要协商格式等
主要包含
c层:ipv4/ipv6 ip地址
m层:audio/vedio等 端口
PCMA音频编码
如果请求某媒体流的方向为sendonly,那么响应中对应媒体的方向必须为recvonly;
如果请求某媒体流的方向为recvonly,那么响应中对应媒体的方向必须为sendonly;
如果请求某媒体流的方向为sendrecv,那么响应中对应媒体的方向可以为sendrecv/sendonly/recvonly/inactive中的一种;
early media 早期媒体,指的时呼叫未建立时的媒体交互,典型的如回铃音
对应的是常规媒体 regular media (媒体层)
dialplan fs代码里的一个重要配置
指定了电话到达freeswitch之后的路由以及行为,决定了通话的流程
路径conf/dialplan目录下的xml文件
信令层后端服务器数据需要通过op代理服务器再到客户,媒体层直接后端服务器和客户进行数据交互。
信令:客户端--->OP--->后端
媒体数据:客户端--->后端(抓包)
浙公网安备 33010602011771号