freeswitch使用mod_sms模块进行短信收发
mod_sms
提供了一种在freeswitch
中路由消息的方法,可能允许用户在SIP
客户端上使用SIP SIMPLE
构建一个强大的聊天系统,就像在XMPP
中一样。
就像XML Dialplan
有拨号方案一样,mod_sms
也有chatplan
。
mod_sms
绑定在GLOBAL
消息事件系统上,因此它捕获所有MESSAGE
事件,然后将它们路由到chatplan
。如果没有chatplan
条目匹配,则它默认工作 - 例如,两个客户端以点对点的方式发送消息。
一、编译和加载
在代码目录下modules.conf
中取消掉mod_sms
的注示:
make mod_sms-install
在fs_cli
中
load mod_sms
二、配置
mod_sms
是一个新模块(2011年9月下旬),因此从较旧的FreeSWITCH
安装升级的用户需要从源复制freeswitch.xml
或将以下部分添加到现有的conf/freeswitch.xml
中。
<section name="chatplan" description="Regex/XML Chatplan">
<X-PRE-PROCESS cmd="include" data="chatplan/*.xml"/>
</section>
在conf/autoload_configs/modules.conf.xml
中添加如下代码默认加载mod_sms
。
<load module="mod_sms"/>
然后创建conf/chatplan
目录。像这样创建一个default.xml
:
<?xml version="1.0" encoding="utf-8"?>
<include>
<context name="default">
<extension name="demo">
<condition field="to" expression="^(.*)$">
<action application="reply" data="Hello, you said: ${_body}"/>
</condition>
</extension>
</context>
</include>
四、默认配置的基本用法
我使用Eyebeam
进行测试,我相信Xlite
应该可以工作。以下演示显示从1004
发送到1019
的消息。
在Eyebeam
中创建新联系人,然后右键单击联系人并单击即时消息,然后将出现即时消息窗口。
输入你好,你应该立即得到答复“你好,你说你好”
日志会是这样的:
2011-09-29 11:44:10.343077 [INFO] mod_sms.c:299 Processing text message 1004->1019 in context default
2011-09-29 11:44:10.343077 [DEBUG] mod_erlang_event.c:380 looking for bindings
2011-09-29 11:44:10.343077 [DEBUG] mod_erlang_event.c:427 no binding for chatplan
Chatplan: 1019 parsing [default->demo] continue=false
Chatplan: 1019@192.168.0.81 Regex (PASS) [demo] to(1019@192.168.0.81) =~ /^(.*)$/ break=on-false
Chatplan: 1019@192.168.0.81 Action reply(Hello, you said: ${_body})
从日志中你可以发现消息是由mod_sms
捕获的,然后点击chatplan。默认的chatplan
只是简单地发回了回复。
五、Chatplan工具
就像拨号方案工具一样,有一套chatplan
工具
1、reply
回复消息
<action application="reply" data="unsolicited reply"/>
2、fire
向FS
事件系统发出事件,这是一个示例事件:
<action application="fire" data=""/>
Event-Name: MESSAGE
Core-UUID: c0305628-761e-4a01-be5e-c39959f55b47
FreeSWITCH-Hostname: seven-macpro.local
FreeSWITCH-Switchname: seven-macpro.local
FreeSWITCH-IPv4: 192.168.0.81
FreeSWITCH-IPv6: ::1
Event-Date-Local: 2011-09-29 11:55:21
Event-Date-GMT: Thu, 29 Sep 2011 03:55:21 GMT
Event-Date-Timestamp: 1317268521199214
Event-Calling-File: sofia_presence.c
Event-Calling-Function: sofia_presence_handle_sip_i_message
Event-Calling-Line-Number: 2995
login: sip:mod_sofia@192.168.0.81:5060
proto: sip
from: 1004@192.168.0.81
from_user: 1004
from_host: 192.168.0.81
to_user: 1019
to_host: 192.168.0.81
from_sip_ip: 192.168.0.81
from_sip_port: 13206
to: 1019@192.168.0.81
subject: SIMPLE MESSAGE
type: text/html
from_full: "Seven3" <sip:1004@192.168.0.81>;tag=1c977f4c
sip_profile: internal
dest_proto: sip
DP_MATCH: 1019@192.168.0.81
Content-Length: 49
Content-Length: 49
3、send
发送消息
<action application="send"/>
4、set
设置参数。
<action application="set" data="var=val"/>
5、stop
停止执行。
<action application="stop" data=""/>
六、内置脚本
您还可以直接从chatplan
调用各种语言模块:
<action application="lua" data="handle_chat.lua"/>
<action application="python" data="handle_chat.py"/>
1、接口
这些脚本直接在chatplan
中运行。他们必须定义一个名为chat
的函数,然后运行该函数。这是python
的一个例子:
def chat(message, args):
sys.stderr.write(str(message.serialize()))
该接口定义了两个对象:Message
和Args
。
a、Message
与事件系统中的会话对象一样,chatplan
中有一个消息对象。主要功能是:
- getHeader - 返回其中一个消息头
- serialize - 将整个消息转换为字符串
这是handle_chat.lua
的示例
freeswitch.consoleLog("info", message:getHeader("from"));
freeswitch.consoleLog("info", message:getHeader("to"));
freeswitch.consoleLog("info", message:serialize());
message
是一个标准事件,因此它与使用chat_execute
等方法运行应用程序的API
始终相同。
message:chat_execute("reply", "you said: " .. message:getBody());
b、ARGS
Args
是传递给方法的字符串,包含从chatplan
传递的任何参数。
2、全局变量
这些脚本还可以直接访问chatplan
中存在的变量。这与其他地方一样:GetGlobalVariable。
3、从脚本发送消息
虽然存在send
和reply
函数,但您可能希望更直接地控制消息的输出。相反,您可以直接创建和触发消息事件。以下是Lua
的一个例子:
freeswitch.consoleLog("info", "chat console\n")
local event = freeswitch.Event("CUSTOM", "SMS::SEND_MESSAGE");
event:addHeader("proto", "sip");
event:addHeader("dest_proto", "sip");
event:addHeader("from", "1004@192.168.0.81");
event:addHeader("from_full", "sip:1004@192.168.0.81");
event:addHeader("to", "sip:1019@192.168.0.81");
event:addHeader("subject", "sip:1019@192.168.0.81");
event:addHeader("type", "text/html");
event:addHeader("hint", "the hint");
event:addHeader("replying", "true");
event:addHeader("sip_profile", "external");
event:addBody("Hello from Seven Du! Have fun!");
-- freeswitch.consoleLog("info", event:serialize());
event:fire();
七、通过ESL发送消息
您也可以通过ESL
发送消息。必须加载mod_sms
否则不起作用。
这是一个使用ESL
发送消息的perl
脚本示例。
require ESL;
my $con = new ESL::ESLconnection("localhost", "8021", "ClueCon");
my $e = new ESL::ESLevent("custom", "SMS::SEND_MESSAGE");
$e->addHeader("to", "1019\@www.freeswitch.org");
$e->addHeader("from", "testing\@foobar.com");
$e->addHeader("sip_profile", "internal");
$e->addHeader("dest_proto", "sip");
$e->addBody(shift);
$con->sendEvent($e);
和Python
中的相同脚本。
from ESL import *
con = ESLconnection("127.0.0.1", "8021", "ClueCon")
event = ESLevent("CUSTOM", "SMS::SEND_MESSAGE")
event.addHeader("to", "1019@www.freeswitch.org")
event.addHeader("from", "testing@foobar.com")
event.addHeader("dest_proto", "sip")
event.addBody("message contents")
con.sendEvent(event)
用户评论
更多相关好文
-
微信公众号文章/菜单添加小程序时路径如何获取? 2021-12-22
-
如何轻松获取微信小程序路径path? 2021-12-22
-
cannot import name 'CUDA_HOME' from 'mmcv.utils' 2021-12-05
-
vgg的loss一轮达到ln(1/n)阈值,如何解决 2021-11-21
-
如何下载使用utils库 2021-10-27
热门文章
-
微信公众号文章/菜单添加小程序时路径如何获取? 2021-12-22
-
如何轻松获取微信小程序路径path? 2021-12-22
-
python/MySQL分页查询方法与性能优化 2021-06-23
-
mitmproxy & python 忽略所有的https/ssl请求 2021-04-19
-
如何使用邮件/邮箱推广微信公众号/小程序? 2021-01-28
栏目最新文章
公告提示
- pytorch中文文档
- pytorch官方文档
提交评论