当前位置: 首页 > article >正文

FreeSWITCH 简单图形化界面36 -使用mod_sms发送短消息

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")
else
        message: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消息认证。如下图:
在这里插入图片描述


http://www.kler.cn/a/417093.html

相关文章:

  • MongoDB 有哪些特性
  • 微信小程序案例2——天气微信小程序(学会绑定数据)
  • 计算机毕业设计Spark+大模型知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习
  • ASP.NET Core JWT
  • 【Java基础】为什么不支持多重继承?方法重载和方法重写之间区别、Exception 和 Error 区别?
  • java项目之金华学校社团管理系统源码(ssm+mysql)
  • 洞察2024:Data+AI驱动的NoETL技术,引爆数据分析新革命
  • 『 Linux 』数据链路层 - ARP协议及数据链路层周边问题
  • ChemBench—— 探索大语言模型在化学领域的新基准框架是否胜过化学专家
  • 基于Java Springboot美食分享系统
  • 不同系统的MySQL的大小写敏感性
  • 新质驱动·科东软件受邀出席2024智能网联+低空经济暨第二届湾区汽车T9+N闭门会议
  • leaflet 的基础使用
  • 蓝桥杯嵌入式入门指南-UART【7】
  • Python基础学习-13模块的介绍
  • 浅谈人工智能之基于容器云进行图生视频大模型搭建
  • labelimg每次标注的时候自动导入预设标签
  • scrapy爬虫框架小案例
  • 音视频-什么是帧,视频为什么要编码
  • 从 HTML 到 CSS:开启网页样式之旅(四)—— 长度单位与显示模式全解析
  • MFC 分段记录时间log类
  • 论文阅读:Dual-disentangled Deep Multiple Clustering
  • HCIE:详解OSPF,从基础到高级特性再到深入研究
  • 剧本字幕自己看
  • 鸿蒙系统(harmony)支持Android应用的双框架技术架构分析
  • 数据湖的概念(包含数据中台、数据湖、数据仓库、数据集市的区别)--了解数据湖,这一篇就够了