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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/481407.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广域网技术

企业需要通过广域网将这些分散在不同地理位置的分支机构连接起来 早期广域网技术概述 广域网&#xff1a;连接不同地区局域网的网络&#xff0c;能够横跨几个洲提供远距离通信&#xff0c;形成国际性的远程网络 广域网设备角色介绍&#xff1a; CE&#xff1a;用户端连接服务…

[GKCTF 2021]签到

[GKCTF 2021]签到 wireshark跟踪http流&#xff0c;基本编解码&#xff0c;倒叙&#xff0c;栅栏密码 找到cat /f14g 把包里返回的字符串先hex解码&#xff0c;再base64解码&#xff0c;看到一个时间是倒叙&#xff0c;不含flag 继续往下面翻&#xff0c;可以看到cat%2Ff14g%7…

ROS VSCode调试方法

VSCode 调试 Ros文档 1.编译参数设置 cd catkin_ws catkin_make -DCMAKE_BUILD_TYPEDebug2.vscode 调试插件安装 可在扩展中安装(Ctrl Shift X): 1.ROS 2.C/C 3.C Intelliense 4.Msg Language Support 5.Txt Syntax 3.导入已有或者新建ROS工作空间 3.1 导入工作…

Socket编程(TCP/UDP详解)

前言&#xff1a;之前因为做项目和找实习没得空&#xff0c;计算机网络模块并没有写成博客&#xff0c;最近得闲了&#xff0c;把计算机网络模块博客补上。 目录 一&#xff0c;UDP编程 1&#xff09;创建套接字 2&#xff09;绑定端口号 3&#xff09;发送与接收数据 4&…

虚拟机VMware安装OpenWrt镜像

前提已经安装VMware Workstation Pro,我使用的是VM16 一.下载OpenWrt系统固件 固件有很多种&#xff0c;我选择下面这个链接的固件: Index of /releases/23.05.3/targets/x86/64/ 二.把固件转换成虚拟机能识别的格式 转换工具下载地址&#xff1a;https://www.starwindsoft…

【Canvas与雷达】点鼠标可暂停金边蓝屏雷达显示屏

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>点鼠标可暂停金边蓝屏雷达显示屏 Draft1</title><style typ…

计算机编码存储+char占用空间+final作用

内存中存储的是对应的编码&#xff0c;与对应的形状库一起能够在显示器显示出来对应的字符。 磁盘中存储的是文件信息。 内存中存储的是变量&#xff08;虽然也是在磁盘里&#xff0c;等到使用的时候再调入进来&#xff09;。 因为编码实质就是二进制串&#xff0c;所以也可以比…

vue3项目搭建-6-axios 基础配置

axios 基础配置 安装 axios npm install axios 创建 axios 实例&#xff0c;配置基地址&#xff0c;配置拦截器,目录&#xff1a;utils/http.js 基地址&#xff1a;在每次访问时&#xff0c;自动作为相对路径的根 // axios 基础封装 import axios from "axios";…

2-2-18-9 QNX系统架构之文件系统(一)

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…

Python基于滑动窗口CNN损伤梁桥数据、故宫城墙图像数据分类可视化|数据分享

全文链接&#xff1a;https://tecdat.cn/?p38442 分析师&#xff1a;Yufei Guo 在现代土木结构工程领域&#xff0c;结构损伤的准确识别与定位对于保障基础设施的安全性和耐久性具有极为关键的意义。传统的人工检查方法&#xff0c;如目视检查以及借助专业设备进行检测&#x…

MyBatis的if标签的基本使用

在MyBatis框架中&#xff0c;if标签用于在构建SQL语句时&#xff0c;根据参数条件判断的结果&#xff0c;动态地选择加入或不加where条件中。 一 常见使用 在使用MyBatis处理查询逻辑的时候&#xff0c;常用的是判断一些参数是否为空&#xff0c;列举常用的几种情况展示 1.1…

RabbitMQ原理架构解析:消息传递的核心机制

文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1、简单模式3.2、工作模式3.3、发布订阅3.4、路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1、单机部署5.2、集群部署&#xff08;镜像模式&#xff09;5.3、K8s部署…

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…

【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)

1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…

说说Elasticsearch拼写纠错是如何实现的?

大家好&#xff0c;我是锋哥。今天分享关于【说说Elasticsearch拼写纠错是如何实现的&#xff1f;】面试题。希望对大家有帮助&#xff1b; 说说Elasticsearch拼写纠错是如何实现的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…

NAT拓展

NAT ALG&#xff08;NAT应用级网&#xff09; 为某些应用层协议&#xff0c;因为其报文内容可能携带IP相关信息&#xff0c;而普通NAT转化无法将这些IP转化&#xff0c;从而导致协议无法正常运行 例如FTP&#xff0c;DHCP&#xff0c;RSTP&#xff0c;ICMP&#xff0c;IPSEC…

Flutter:封装发送验证码组件,注册页使用获取验证码并传递控制器和验证码类型

验证码&#xff1a;view import package:flutter/material.dart; import package:get/get.dart; import index.dart;class SendcodePage extends GetView<SendcodeController> {// 接收注册页面&#xff0c;传进来的手机号控制器&#xff0c;和发送验证码的类型final Tex…

【目标跟踪】Anti-UAV数据集详细介绍

Anti-UAV数据集是在2021年公开的专用于无人机跟踪的数据集&#xff0c;该数据集采用RGB-T图像对的形式来克服单个类型视频的缺点&#xff0c;包含了318个视频对&#xff0c;并提出了相应的评估标准&#xff08;the state accurancy, SA)。 文章链接&#xff1a;https://arxiv.…

Linux的文件系统

这里写目录标题 一.文件系统的基本组成索引节点目录项文件数据的存储扇区三个存储区域 二.虚拟文件系统文件系统分类进程文件表读写过程 三.文件的存储连续空间存放方式缺点 非连续空间存放方式链表方式隐式链表缺点显示链接 索引数据库缺陷索引的方式优点&#xff1a;多级索引…

C++优选算法十七 多源BFS

1.单源最短路问题 一个起点一个终点。 定义&#xff1a;在给定加权图中&#xff0c;选择一个顶点作为源点&#xff0c;计算该源点到图中所有其他顶点的最短路径长度。 2.多源最短路问题 定义&#xff1a;多源最短路问题指的是在图中存在多个起点&#xff0c;需要求出从这些…