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--->后端
媒体数据:客户端--->后端(抓包)

 

posted @ 2023-11-02 10:21  菜菜陈  阅读(1450)  评论(0)    收藏  举报