介绍kamailio的dialog模块
# 介绍kamailio的dialog模块
`kamailio`的`dialog`模块一般有四个作用:
- 读写对话变量
- 跟`uac`模块配合,完成`uac trunk auth`功能
- 统计`early_dialogs`和`active_dialogs`等
- 利用`dialog profile`实现分类统计功能或者实现呼叫限制功能
`dialog`模块的参数可以配置如下:
```
modparam("dialog", "db_url", DBURL)
modparam("dialog", "enable_stats", 1) # 使能统计功能
modparam("dialog", "db_mode", 1)
modparam("dialog", "dlg_flag", DLG_FLAG) # 范围是0:31
modparam("dialog", "dlg_match_mode", 1)
modparam("dialog", "default_timeout", 43200 ) # 12小时,设置dialog超时时间
modparam("dialog", "track_cseq_updates", 1)
modparam("dialog", "profiles_no_value", "total; emergency")
modparam("dialog", "profiles_with_value", "user; type; account")
```
下面这段路由脚本创建对话:
```
route[INVITE] {
if (is_method("INVITE") && !has_totag()) {
setflag(DLG_FLAG); # 创建对话,跟dlg_flag参数的值对应起来
# dlg_manage(); # 调用这个函数也可以创建对话
}
return;
}
```
目前对话变量仅支持字符串类型,下面这段代码可以证明这点:
```
$dlg_var(test_i) = 1;
if (!pv_isset("$dlg_var(test_i)")) {
xerr("route run here, file=$cfg(file) line=$cfg(line)\n");
}
$dlg_var(test_s) = '1';
if (pv_isset("$dlg_var(test_s)")) {
xinfo("route run here, file=$cfg(file) line=$cfg(line)\n");
}
```
我们知道`avp`变量仅在事务期间有效,如果想在整个对话期间都有效那就需要用到对话变量了
对话变量常见的使用场景可能是写自己的话单,这里给出路由脚本:
```
route[INVITE] {
if (is_method("INVITE") && !has_totag()) {
dlg_manage();
$dlg_var(SetupTime) = $TS;
}
return;
}
event_route[dialog:start] {
$dlg_var(AnswerTime) = $TS;
}
event_route[dialog:end] {
$dlg_var(EndTime) = $TS;
$dlg_var(BillSec) = (str)($dlg_var(EndTime) - $dlg_var(AnswerTime)); # 转成字符串类型
xinfo("+++$dlg_var(BillSec)\n");
$var(x) = $_s({"Event":"Call_End", "CallID":"$dlg(callid)", "From":"$dlg(from_uri)", "To":"$dlg(to_uri), ");
$var(x) = $var(x) + $_s("SetupTime":$dlg_var(SetupTime), "AnswerTime":$dlg_var(AnswerTime), "EndTime":$dlg_var(EndTime), "BillSec":$dlg_var(BillSec)});
xinfo("$var(x)\n");
# http post
}
```
接下来讨论`uac trunk auth`,流程如下:
```
1. A -> INVITE -> kamailio B
2. A kamailio -> INVITE -> B CSeq
3. A kamailio <- 401(7) <- B
4. A kamailio -> INVITE (auth) -> B CSeq+1
5. A kamailio <- 200 <- B
6. A <- 200 <- kamailio
```
把`dialog`模块的`track_cseq_updates`参数配置为1,第四步`CSeq`就会自动加一
模块配置和路由脚本示意如下:
```
#!define UAC_CONTACT_ADDRESS "192.168.1.100:5060"
modparam("uac", "reg_db_url", DBURL)
modparam("uac", "reg_timer_interval", 3)
modparam("uac", "reg_retry_interval", 28)
modparam("uac", "reg_gc_interval", 30)
modparam("uac", "reg_contact_addr", UAC_CONTACT_ADDRESS)
modparam("uac", "auth_realm_avp", "$avp(arealm)")
modparam("uac", "auth_username_avp", "$avp(auser)")
modparam("uac", "auth_password_avp", "$avp(apasswd)")
modparam("uac", "reg_keep_callid", 1)
route[GW] {
$du = "sip:192.168.1.101:5060";
t_on_failure("TRUNKAUTH");
t_relay();
exit;
}
failure_route[TRUNKAUTH] {
if (t_is_canceled()) {
exit;
}
if(t_check_status("401|407")) {
$avp(auser) = "test"; # 实际使用时需从数据库取出用户名和密码
$avp(apasswd) = "test"; # 同上
if (uac_auth()) {
t_relay();
}
exit;
}
}
```
接下来我们讨论`dialog`自带的统计功能
`enable_stats`参数配置为1就可以使能了
这里有二个`shell`命令,都可以查到`dialog`模块的统计:
```shell
kamcmd stats.get_statistics all | grep dialog
```
```shell
kamcmd dlg.stats_active
```
最后我们讨论`dialog profile`方面的问题
比如,`dialog`这样配置模块参数:
```
modparam("dialog", "profiles_no_value", "total; emergency")
modparam("dialog", "profiles_with_value", "user; type; account")
```
那么我们这样写路由:
```
route[INVITE] {
if (is_method("INVITE") && !has_totag()) {
dlg_manage();
set_dlg_profile("total");
}
route(LOCATION);
return;
}
```
现在做一个呼叫测试,6001呼叫6002
```shell
$kamcmd dlg.profile_get_size total
1
```
结果是1
下面这个命令得到的输出更加详细:
```shell
$kamcmd dlg.profile_list total
{
h_entry: 3702
h_id: 5131
ref: 2
call-id: ef6fcea66f0f40938cc3060226340f39
from_uri: sip:6002@192.168.100.200
to_uri: sip:6001@192.168.100.200
state: 4
start_ts: 1691650230
init_ts: 1691650229
end_ts: 0
duration: 35
timeout: 1691693429
lifetime: 43200
dflags: 1536
sflags: 0
iflags: 0
caller: {
tag: fa86e515d20348c6b217ae3bd4efcefc
contact: sip:6002@192.168.100.172:61224;ob
cseq: 32127
route_set:
socket: udp:192.168.100.200:5060
}
callee: {
tag: 8CC433477696B38087EC8FFAB0858E00
contact: sip:6001@192.168.100.121:5060;transport=udp
cseq: 0
route_set:
socket: udp:192.168.100.200:5060
}
profiles: {
total
}
variables: {
}
}
```
请注意,`variables`无值
下面是进一步的说明:
- set_dlg_profile("total"); # 没问题,因为profiles_no_value里面已定义total
- set_dlg_profile("emergency"); # 没问题,因为profiles_no_value里面已定义emergency
- set_dlg_profile("total", "$fu"); # 不行,因为profiles_with_value没有定义total
- set_dlg_profile("user", "$fu"); # 没问题,因为profiles_with_value已定义user
分类统计方面我们可以给一个例子:
```
modparam("dialog", "profiles_no_value", "total; local; domestic; international")
route[INVITE] {
if (is_method("INVITE") && !has_totag()) {
dlg_manage();
set_dlg_profile("total"); # 总的呼叫数加一
if ($tU =~ "^00") {
set_dlg_profile("international"); # 国际长途呼叫数加一
} else if ($tU =~ "^0") {
set_dlg_profile("domestic"); # 国内长途呼叫数加一
} else {
set_dlg_profile("local"); # 本地呼叫数加一
}
}
route(LOCATION);
return;
}
```
至于如何实现呼叫限制功能,网上能查到的资料非常丰富,这里就不再赘述了。
相关文章:
介绍kamailio的dialog模块
# 介绍kamailio的dialog模块 kamailio的dialog模块一般有四个作用: - 读写对话变量 - 跟uac模块配合,完成uac trunk auth功能 - 统计early_dialogs和active_dialogs等 - 利用dialog profile实现分类统计功能或者实现呼叫限制功能 dialog模块的参数可以…...

性能优于BERT的FLAIR:一篇文章入门Flair模型
文章目录 What is FLAIR?FLAIR ModelContextual String Embedding for Sequence Labelingexample FLAIR Application AreaSentiment AnalysisNamed Entity RecognitionText Classification FLAIR一、什么是FLAIR?二、FLAIR Library的优势是什么ÿ…...

Weblogic ssrf漏洞复现
文章目录 一、漏洞描述二、漏洞特征1.查看uddiexplorer应用2.漏洞点 三、漏洞复现1.获取容器内网ip2.VULHUB Weblogic SSRF漏洞 docker中 centos6 无法启动的解决办法3.准备payload4.反弹shell 一、漏洞描述 SSRF 服务端请求伪造(Server-Side Request Forgery),是一种由攻击者…...

Memcached构建缓存服务器
Memcache介绍 1、特点 内置存储方式----------为了提高性能,memcached中保存的数据都存储在memcache内置的内存存储空间中。由于数据仅存在于内存中,重启操作系统会导致全部数据消失 简单key/value存储--------------服务器不关心数据本身的意义及结构&…...

vue3+element Plus实现弹框的拖拽、可点击底层页面功能
1、template部分 <el-dialog:modal"false"v-model"dialogVisible"title""width"30%"draggable:close-on-click-modal"false"class"message-dialog"> </el-dialog> 必须加的属性 modal:是否去掉遮罩层…...
Vue+elementui 纯前端实现Excel导入导出功能(区分表头标题)
引入插件 import * as XLSX from "xlsx/xlsx.mjs"; import { read, utils } from xlsx/xlsx.mjs; 上传文件方法 // 上传文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用async handle(ev) {//改变表格key值this.$refs.cpkTable.loading…...

使用Scrapy的调试工具和日志系统定位并解决爬虫问题
目录 摘要 一、Scrapy简介 二、Scrapy的调试工具 1、Shell调试工具 2、断点调试 三、Scrapy的日志系统 四、实例解析 1、启用详细日志 2、断点调试 3、分析日志 4、解决问题 五、代码示例 总结 摘要 本文详细介绍了如何使用Scrapy的调试工具和日志系统来定位并解…...

Pycharm安装配置Pyqt5教程(保姆级)
目录 一、前言 1、依赖包 2、工具 二、安装依赖包 三、配置环境 四、配置设计工具 1、Qt Designer 2、PyRcc 3、PyUIC 五、使用 1、界面设计 2、ui文件转化为py文件 一、前言 很多情况下需要为程序设计一个GUI界面,在Python中使用较多的用户界面设计工具…...

基于单片机的养殖场温度控制系统设计
博主主页:单片机辅导设计 博主简介:专注单片机技术领域和毕业设计项目。 主要内容:毕业设计、简历模板、学习资料、技术咨询。 文章目录 主要介绍一、控制系统设计二、系统方案设计2.1 系统运行方案设计2.1.1 羊舍环境温度的确定 三、 系统仿…...

时序分解 | Matlab实现EMD经验模态分解时间序列信号分解
时序分解 | Matlab实现EMD经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现EMD经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现EMD经验模态分解时间序列信号分解 Matlab语言 算法新颖小众,用的人很少…...
解决无法进入MERCURY路由器管理界面的问题 水星网络路由器
问题:今天家里停电了,来电过后,路由器有信号,但是手机连上WiFi后无法正常上网。尝试过给路由器断电开电,拔插网线。试了这两种方法后手机依然无法正常上网。最后想到了重启路由器,也就是将路由器恢复出厂设…...

Ansible自动化安装部署及使用
目录 前言 一、环境概况 修改主机名(可选项) 二、安装部署 1.安装epel扩展源 2.安装Ansible 3.修改Ansible的hosts文件 4.生成密钥 三、Ansible模块使用介绍 Command模块 Shell模块 User模块 Copy模块 File模块 Hostname模块 Yum模块 Ser…...

idea中配置spring boot单项目多端口启动
参照文章 https://zhuanlan.zhihu.com/p/610767685 项目配置如下 下面为 idea 2023,不同版本的设置有区别,但是没那么大,idea 2023默认使用新布局,切换为经典布局即可。 在项目根目录的.idea/workspace.xml文件里添加如下配置 &l…...

MP4视频文件损坏怎么修复?
3-2 作为摄影师,或者在平时有拍摄工作的事情的,比如搞婚庆、搞航拍什么的,有一定的概率会遇到损坏的视频文件,比如相机突然断电、无人机炸机等,有可能会导致保存的MP4文件损坏。 这种文件使用播放器播放的话…...
使用electron ipcRenderer接收通信消息多次触发
使用electron ipcRenderer接收通信消息多次触发 在使用electron ipcRenderer.on接收ipcRenderer.send的返回值时,ipcRenderer.send发送一次信息, ipcRenderer.on会打印多个日志, renderer.once(get-file-path, (event: any, paths: any) &g…...

Spring事务最佳应用指南(包含:事务传播类型、事务失效场景、使用建议、事务源码分析)
前言 本文主要介绍的是在Spring框架中有关事务的应用方式,以及一些生产中常见的与事务相关的问题、使用建议等。同时,为了让读者能够更容易理解,本文在讲解过程中也会通过源码以及案例等方式进行辅助说明,通过阅读本文不但能够解…...
Go语言的Http包及冒泡排序解读
目录标题 Http一.Get二、Post三、Http服务器 BubbleSort冒泡排序 Http 一.Get package mainimport ("fmt""io/ioutil""net/http")func main() {response, err : http.Get("http://www.baidu.com")if err ! nil {fmt.Println("Ht…...

vue二维码生成插件qrcodejs2-fix、html生成图片插件html2canvas、自定义打印内容插件print-js的使用及问题总结
一、二维码生成插件qrcodejs2-fix 1.安装命令 npm i qrcodejs2-fix --save2.页面使用 import { nextTick } from vue; import QRCode from qrcodejs2-fix; nextTick(() > {let codeView document.querySelector("#codeView");codeView.innerHTML ""…...
[SSD综述1.8] 固态存储市场发展分析与预测_固态存储技术发展方向(2022to2023)
依公知及经验整理,原创保护,禁止转载。 专栏 《SSD入门到精通系列》 <<<< 返回总目录 <<<< 前言 自2020年疫情爆发以来,远程办公、网上教育、流媒体等等应用引爆对消费电子及云服务的需求增长,全球数字化转型加速,带来了两年的闪存风光时…...

【Linux】多路IO复用技术③——epoll详解如何使用epoll模型实现简易的一对多服务器(附图解与代码实现)
在正式阅读本篇博客之前,建议大家先按顺序把下面这两篇博客看一下,否则直接来看这篇博客的话估计很难搞懂 多路IO复用技术①——select详解&如何使用select模型在本地主机实现简易的一对多服务器http://t.csdnimg.cn/BiBib多路IO复用技术②——poll…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...