FreeSWITCH 简单图形化界面36 -使用mod_sms发送短消息
- 0、测试环境
- 1、mod_sms模块安装
- 2、编写聊天规则
- 2.1 使用xml文件
- 测试一下
- 2.2 使用脚本文件
- 测试一下
0、测试环境
http://myfs.f3322.net:8020/
用户名:admin,密码:admin
FreeSWITCH界面安装参考:https://blog.csdn.net/jia198810/article/details/137820796
1、mod_sms模块安装
mod_sms模块,在编译FreeSWITCH时,执行./bootstrap.sh
后,在modules.conf里是默认打开的。
如果没有打开,则在FreeSWITCH源码根目录下,执行以下命令,单独安装mod_sms模块:
make mod_sms-install
编译完成后,加载mod_sms模块。
- 临时加载:
# 进入到fs_cli
fs_cli -ppassword
# 加载mod_sms
load mod_sms
如下图:
- 永久加载:
修改/usr/local/freeswitch/conf/modules.conf文件,把mod_sms模块前后注释去掉,重启FreeSWITCH,如下图:
2、编写聊天规则
mod_sms 绑定在全局消息事件系统上,所以它能捕获所有的 MESSAGE 事件,然后将这些事件路由到聊天计划(chatplan)中。如果没有与聊天计划条目相匹配的情况,它就会以默认方式工作,例如两个客户端以点对点的方式发送消息。(FreeSWITCH官方帮助文档,机翻)
2.1 使用xml文件
拨号规则有dialplan tools,聊天规则也有自己的chatplan tools。
Chatplan Tools有:reply、fire、send、set、stop
tool | 解释 |
---|---|
reply | 给发送方回复一个消息。<action application="reply" data="消息已发送"/> |
fire | 在event_socket事件里触发一个事件 |
send | 发送消息。<action application="send"/> |
set | 设置变量和dialplan的set一样。<action application="set" data="var=val"/> |
stop | 停止聊天计划。<action application="stop"/> |
测试一下
<!-- /usr/local/freeswitch/conf/chatplan/default.xml --><?xml version="1.0" encoding="utf-8"?><include><context name="默认权限"><extension name="默认权限"><condition field="to" expression="^(.*)$"><!-- 默认情况下什么都不用编写就可以发送 --></condition></extension></context></include>
什么action都不用编写,只要分机的directory里的context是默认权限,其他默认就可以,因为FreeSWITCH会自动发送。
使用microsip测试,如下图:
日志可看到:
如果不自动发送的消息,需要对消息内容进行修改后再发送,可设置
<action application="set" data="final_delivery=true"/>
如下:
<!-- /usr/local/freeswitch/conf/chatplan/default.xml --><?xml version="1.0" encoding="utf-8"?><include><context name="默认权限"><extension name="默认权限"><condition field="to" expression="^(.*)$"><!-- 关闭默认发送 --><action application="set" data="final_delivery=true"/><!-- 给发送方回复一个消息 --><action application="reply" data="你给${to}发送了消息,消息内容是:${_body}"/><!-- 修改body消息内容 --><action application="set" data="_body=${_body}---修改后的-----"/><!-- 再次给发送方回复一个消息 --><action application="reply" data="系统把你的消息修改了:${_body}"/><!-- 发送到接收方 --><action application="send"/></condition></extension></context></include>
使用microsip测试,如下图:
2.2 使用脚本文件
如果要更加方便控制消息内容,可使用lua或者python编写脚本。
使用python脚本,必须有一个chat方法,详细可参考https://blog.csdn.net/jia198810/article/details/143992059
使用lua脚本,可使用message:chat_execute执行chatplan tools。
测试一下
聊天规则xml入口:
<!-- /usr/local/freeswitch/conf/chatplan/default.xml --><?xml version="1.0" encoding="utf-8"?><include><context name="默认权限"><extension name="默认权限"><condition field="to" expression="^(.*)$"><action application="lua" data="handle-chat.lua"/></condition></extension></context></include>
脚本如下:
-- /usr/local/freeswitch/scripts/handle-chat.lua
local api = freeswitch.API();
local domain = api:executeString("global_getvar domain");
local proto = message:getHeader("proto");
local dest_proto= message:getHeader("dest_proto");
local subject = message:getHeader("subject");
local from = message:getHeader("from");
local from_full = message:getHeader("from_full");
local from_user = message:getHeader("from_user");
local to = message:getHeader("to");
local to_user = message:getHeader("to_user");
local type = message:getHeader("type");
local sip_profile = message:getHeader("sip_profile");
local body = message:getBody();
local count_reg = api:executeString(string.format("sofia_count_reg %s@%s",to_user,domain));
freeswitch.consoleLog("info", string.format("==========发送短信==========="));
freeswitch.consoleLog("info", string.format("Domain :%s",domain));
freeswitch.consoleLog("info", string.format("来源用户 :%s",from_user));
freeswitch.consoleLog("info", string.format("目的用户 :%s",to_user));
freeswitch.consoleLog("info", string.format("目的用户在线数:%s",count_reg));
freeswitch.consoleLog("info", string.format("消息内容 :%s",body));if (tonumber(count_reg) >= 1) then--freeswitch.consoleLog("info", "\n");message:chat_execute("set",string.format("from=%s@$${domain}",from_user));message:chat_execute("set",string.format("from_full=%s",from_full));message:chat_execute("set",string.format("from_user=%s",from_user));message:chat_execute("set",string.format("to=%s@$${domain}",to_user));message:chat_execute("set",string.format("to_user=%s",to_user));message:chat_execute("set",string.format("proto=sip"));message:chat_execute("set",string.format("to_proto=sip"));message:chat_execute("set",string.format("_body=%s",body));message:chat_execute("set",string.format("final_delivery=true"));--不设置final_delivery,则会自动发送--设置了final_delivery=true,则需要send命令message:chat_execute("send")
elsemessage:chat_execute("reply","对方不在线")freeswitch.consoleLog("info", string.format("发送结果 :目的用户%s不在线",to_user));
end
freeswitch.consoleLog("info", string.format("==========结束发送==========="));
日志可看到:
使用microsip,测试如下:
如果在发送消息的时候,提示:
sofia_reg.c:2616 Cannot locate any authentication credentials to complete an authentication request for realm xxxxxx
可在sip_profiles中添加auth-messages=false(将弃用)或者disable-auth-messages=true,关闭MESSAGE消息认证。如下图: