opensips脚本

  1. #与前几节课的代码合并 has_totag是确定是否有tag
  2. if(is_method("INVITE")&&!has_totag()){
  3. #通过dispatcher查找fs
  4. if(ds_is_in_list("$si","$sp","1")){
  5. #通过查找location表中是否有该注册账户
  6. if(!lookup("location","m")){
  7. t_reply("404","Not Found");
  8. exit;
  9. }
  10. record_route();
  11. t_relay();
  12. exit;
  13. }
  14. #第四课
  15. if(!proxy_authorize("","subscriber")){
  16. proxy_challenge("","0");
  17. exit;
  18. }
  19. if(!ds_select_dst("1","1")){
  20. sl_send_reply("500","Service full");
  21. exit;
  22. }
  23. consume_credentials();
  24. record_route();
  25. t_relay();
  26. exit;
  27. }

freeswitch脚本

  1. <extension name="PlayBack Test">
  2. <condition field="destination_number" expression="^(1002)$">
  3. <action application="record_session" data="/root/record-$1.wav"/>
  4. <action application="bridge" data="sofia/external/$1@192.168.2.200:18627"/>
  5. <action application="set" data="This is a test"/>
  6. </condition>
  7. </extension>

通过opensips上的注册分机打给另一个分机,通过fs
image.png
image.png

拓展

个性铃声,编辑 conf/autoload_configs/portaudio.conf.xml,将ring-file一行修改为下面的 样子,其中,value指定你的声音文件的路径

  1. <param name="ring-file" value="/home/your_name/your_ring_file.wav"/>
  2. #重新加载模块
  3. freeswitch> reloadxml
  4. freeswitch> reload mod_portaudio

问题

1.如果出现连接错误,多看fs_cli打印日志

2.铃声没有

3.正则表达式需要详细查看

拓展

1.常用diaplan

set用于设置一个通道变量

  1. <action application="set" data="my_var=123456"、》

echo即回声,这个我们已经很熟悉了,它在调试的时候比较有用

  1. <action applicatioin="echo"/>

info在调试的时候也比较有用,它会在日志中打印全部的通道变 量

  1. <action applicaiton="info"/>

answer用于应答一路呼叫。FreeSWITCH做被叫时,如果想给主叫 方放音,则必须应答后才可以

  1. <action application="answer"/>

bridge负责桥接另一条腿(b-leg),它的参数是一个呼叫字符 串

  1. <action application="bridge" data="user/1000">
  2. bridge操作是阻塞的,它会一直等到b-leg释放后才继续往下走。

playback用于给Channel放音。比如,如果需要对主叫放音,我们 可以这样使用playback

  1. <action application="playback" data="/tmp/test.wav"/>

sleep用于设置可以等待/暂停的一段时间,单位默为毫秒

  1. <action application="sleep" data="1000"/>

ring_ready用于在SIP中给对方回180消息,即通知对方可以振铃 了

  1. <action application="ring_ready" data="1000"/>

pre_answer用于在SIP中给对方回183消息,后续的playback之类的 动作将作为早期媒体(Early Media)给对方发过去,如彩铃音

  1. <action application="ring_ready" data="1000"/>
  2. <action application="playback" data="/tmp/music.wav"/>

read用于实现播放声音并且等待接收DTMF按键

play_and_get_digits与read类似,但它比read更高级,我们先来看 一下它的参数

2.正则表达式 https://www.runoob.com/regexp/regexp-syntax.html

https://www.zhihu.com/question/48219401/answer/742444326

3.录音

第11章

单腿录音

  1. <extension name="record">
  2. <condition field="destination_number" expression="^rec(.*)$">
  3. <action application="answer"/>
  4. <action application="playback" data="tone_stream://%
  5. (100,1000,800)"/>
  6. <action application="record" data="/tmp/$1.wav"/>
  7. </condition>
  8. </extension>

对两条腿的通话进行录音

  1. <extension name="record">
  2. <condition field="destination_number" expression="^(100[0-9])$">
  3. <action application="record_session" data="/tmp/record-$1.wav"/>
  4. <action application="bridge" data="user/$1"/>
  5. </condition>
  6. </extension>