百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

freeswitch修改mod_sofia模块并上报自定义头域

suiw9 2024-11-05 12:33 35 浏览 0 评论



概述

在之前的文章中,我们介绍了如何使用fs的event事件机制来获取呼叫的各种信息。

这些event事件一般都是底层模块定义好的,其中的各种信息已经很完备了,日常的开发需求都可以满足。

但是,总有一些场景是无法完全满足的,例如,在fs的注册事件中,就没有X-自定义头域的信息。

在定制化的sip交互过程中,freeswitch是支持自定义头域的,头域格式要满足“X-***”的模式。而当我们订阅了"sofia::register"事件,在事件中是无法获得自定义头域的信息的。

本文从fs的核心模块mod_sofia的代码出发,分析如何增加对自定义头域的信息的获取和事件上报。


环境

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

freeswitch:v1.8.7

GCC:4.8.5


mod_sofia模块

mod_sofia模块是fs在sofia-sip库的基础上实现的SIP终端模块,fs中所有的sip消息处理和上报都要通过mod_sofia模块来对接。

我们可以在 src\mod\endpoints\mod_sofia\sofia_reg.c 文件中,找到注册消息的处理函数“sofia_reg_handle_register_token”,并在函数中找到“MY_EVENT_REGISTER "sofia::register"”事件的创建和上报流程。

if (switch_event_create_subclass(&s_event, SWITCH_EVENT_CUSTOM, MY_EVENT_REGISTER) == SWITCH_STATUS_SUCCESS) {
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "profile-name", profile->name);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "from-user", to_user);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "from-host", reg_host);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "presence-hosts", profile->presence_hosts ? profile->presence_hosts : "n/a");
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "contact", contact_str);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "call-id", call_id);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "rpid", rpid);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "status", reg_desc);
	switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "expires", "%ld", (long) exptime);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "to-user", from_user);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "to-host", from_host);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "network-ip", network_ip);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "network-port", network_port_c);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "username", username);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "realm", realm);
	switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "user-agent", agent);
	if (update_registration) {
		switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "update-reg", "true");
	}
	if (v_event && *v_event) {
		switch_event_merge(s_event, *v_event);
	}
	
	//add by zr 20220121
	for (sip_unknown_t *un = sip->sip_unknown; un; un = un->un_next) {
	    switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, un->un_name, un->un_value);
    }

	switch_event_fire(&s_event);
}

从上面的代码中,我们可以看到“sofia::register”事件中包含的所有头域内容。

sofia sip协议栈会解析所有的头域,并把非标准的头域都放到“sip->sip_unknown”中。

在红色新增的代码中,我们把所有unknown的头域都放到register上报事件中。


编译

cd freeswitch-1.8.7/src/mod/endpoints/mod_sofia
make
make install


测试

启动freeswitch,使用sip终端注册1002账户。

使用api命令“/event plain ALL”打开fs的事件打印,可以在屏显中看到如下信息:

RECV EVENT
Event-Subclass: sofia::register
Event-Name: CUSTOM
Core-UUID: b95d5721-38f1-406d-b6f1-8c056394d63e
FreeSWITCH-Hostname: localhost.localdomain
FreeSWITCH-Switchname: localhost.localdomain
FreeSWITCH-IPv4: 192.168.0.152
FreeSWITCH-IPv6: ::1
Event-Date-Local: 2022-01-21 17:15:14
Event-Date-GMT: Fri, 21 Jan 2022 09:15:14 GMT
Event-Date-Timestamp: 1642756514420767
Event-Calling-File: sofia_reg.c
Event-Calling-Function: sofia_reg_handle_register_token
Event-Calling-Line-Number: 2011
Event-Sequence: 902
profile-name: internal
from-user: 1002
from-host: 192.168.0.152
presence-hosts: 192.168.0.152,192.168.0.152
contact: "1002" <sip:1002@10.9.136.138:1666;fs_nat=yes;fs_path=sip:1002@10.9.136.138:1666>
call-id: 1378235421@10.9.136.138
rpid: unknown
status: Registered(UDP-NAT)
expires: 3600
to-user: 1002
to-host: 192.168.0.152
network-ip: 10.9.136.138
network-port: 1666
username: 1002
realm: 192.168.0.152
user-agent: FaramAndroid/1.5.9
sip_number_alias: 1002
sip_auth_username: 1002
sip_auth_realm: 192.168.0.152
number_alias: 1002
user_name: 1002
domain_name: 192.168.0.152
record_stereo: true
default_gateway: example.com
default_areacode: 918
transfer_fallback_extension: operator
toll_allow: domestic,international,local
accountcode: 1002
user_context: default
effective_caller_id_name: Extension 1002
effective_caller_id_number: 1002
outbound_caller_id_name: FreeSWITCH
outbound_caller_id_number: 0000000000
callgroup: techsupport
X-Packet: com.sipp
X-Brand: huawei
X-Osver: 29
X-Token: IQAAAACy0eGUAAAWdHyqUVfb0b
X-Jgtoken: 190e35f7e0
X-Olduser: 12345678

我们可以在事件信息的最后看到“X-”开头的自定义头域信息打印。


总结

本文从fs的sip协议栈出发,修改了mod_sofia模块代码,增加自定义消息头域的事件上报,对sip消息的定制有一定参考意义。

但是,在日常的VOIP中,我们应该尽量避免自定义头域的使用,以避免兼容性的问题。



空空如常

求真得真

相关推荐

俄罗斯的 HTTPS 也要被废了?(俄罗斯网站关闭)

发布该推文的ScottHelme是一名黑客,SecurityHeaders和ReportUri的创始人、Pluralsight作者、BBC常驻黑客。他表示,CAs现在似乎正在停止为俄罗斯域名颁发...

如何强制所有流量使用 HTTPS一网上用户

如何强制所有流量使用HTTPS一网上用户使用.htaccess强制流量到https的最常见方法可能是使用.htaccess重定向请求。.htaccess是一个简单的文本文件,简称为“.h...

https和http的区别(https和http有何区别)

“HTTPS和HTTP都是数据传输的应用层协议,区别在于HTTPS比HTTP安全”。区别在哪里,我们接着往下看:...

快码住!带你十分钟搞懂HTTP与HTTPS协议及请求的区别

什么是协议?网络协议是计算机之间为了实现网络通信从而达成的一种“约定”或“规则”,正是因为这个“规则”的存在,不同厂商的生产设备、及不同操作系统组成的计算机之间,才可以实现通信。简单来说,计算机与网络...

简述HTTPS工作原理(简述https原理,以及与http的区别)

https是在http协议的基础上加了一层SSL(由网景公司开发),加密由ssl实现,它的目的是为用户提供对网站服务器的身份认证(需要CA),以至于保护交换数据的隐私和完整性,原理如图示。1、客户端发...

21、HTTPS 有几次握手和挥手?HTTPS 的原理什么是(高薪 常问)

HTTPS是3次握手和4次挥手,和HTTP是一样的。HTTPS的原理...

一次安全可靠的通信——HTTPS原理

为什么HTTPS协议就比HTTP安全呢?一次安全可靠的通信应该包含什么东西呢,这篇文章我会尝试讲清楚这些细节。Alice与Bob的通信...

为什么有的网站没有使用https(为什么有的网站点不开)

有的网站没有使用HTTPS的原因可能涉及多个方面,以下是.com、.top域名的一些见解:服务器性能限制:HTTPS使用公钥加密和私钥解密技术,这要求服务器具备足够的计算能力来处理加解密操作。如果服务...

HTTPS是什么?加密原理和证书。SSL/TLS握手过程

秘钥的产生过程非对称加密...

图解HTTPS「转」(图解http 完整版 彩色版 pdf)

我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。...

HTTP 和 HTTPS 有何不同?一文带你全面了解

随着互联网时代的高速发展,Web服务器和客户端之间的安全通信需求也越来越高。HTTP和HTTPS是两种广泛使用的Web通信协议。本文将介绍HTTP和HTTPS的区别,并探讨为什么HTTPS已成为We...

HTTP与HTTPS的区别,详细介绍(http与https有什么区别)

HTTP与HTTPS介绍超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的...

一文让你轻松掌握 HTTPS(https详解)

一文让你轻松掌握HTTPS原文作者:UC国际研发泽原写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。...

如何在Spring Boot应用程序上启用HTTPS?

HTTPS是HTTP的安全版本,旨在提供传输层安全性(TLS)[安全套接字层(SSL)的后继产品],这是地址栏中的挂锁图标,用于在Web服务器和浏览器之间建立加密连接。HTTPS加密每个数据包以安全方...

一文彻底搞明白Http以及Https(http0)

早期以信息发布为主的Web1.0时代,HTTP已可以满足绝大部分需要。证书费用、服务器的计算资源都比较昂贵,作为HTTP安全扩展的HTTPS,通常只应用在登录、交易等少数环境中。但随着越来越多的重要...

取消回复欢迎 发表评论: