0
点赞
收藏
分享

微信扫一扫

用Python实现的Internet电话软件(P2P-SIP)<开源>

李雨喵 2022-03-23 阅读 16


本博客为本人学习笔记,代码出自GitHub:​​https://github.com/theintencity/p2p-sip​​

由于GitHub原著为英文,且相当的啰嗦,本文为翻译内容并去除其啰嗦的部分

重点:代码只支持Python


Python版本开源互联网点对点软件 

  关键词:​SIP​, ​P2P​, ​Python​, ​p2psip​, ​DHT​, ​implementation

  相关链接: ​​​Blog​​, ​​39 peers​​, ​​Implementing SIP telephony in Python​​, ​​Student Projects​​, ​​Support​​

  解释:网络电话可以是对等体系的应用,参与者不需要依赖昂贵或管理的服务提供者的情况下彼此定位和通讯。

本项目目标是使用Python语言中的会话启动协议(P2P-SIP)来实现开源的点对点(peer-tp-peer,简称P2P)的互联网通话软件,项目支持开放协议,如IETF SIP和RTP


peer-to-peer系统优点:​具有高扩展性、容错性、针对灾难性故障的稳健性。因为它没有中央服务器,并且没有网络自我组织


代码结构

  • src/tools/htmlify.py工具用于生成带注释的web视图代码
  • src/app下面包含了,如SIP客户端(voip.py),使用Bamboo的DHT(dht.py)等等
  • src/std下面包含了各种IETF RFC实现的Internet草案,例如RFC 3261, RFC 3550, RFC 2617等等
  • 有些模块是未完成的半成品


代码整体分为两部分 - standards和applications。 某些RFC和Internet-drafts中指定的standards在std包中实现,而高级应用程序在app包中实现。 构建此项目的主要优点之一是源代码在代码行方面要少得多。

下表总结了std包的内容,并允许使用从相应规范中提取的嵌入式文档来浏览源代码。


Module

Description

Lines

​​rfc2198​​

实现 RTP payload type for 冗余音频数据.

45

​​rfc2396​​

实现各种形式的地址 such as URI or SIP 地址

177

​​rfc2617​​

实现在 SIP 中可重用的 HTTP 基本和摘要式的身份验证

131

​​rfc2833​​

实现在 RTP 数据包中的 DTMF 按键音有效负载

40

​​rfc3261​​

实现会话启动协议(SIP)的用户代理部分

1558

​​rfc3263​​

会用 DNS NAPTR ,  SRV 和 A  实现 SIP 服务器发现

108

​​rfc3264​​

实现 SIP 中使用的单播会话的 SDP 提供答案模型

120

​​rfc3489bis​​

实现基本的 NAT 遍历技术 such as STUN, NAT discovery using STUN,  TURN的变体

693

​​rfc3550​​

实现实时传输协议(RTP)及其配套控制协议RTCP。

687

​​rfc3551​​

定义RTP的静态有效内容类型。

48

​​rfc3920​​

实现客户端 XMPP 核心

435

​​rfc3921​​

实现IM和XMPP客户端的存在(不完整)。

373

​​rfc4566​​

实现会话描述协议(SDP)。

162

高级应用程序模块使用其中一些模块并构建其他应用程序或库,如下所述:

Module

Description

Lines

​​voip​​

实现 SIP 用户代理库,用于注册、呼叫、即时消息和会议

1261

​​dht​​

实现 Bamboo/Pastry 分布式哈希表算法的变体

1983

​​opendht​​

实现客户端库,用来连接到现有的OpenDHT服务

71

p2p

使用 DHT 实现 peer-to-peer 的管道抽象(未完成)

642

p2psip

使用p2p和voip模块实现各种P2P-SIP应用场景(未完成)

285

crypto

实现在dht或p2p中使用的加密算法的抽象(未完成)

261

dhtgui

实现一个用来启动p2p / dht 模块的测试工具,并以圆形来显示节点

427

sipd

使用rfc3261模块实现一个非常简单的SIP注册和代理服务器。(不完全的)


起支持作用的模块

Module

Description

Lines

​​simplexml​​

会用方便的方法和运算符实现简单的 XML  DOM,用来处理 XML 和 XMLList

420


在运行代码之前,需要自行配置Python的环境,下面的栗子是执行voip.py,​这个脚本使用iptel.org服务器执行编写SIP注册、呼叫和即时消息测试

# 在download文件夹下
tar -zxvf source-*.tgz
cd p2p-sip/src
export PYTHONPATH=.:external:std:app
python app/voip.py



  每个模块都有一个简单的测试用例,作者之后还会上传使用这些基本模块构建的应用程序。

  • dhtgui.py用于启动P2P模块的测试用户界面,它取决于wxPython的用户界面功能。运行会启动具有DHT圈的用户界面,我们可以在与安全中心附近单击添加新的节点
  • p2psip.py用于启动P2P-SIP结点

注意:第一个节点启动时需要加 -s ,以成为超级节点,后续启动的节点不要加 -s 以加入此P2Peye.com网络

第一个节点监听SIP端口5062,用 -d 参数可以查看节点之间交换的P2P消息。如果想要跨多个IP网络进行P2P网络,需要重新配置引到节点,因为多播发现通常只能在同一IP下运行

python app/p2psip.py -s   # 第一个节点作为启动服务器
python app/p2psip.py # 其他终端/机器上的后续节点



X-lite v3配置

  如果想要使用X-lite测试P2P-SIP,请使用以下X-lite v3配置。 在“帐户”(Account)选项卡下的首选项/选项(preferences/options)中,选择“域代理”(Domain proxy)并将代理地址设置为端口5062上的引导服务器,或者具有正确端口的其他服务器之一,例如127.0.0.1:5062。 在“语音邮件”(Voicemail)选项卡中,取消选中所有内容以避免向P2P-SIP节点发送不必要的语音邮件相关消息。 在“拓扑”(Topology)选项卡的“防火墙遍历”(Firewall traversal)下,“IP address”设置为“使用本地IP地址”(Use local IP address)。 “STUN服务器”设置为“使用指定的服务器”(Use specified server),地址留空。 取消选中所有其他框并将“Use Xtunnels”设置为永不(never)。 在“存在”(Presence)选项卡中,“Mode”是peer-to-peer的。 所有其他值都保留为默认值。 在“高级”(Advanced)选项卡中,确保取消选中“发送SIP保持活动消息”(send SIP keep alive messages)。​ 事实上,唯一的复选框是“Use rport”。 所有其他值都保留为默认值。






举报

相关推荐

0 条评论