Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

让Linux支持UPnP

[复制链接]
Nanu 发表于 2006-3-21 21:50:40 | 显示全部楼层 |阅读模式
N个月前的一篇小作……

一、什么是UPnP

UPnP(Universal Plug and Play)技术对即插即用进行了扩展,它简化了家庭或企业中智能设备的联网过程。在结合了UPnP技术的设备以物理形式连接到网络中之后,它们可以通过网络自动彼此连接在一起,而且连接过程无需用户的参与

UPnP规范基于TCP/IP协议和针对设备彼此间通讯而制订的其它Internet协议。这就是它之所以被称作"通用(Universal)"的原因所在--UPnP技术不依赖于特定的设备驱动程序,而是使用标准的协议。UPnP设备可以自动配置网络地址,宣布它们在某个网络子网的存在,以及互相交换对设备和服务的描述。基于Windows XP的计算机可以充当一个UPnP控制点,通过程序界面对设备进行发现和控制。

如果与以前的即插即用相比,这种技术似乎并不具有什么革命性的意义。在操作系统中增加即插即用技术使得在单个计算机上安装、配置和添加外设的工作变得更容易了。但是UPnP为家庭用户或者小型办公环境中的非专业用户所带来的是一道更加美味的"大餐",他们可以利用UPnP玩多人游戏,进行实时通信(Internet电话,电话会议)以及使用类似Windows XP的远程协助这样的其它技术。

NAT 穿越技术

NAT穿越技术允许网络应用程序对它们是否位于一个具有UPnP能力的NAT设备之后进行检测。然后,这些程序将获得共享的全球可路由IP地址,并且配置端口映射以将来自NAT外部端口的数据包转发到应用程序使用的内部端口上--所有这一切都是自动完成的,用户无需手动映射端口或者进行其它工作。NAT穿越技术允许网络设备或者点对点应用程序通过动态开启和闭合与外部服务之间的通信端口穿过NAT网关与外界通信。

二、在Linux中部署UPnP支持

我们假设该Linux的内核版本是2.4.x,使用拨号上网,外网接口是ppp0,内网接口是eth0,并且已经启用iptables设定了 NAT。

在Linux中部署UPnP主要使用2个软件的配合:UPnP SDK for Linux和LinuxIGD。
下载地址:
UPnP SDK for Linux: http://sourceforge.net/projects/upnp/
LinuxIGD: http://linux-igd.sourceforge.net/

注意:要下载upnpsdk-1.0.4.tar.gz,1.0.4以上的版本不能和LinuxIGD很好的协同工作!

安装:

1. 解包UPnP SDK
# tar xzvf upnpsdk-1.0.4.tar.gz

2. 修改源代码
为了能够使Windows MSN Messenger在UPnP下正常通讯,所以必须修改源代码:
# cd upnpsdk-1.0.4
# vi src/ssdp/ssdplib.c
将第406行的:
SelfAddr.sin_addr.s_addr = inet_addr(SSDP_IP);
改为:
SelfAddr.sin_addr.s_addr = htonl(INADDR_ANY);

3. 编译安装UPnP SDK
# make
# make install

4. 解包Linux-IGD
# tar xzvf linuxigd-0.92.tgz

5. 编译安装Linux-IGD
# cd linux-igd
# make
# make install

配置:
1. 增加广播路由
# route add -net 239.0.0.0 netmask 255.0.0.0 eth0

2. 为iptables建议一个软链接
# cd /usr/sbin
# ln -s /sbin/iptables ./

启动UPnP
# upnpd ppp0 eth0

诊断UPnP运行状态
# tail /var/log/messages

如果能够看到:
Dec  14 16:01:49 doorway -- MARK --
Dec  14 16:02:15 doorway upnpd: The Linux UPnP Internet Gateway Device Ver 0.92 by Dime (dime@gulfsales.com)
Dec  14 16:02:15 doorway upnpd: Special Thanks for Intel's Open Source SDK and original author Genmei Mori's work.
则说明UPnP已经成功启动。

测试
以支持UPnP的P2P网络电视PPLive为例,在PPLive中打开UPnP支持选项,然后连接一个频道。
在Linux中执行:
# tail /var/log/debug -f
如果能看到:
Dec  14 16:56:33 doorway upnpd: AddPortMap: RemoteHost: (null) Prot: 17 ExtPort: 3226 Int: 10.0.0.2.3226
Dec  14 16:56:33 doorway upnpd: AddPortMap: RemoteHost: (null) Prot: 6 ExtPort: 3226 Int: 10.0.0.2.3226
Dec  14 16:56:33 doorway upnpd: AddPortMap: RemoteHost: (null) Prot: 6 ExtPort:  3156 Int: 10.0.0.2.3156
Dec  14 16:56:33 doorway upnpd: AddPortMap: RemoteHost: (null) Prot: 6 ExtPort:  3156 Int: 10.0.0.2.3156

则说明PPLive已经向UPnP请求进行端口映射了。只要看到这样的字样,就说明UPnP已经完全工作起来了。
cqfanli 发表于 2006-3-22 00:03:17 | 显示全部楼层
不错的~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-12-27 18:11 , Processed in 0.021014 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表