概述

freeswitch 是一款好用的开源软交换平台。

实际应用中,我们经常需要对fs中的通道变量操作,包括设置和获取,set & get。

但是,fs中有众多的内部定义通道变量,也有外部传入的自定义通道变量,如何最快找到我们需要的通道变量,就需要一点小的技巧。

环境

centos:CentOS  release 7.0 (Final)或以上版本

freeswitch:v1.8.7

GCC:4.8.5

info接口

freeswitch的mod_dptools模块提供了一个app接口“info”。

<action application="info"/>

该接口需要在"call_debug=true"的情况下使用。

测试

设置拨号计划:

<condition field="destination_number" expression="^(\d+)$">

<action application="set" data="call_debug=true"/>

<action application="info"/>

</condition>

发起呼叫,呼叫进入fs后,日志打印如下:

2022-09-19 16:49:27.649708 [DEBUG] switch_core_state_machine.c:328 sofia/external/1001@10.55.55.138 Standard EXECUTE

EXECUTE sofia/external/1001@10.55.55.138 set(call_debug=true)

2022-09-19 16:49:27.649708 [DEBUG] mod_dptools.c:1548 SET sofia/external/1001@10.55.55.138 [call_debug]=[true]

EXECUTE sofia/external/1001@10.55.55.138 info()

2022-09-19 16:49:27.649708 [INFO] mod_dptools.c:1761 CHANNEL_DATA:

Channel-State: [CS_EXECUTE]

Channel-Call-State: [RINGING]

Channel-State-Number: [4]

Channel-Name: [sofia/external/1001@10.55.55.138]

Unique-ID: [f80fc7b2-37f7-11ed-9d90-cd61d01aad6a]

Call-Direction: [inbound]

Presence-Call-Direction: [inbound]

Channel-HIT-Dialplan: [true]

Channel-Call-UUID: [f80fc7b2-37f7-11ed-9d90-cd61d01aad6a]

Answer-State: [ringing]

Caller-Direction: [inbound]

Caller-Logical-Direction: [inbound]

Caller-Username: [1001]

Caller-Dialplan: [XML]

Caller-Caller-ID-Name: [Extension 1001]

Caller-Caller-ID-Number: [1001]

Caller-Orig-Caller-ID-Name: [Extension 1001]

Caller-Orig-Caller-ID-Number: [1001]

Caller-Network-Addr: [10.55.55.138]

Caller-ANI: [1001]

Caller-Destination-Number: [1002]

Caller-Unique-ID: [f80fc7b2-37f7-11ed-9d90-cd61d01aad6a]

Caller-Source: [mod_sofia]

Caller-Context: [public]

Caller-Channel-Name: [sofia/external/1001@10.55.55.138]

Caller-Profile-Index: [1]

Caller-Profile-Created-Time: [1663577367649708]

Caller-Channel-Created-Time: [1663577367649708]

Caller-Channel-Answered-Time: [0]

Caller-Channel-Progress-Time: [0]

Caller-Channel-Progress-Media-Time: [0]

Caller-Channel-Hangup-Time: [0]

Caller-Channel-Transfer-Time: [0]

Caller-Channel-Resurrect-Time: [0]

Caller-Channel-Bridged-Time: [0]

Caller-Channel-Last-Hold: [0]

Caller-Channel-Hold-Accum: [0]

Caller-Screen-Bit: [true]

Caller-Privacy-Hide-Name: [false]

Caller-Privacy-Hide-Number: [false]

variable_direction: [inbound]

variable_uuid: [f80fc7b2-37f7-11ed-9d90-cd61d01aad6a]

variable_session_id: [1]

variable_sip_from_user: [1001]

variable_sip_from_uri: [1001@10.55.55.138]

variable_sip_from_host: [10.55.55.138]

variable_video_media_flow: [sendrecv]

variable_audio_media_flow: [sendrecv]

variable_channel_name: [sofia/external/1001@10.55.55.138]

variable_sip_call_id: [cf6b81f0-b29a-123b-3d84-000c29a63969]

variable_ep_codec_string: [CORE_PCM_MODULE.PCMA@8000h@20i@64000b]

variable_sip_local_network_addr: [10.55.55.137]

variable_sip_network_ip: [10.55.55.138]

variable_sip_network_port: [5080]

variable_sip_invite_stamp: [1663577367649708]

variable_sip_received_ip: [10.55.55.138]

variable_sip_received_port: [5080]

variable_sip_via_protocol: [udp]

variable_sip_from_user_stripped: [1001]

variable_sip_from_tag: [1gjS3t5F2D0gS]

variable_sofia_profile_name: [external]

variable_recovery_profile_name: [external]

variable_sip_Remote-Party-ID: ["Extension 1001" <sip:1001@10.55.55.138>;party=calling;screen=yes;privacy=off]

variable_sip_cid_type: [rpid]

variable_sip_full_via: [SIP/2.0/UDP 10.55.55.138:5080;rport=5080;branch=z9hG4bKF6gF1SKQK6rtF]

variable_sip_from_display: [Extension 1001]

variable_sip_full_from: ["Extension 1001" <sip:1001@10.55.55.138>;tag=1gjS3t5F2D0gS]

variable_sip_full_to: [<sip:1002@10.55.55.137:5080>]

variable_sip_allow: [INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY]

variable_sip_req_user: [1002]

variable_sip_req_port: [5080]

variable_sip_req_uri: [1002@10.55.55.137:5080]

variable_sip_req_host: [10.55.55.137]

variable_sip_to_user: [1002]

variable_sip_to_port: [5080]

variable_sip_to_uri: [1002@10.55.55.137:5080]

variable_sip_to_host: [10.55.55.137]

variable_sip_contact_user: [mod_sofia]

variable_sip_contact_port: [5080]

variable_sip_contact_uri: [mod_sofia@10.55.55.138:5080]

variable_sip_contact_host: [10.55.55.138]

variable_rtp_use_codec_string: [OPUS,G722,PCMU,PCMA,VP8]

variable_sip_user_agent: [FreeSWITCH-mod_sofia/1.6.19+git~20220408T073647Z~f81cb238da~64bit]

variable_sip_via_host: [10.55.55.138]

variable_sip_via_port: [5080]

variable_sip_via_rport: [5080]

variable_max_forwards: [69]

variable_sip_h_X-userName: [userName]

variable_sip_h_X-userNumber: [07551001]

variable_switch_r_sdp: [v=0

o=FreeSWITCH 1663546705 1663546706 IN IP4 10.55.55.138

s=FreeSWITCH

c=IN IP4 10.55.55.138

t=0 0

m=audio 30662 RTP/AVP 8 18 101

a=rtpmap:8 PCMA/8000

a=rtpmap:18 G729/8000

a=rtpmap:101 telephone-event/8000

a=fmtp:101 0-16

a=ptime:20

]

variable_endpoint_disposition: [DELAYED NEGOTIATION]

variable_DP_MATCH: [ARRAY::1002|:1002]

variable_call_uuid: [f80fc7b2-37f7-11ed-9d90-cd61d01aad6a]

variable_call_debug: [true]

variable_current_application: [info]

总结

从测试结果中,我们可以更轻松的获取自己想要的通道变量的名称和值。

要注意的一点是,info打印的变量名称和channel中的变量名称是有区别的,如果希望在C/C++代码中获取对应的通道变量,需要使用channel中的变量名。

info和channel的通道变量名称对应关系,参考fs官方文档“https://freeswitch.org/confluence/display/FREESWITCH/Channel+Variables”。

空空如常

求真得真

freeswitch查看所有通道变量的更多相关文章

  1. Linux下怎么添加和查看PATH环境变量

    linux下查看和添加PATH环境变量来自:http://apps.hi.baidu.com/share/detail/32942984 $PATH:决定了shell将到哪些目录中寻找命令或程序,PA ...

  2. Linux/windows查看设置环境变量指令

    一.Linux: 1.查看所有环境变量的指令 方法1:$:export (export命令作用是显示.设置或删除linux环境变量:) 方法2:$:env 2.查看某个指定的环境变量 方法1:$:ex ...

  3. IDEA帮助文档快捷键ctrl+q 查看类 方法 变量 帮助文档 注释 快捷键

    IDEA查看类 成员变量  局部变量注释快捷键,Ctrl +Q 查看帮助文档 实际项目中,通常一个类中的代码都不少,而且有很多的变量 那么如何快速知道这个变量的一些信息,比如类型,定义? 比如在第50 ...

  4. 自动配置/切换/查看JDK环境变量

    最近老是需要几个版本的JDK切换工作,于是网上收集资料整理,自己写了一个:自动配置/切换/查看JDK环境变量的批处理脚本.顺带3个JDK版本分别是:jdk1.6.0_43,jdk1.7.0_80,jd ...

  5. freeswitch 使用info显示的通道变量

    2019-01-20 11:57:30.167311 [INFO] mod_dptools.c:1743 CHANNEL_DATA:Channel-State: [CS_EXECUTE]Channel ...

  6. golang 如何查看channel通道中未读数据的长度

    可以通过内建函数len查看channel中元素的个数. 内建函数len的定义如下: func len(v Type) int The len built-in function returns the ...

  7. Linux学习总结(十)-文件复制及查看, 环境变量

    一 文件复制及移动 1.命令 cp --------copy 的意思格式 cp 选项 源文件 目标文件a: 对于文件我们直接cp 文件 目标文件假定我们在普通用户家目录下/home/lv新建两个普通文 ...

  8. python 查看帮助和变量的强制转换

    查看帮助 dir() 函数 查看对象都有哪些属性和方法 用法:把要查询的对象写入()括号中即可 print(dir([])) (查看列表的方法) 执行: C:\Python27\python.exe ...

  9. 添加用户useradd,给用户设置修改密码passwd,修改用户信息usermod,修改用户密码状态chage,删除用户userdel,查询用户及组id,切换用户su,查看当前环境变量env

    useradd 用户名 passwd 用户名,给指定用户设密码 passwd给当前用户设密码 添加一个用户系统会自动在以下文件或目录创建对应用户信息: [root@localhost ~]# grep ...

  10. Directory 中user Var 如何添加到通道变量中?

    FS默认的配置,ACL 是 拒绝的,只能通过 Digest 的方式进行认证,一旦认证成功之后,directory 中的 var 就能在通道中通过${} 的方式获取到. 如果ACL 认证通过 ,就直接走 ...

随机推荐

  1. 使用CEF(七)详解macOS下基于CEF的多进程应用程序CMake项目搭建

    由于macOS下的应用程序结构导致了CEF这样的多进程架构程序在项目结构.运行架构上有很多细节需要关注,这一块的内容比起Windows要复杂的多,所以本文将会聚焦macOS下基于CEF的多进程应用架构 ...

  2. 聊一聊Rust的enum

    enum在实际编程中是非常常用的,enum的目的就是为了清晰定义出散落在系统各个角落的相同概念的有限固定值. 一.enum介绍如果是简单定义固定值,我们可以使用常量const.比如 public co ...

  3. 2023-12-20:用go语言,给定一个数组arr,长度为n,在其中要选两个不相交的子数组。 两个子数组的累加和都要是T,返回所有满足情况中,两个子数组长度之和最小是多少? 如果没有有效方法,返回-

    2023-12-20:用go语言,给定一个数组arr,长度为n,在其中要选两个不相交的子数组. 两个子数组的累加和都要是T,返回所有满足情况中,两个子数组长度之和最小是多少? 如果没有有效方法,返回- ...

  4. VA01/VA02/VA03 销售订单根据定价和步骤校验权限隐藏价格(二)

    1.文档说明 1.1.内容回顾 之前发表过相关文章<VA01/VA02/VA03 销售订单根据定价和步骤校验权限隐藏价格>,本篇文章对上一篇文章做补充说明. 第一篇文章是通过拥有权限,则隐 ...

  5. NC65获取Token以及相关信息

    private static void setToken() { IPriviledgedGenerator tokenGenerator = (IPriviledgedGenerator) Busi ...

  6. vivo 数据库备份恢复系统演化

    作者:vivo 互联网数据库团队 - Han Chaobing 介绍 vivo 数据库备份恢复功能的演化,以及对备份文件的功能扩展. 一.概述 vivo互联网领域拥有的数据库组件分别为 MySQL.M ...

  7. 部署堡垒机6——配置Nginx及其他组件

    Lina部署 cd /opt wget https://github.com/jumpserver/lina/releases/download/v2.28.7/lina-v2.28.7.tar.gz ...

  8. 16、Flutter Wrap组件 实现流布局

    Wrap可以实现流布局,单行的Wrap跟Row表现几乎一致,单列的Wrap则跟Column表现几乎一致.但 Row与Column都是单行单列的,Wrap则突破了这个限制,mainAxis上空间不足时, ...

  9. Linux系统快速入门

    LINUX基础知识 I.Linux概述 linux是啥? 一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的Un ...

  10. 最终,我决定将代码迁出x86架构!

    如今,我们几乎所有软件都建立在 x86 架构之上 ,在互联网漫长的演进过程中,各大公司拼尽全力在迭代上层架构.优化整体性能,开发者们该用的.能用的招儿想必都用上了,接下来呢?如果底层架构不出现大的革新 ...