3

使用python发送sip协议的OPTIONS

 1 year ago
source link: https://www.cnblogs.com/MikeZhang/p/pyOptions20230624.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
环境:Windows10_x64 
Python版本 :3.9.2
sip协议提供了OPTIONS请求方法可用于探测对端状态,今天记录下Windows10环境下使用python3.9简单实现sip协议的options功能(udp承载)的过程,并提供示例代码及相关资源下载,可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230624 获取。 

一、背景描述

sip协议提供了OPTIONS请求方法,可实现如下功能:
1)查询对端能力;
2)检测对端状态(类似ping的功能);
3)NAT会话保活;
4)探测网元数量;
其中,检测对端状态用的比较多,主要用于探测对端服务是否正常。
sip OPTIONS的定义及描述,可参考rfc 3261:
300959-20230624150724098-1225151269.png

二、运行效果

这里演示下使用python发送sip协议的OPTIONS的运行效果,使用FreeSWITCH对接,分为正常探测和异常处理。

1、正常探测 

可以在控制台开启sip日志来观察:
sofia global siptrace on
300959-20230624150822750-1313644797.png

2、异常情况

在控制台关闭freeswitch后,查看脚本运行状态,脚本使用了异常处理,可以处理timeout异常。
300959-20230624150901450-580181776.png
运行效果演示视频获取途径:
关注微信公众号(聊聊博文,文末可扫码)后回复 2023062401 获取。 

三、具体实现

这里列举下关键点,并提供示例代码。

1、python实现的关键点

1)协议模板
根据rfc定义的OPTIONS格式,生成python中使用的消息模板:
OPTIONS sip:{dstSipHost}:{dstSipPort} SIP/2.0
Via: SIP/2.0/UDP {srcSipHost}:{srcSipPort};rport;branch={branchId}
Max-Forwards: 70
From: <sip:{srcSipHost}>;tag={tagId}
To: <sip:{dstSipHost}>
Call-ID: {callId}
CSeq: {cseqNum} OPTIONS
User-Agent: myChecker
Content-Length: 0
2)sequence号
需要注意返回消息的CSeq值是否和发送的一致。
3)探测周期
太快和太慢都不好,具体数值根据应用的实际情况调整。
4)socket需要设置超时
可通过 settimeout 函数进行设置,具体参考python的socket文档。

2、示例代码

300959-20230624151104606-271185184.png

完整示例代码获取途径:

关注微信公众号(聊聊博文,文末可扫码)后回复 20230624 获取。 

四、资源下载

 本文涉及源码和文件,可以从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230624 获取。 
300959-20230624151225246-1303531215.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK