介绍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…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
