用Python实现的Internet电话软件(P2P-SIP)<开源>
本博客为本人学习笔记,代码出自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 # 其他终端/机器上的后续节点
用Python实现的Internet电话软件(P2P-SIP)<开源>的更多相关文章
- Python 列出 windows 安装的软件
Python 列出 windows 安装的软件 参考链接:https://stackoverflow.com/questions/802499/how-can-i-enumerate-list-all ...
- STUN/TURN/ICE协议在P2P SIP中的应用(一)
1 说明 本文详细描述了基于STUN系列协议实现的P2P SIP电话过程,其中涉及到了SIP信令的交互,P2P的原理,以及STUN.TURN.ICE的协议交互 本文所提到的各个服务 ...
- blender 3d模型软件介绍(开源,免费,易用,强大)
关于BLENDER Blender是一个开源的多平台轻量级全能三维动画制作软件 具有建模,雕刻,绑定,粒子,动力学,动画,交互,材质,渲染,音频处理,视频剪辑以及运动跟踪,后期合成等等的一系列动画短片 ...
- 6个P2P流媒体开源项目介绍
P2P流媒体开源项目介绍 1. PeerCast 2002年成立,最早的开源P2P流媒体项目.PeerCast把节点按树结构组织起来, 每个频道都是一个树, 直播源是根节点,父节点只给子节点提供数据 ...
- P2P流媒体开源项目介绍
P2P流媒体开源项目介绍1. PeerCast 2002年成立,最早的开源P2P流媒体项目.PeerCast把节点按树结构组织起来, 每个频道都是一个树, 直播源是根节点,父节点只给子节点提供数据.节 ...
- STUN/TURN/ICE协议在P2P SIP中的应用(二)
1 说明 2 打洞和穿越的概念... 1 3 P2P中的打洞和穿越... 2 4 使用STUN系列 协议穿越的特点... 2 5 STUN/ ...
- python基础(29):网络编程(软件开发架构、网络基础、套接字初使用)
1. 软件开发架构 我们了解的程序之间通讯的应用可分为两种: 第一种是应用类:qq.微信.百度网盘.腾讯视频这一类是属于需要安装的桌面应用. 第二种是web类:比如百度.知乎.博客园等使用浏览器访问就 ...
- Python练习3-XML-RPC实现简单的P2P文件共享
XML-RPC实现简单的P2P文件共享 先来个百度百科: XML-RPC的全称是XML Remote Procedure Call,即XML(标准通用标记语言下的一个子集)远程过程调用.它是一套允许运 ...
- python环境搭建-设置PyCharm软件的配色方案和Python解释器
设置PyCharm软件的配色方案 设置Python解释器(用于Python2 or 3 的切换)
随机推荐
- NGINX并发量优化
NGINX并发量优化 一.压力测试 命令:ab -c 2000 -n 2000 web服务器的地址 ab:压力测试工具 -c:client缩写,客户端的数量 -n:总的访问量,所有客户端总共的访问量. ...
- LeetCode初级算法--其他02:有效的括号
LeetCode初级算法--其他02:有效的括号 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...
- 罗技k380在iOS下无法输入英文引号
本来打算用iPad远程控制电脑主机进行编程的,但是在键盘回来之后开始试着用的时候发现没法输入英文状态的引号. 各种更换输入法都没有用.没有英文引号还写个锤子的代码. 解决办法:设置-通用-键盘,然后将 ...
- Mac在zsh环境安装Maven
Mac OS先安装了oh-my-zsh和iterm2,设置系统的默认语言为zsh.再安装Maven的时候,发现添加profile文件,关闭iterm后,mvn的环境变量一直没有生效. 折腾了好久,突然 ...
- golang gomobile 环境搭建
1. 安装Go语言SDK https://www.golangtc.com/download 2. 配置系统变量这建立GOROOT和GOPATH两个目录,分别对应sdk所在目录与项目文件根目录 3. ...
- CodeForces - 76F:Tourist (旋转坐标系,LIS)
pro:有一个驴友,以及给定N个表演地点xi和时间ti,驴友的速度不能超过V. 问他在起点为原点和不设置起点的情况下分别最多参观多少个表演. sol:BZOJ接飞饼见过:clari也在camp的DP专 ...
- python的any()函数
any()函数的参数是一个可迭代对象,其中的一个元素有一个为真,则any()函数返回真,除非全部为假的时候才返回假. aaa=[,,,] print(any(aaa)) 返回:false
- 有效的minidump(一)
简介 在过去的几年中,崩溃转储成为我们调试活动的一个重要部分.当我们的软件在客户的机器出现故障时,创建应用程序状态的快照并使用在开发人员机器上运行的传统调试器对其进行分析的可能性是非常宝贵的.第一代崩 ...
- globing通配符
匹配标点符号 linux中只要不含有/的文件就可以生成,所以标点符号也是符合要求的 匹配空白 使用\对空白进行转义,这样就可以生成包含空格名称的文件 但是不推荐这样用,容易让别人在使用的时候造成误解 ...
- HTML Meta标签和link标签
一.meta 标签 name属性主要用于描述网页,对应于content(网页内容) 1.<meta name="Generator" contect="" ...