freeswitch使用mod_sms模块进行短信收发

Song • 323次浏览 • 0个评论 • 2019-03-02 06:58:30

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()))

该接口定义了两个对象:MessageArgs

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、从脚本发送消息

虽然存在sendreply函数,但您可能希望更直接地控制消息的输出。相反,您可以直接创建和触发消息事件。以下是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)
提交评论
要回复文章请先登录注册
用户评论
  • 没有评论
    公告
    中国晚上好,随时随地分享前沿科技,好吃好玩,有趣有料的新鲜事;本站可以分享资源,技术,观点,态度;同时希望大家做一个文明的分享者!
    广告
    pytorch中文网