介绍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…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
