利用usb摄像头建立家庭监控系统

2020年年初由于受疫情的影响,很多家庭都为了孩子上网课而购置了usb摄像头,而现在随着孩子恢复到学校正常上课,原先购买的usb摄像头就闲置下来了。那今天我们就来讲解一下如何利用usb摄像头建立家庭监控系统,让闲置的物件再发挥发挥其大作用。

一、材料准备

1、本次讲解路由器我们采用网件Netgear R7800,系统是OpenWrt 19.07.3;

2、家里闲置的usb摄像头型号是C270 HD WEBCAM,是罗技Logitech公司出品的,720p,30fps。

二、设置过程

1、添加usb支持

opkg update
opkg install kmod-usb-core kmod-usb2 kmod-usb3

2、安装usb检测工具(非必须)

opkg install usbutils

3、安装usb video支持

opkg install kmod-video-uvc

具体安装什么usb video支持程序,需要看自己家里的usb摄像头支持什么格式的,具体可以先参考一下OpenWrt关于usb video的用户指南:

https://openwrt.org/docs/guide-user/hardware/video/usb.video

判断自己购买的usb摄像头是否支持uvc格式,是否可以在linux内核里自动识别,可直接参阅:http://www.ideasonboard.org/uvc/

我的罗技C270在支持的列表里,因此我在路由器上安装 kmod-video-uvc 后,就可以使用 lsusb -t 或 ls /dev/video* 看到设备已成功安装:

利用usb摄像头建立家庭监控系统-1

三、实时监控视频

1、安装支持

opkg update
opkg install mjpg-streamer luci-app-mjpg-streamer

2、进入路由器Luci设置界面,点“Services – MJPG-streamer“,在”General“里设置视频格式及输出方式,并勾选”Enabled“;在”Plugin settings – HTTP output”里设置端口号、登录账号及密码等:

利用usb摄像头建立家庭监控系统-2

在”Plugin settings – UVC input“设置项里,勾选”Enable YUYV format“,最后点”Save & Apply“保存并使设置生效:

利用usb摄像头建立家庭监控系统-3

3、验证:因为我们上面设置的是HTTP输出,因此在PC浏览器地址栏输入:http://192.168.1.1:8080 即可看到实时视频画面了。我们也可以通过设置DDNS和端口转发,在远程电脑上获取实时的监控画面。

如果我们选择File文件输出,建议最好在路由器上再挂载一个大容量的usb移动硬盘。

四、利用NAS实现实时监控及存储功能

1、先确保通过上面的设置 mjpg-streamer 已经可以获得网页实时视频;

2、以群晖Synology NAS为例,打开NAS管理界面,打开Surveillance Station(注:须提前安装),打开“添加摄像机”,点“新增”,选“完整设置”,填上名称,如“usb camera”;品牌处选“用户自定义”;类型选“串流-HTTP”;在路径处填上http://”username:password@192.168.1.1:8080/?action=stream”(填上引号内内容,不含双引号;username、password、端口号8080,都按mjpg-streamer的实际设置值输入即可)。

利用usb摄像头建立家庭监控系统-4

3、再正常点”下一步“,按缺省设置,就可以添加成功了。

通过NAS的Surveillance Station就可以实时看到监控视频,同时利用NAS的存储功能也可以很方便的回看以前的画面。目前唯一的缺点是还无法支持声音,希望后续有那位大神可以将声音功能也一并加上,那样的话,利用usb摄像头建立家庭监控系统就会变得更完美了!

 

在OpenWrt路由器上安装KMS

如何在OpenWrt路由器上安装KMS激活服务器?以便在特定情况下也能激活相应的软件,保证软件的正常使用。

特别申明:本网站只是对某种技术进行讲解,不表明网站支持盗版软件的应用,请购买正版软件,保护知识产权!!!

一、KMS项目

KMS项目源码以C语言编写,支持在不同平台上使用,具体可参考:

1、C语言源码参考:https://github.com/Wind4/vlmcsd/

2、论坛:https://forums.mydigitallife.net/threads/50234 (须注册登入)

二、KMS for OpenWrt项目

KMS在OpenWrt平台上应用,可具体参考如下网站:

1、vlmcsd分项目

源码:https://github.com/cokebar/openwrt-vlmcsd

预编译:https://github.com/cokebar/openwrt-vlmcsd/tree/gh-pages

发布版:https://github.com/cokebar/openwrt-vlmcsd/releases

2、luci-app-vlmcsd分项目

源码:https://github.com/cokebar/luci-app-vlmcsd

发布版:https://github.com/cokebar/luci-app-vlmcsd/releases

三、具体安装及设置

下面我们就以Netgear WNDR3700 V4路由器为例,来讲解下具体安装及设置过程(注:路由器刷的OpenWrt版本号为19.07.3):

1、自编译过程

1)根据路由器的型号及已安装的OpenWrt的版本号,在OpenWrt官网下载相应的SDK包:

openwrt-sdk-19.07.3-ar71xx-nand_gcc-7.5.0_musl.Linux-x86_64.tar.xz

2)在linux系统下如Ubuntu等,先解压下载的SDK包

tar xf openwrt-sdk-19.07.3-ar71xx-nand_gcc-7.5.0_musl.Linux-x86_64.tar.xz

然后进入相应目录

cd openwrt-sdk-19.07.3-ar71xx-nand_gcc-7.5.0_musl.Linux-x86_64

然后将从vlmcsd分项目中的最新源码及luci-app-vlmcsd分项目中的最新源码拷贝到package子目录下:

package/openwrt-vlmcsd-master
package/luci-app-vlmcsd-master

3)执行编译

make package/openwrt-vlmcsd-master/compile V=s (中间会进入config的设置画面,点exit,点yes保存缺省设置即可)
make package/luci-app-vlmcsd-master/compile V=s

然后在 bin/packages/mips_24kc/base 目录下就可以发现已编译好的两个文件:

vlmcsd_svn1113-1_mips_24kc.ipk
luci-app-vlmcsd_1.0.2-1_all.ipk

2、安装(PC通过WinSCP连路由器)

将上面编译好的两个文件拷贝到 /tmp 目录下,然后运行

opkg update
opkg install /tmp/vlmcsd_svn1113-1_mips_24kc.ipk /tmp/luci-app-vlmcsd_1.0.2-1_all.ipk

3、设置

进入Luci界面,点“Services – vlmcsd”进入,勾选“Enable”和“Auto activate”,然后点“Save & Apply”保存并应用。

在OpenWrt路由器上安装KMS

4、验证

PC接路由器网络,进入dos命令行界面(选“运行”,输入“cmd”,点“return”),然后输入

nslookup -type=srv _vlmcs._tcp.lan

如果能正常获取路由器LAN的IP地址,则表明KMS激活服务器安装成功。

5、激活方式及激活码

1)按以上方式设置后,接上电脑即可自动激活Windows和Office;

2)其它激活方式及激活码可参考如下网址:

https://github.com/Wind4/vlmcsd/tree/gh-pages

6、注意事项

KMS激活方式仅限于相关软件的VOL、VL、business edition版本,并不适用于其它版本(如:Consumer Edition等)。

这次我们讲解的在OpenWrt路由器上安装KMS的内容,相比较我们以前讲解的其它应用要略微复杂一些,因为它要涉及到应用自编译的环节。关于自编译的说明后面我们会详细展开,这次我们只是简单的涉及。本次讲解中涉及的自编译的两个文件,我会放在下载中心(百度网盘提取码:lyzj),方便大家直接下载使用,可以跳过自编译环节。

惠普M1005实现网络共享打印及扫描

家里有1台惠普的打印、复印、扫描一体机HP Laserjet M1005 MFP,想挂在路由器上,实现网络共享打印及扫描,但这款机子只有usb口,没有网络接口,要如何实现呢?其实,只要我们有一台刷了OpenWrt系统又带usb接口的路由器(例如我们前面讲过的TL-WR720N、TL-WDR4310等等),实现起来就非常简单了。下面我们就来详细讲解一下惠普M1005实现网络共享打印及扫描的整个过程。

一、网络共享打印功能的实现

(一)路由器端设置

1、先在OpenWrt路由器上安装必要的支撑程序:

opkg update

opkg install kmod-usb-printer p910nd luci-app-p910nd

2、将打印机接入路由器usb口,开启电源;然后电脑连接路由器,用如下命令确认打印机安装是否成功:

ls /dev/usb/lp*

# 显示示例如下

/dev/usb/lp0

若有显示类似 “/dev/usb/lp0“,则表示安装成功。

惠普M1005实现网络共享打印及扫描-1

3、打开路由器中p910nd服务器的Luci设置页面:

1)选择启用p910nd服务,即”enable”选项打勾;

2)不要选择双向模式,即将双向模式”Bidirectional mode”后面的勾去掉(注:M1005必须去掉,其它机型自己测试)。

惠普M1005实现网络共享打印及扫描-2

4、防火墙打开9100端口(注:高版本OpenWrt系统,可以省略这一步,系统在安装p910nd服务时会自动允许9100端口数据通行)。

5、重启路由器(注:M1005必须重启路由器,只重启p910nd服务没用)。

(二)电脑端设置(以win10系统为例)

1、打开“添加打印机和扫描仪”,然后点选“我需要的打印机不在列表中”;

2、选中“使用TCP/IP地址或主机名添加打印机”,点“下一步”;

3、输入ip地址:例如192.168.1.1;输入端口名称:随便自定义;点“下一步”;

4、选中“自定义”,点“设置”进入设置页面,在设置页面输入正确的IP地址及端口号等,点“OK”回原页面;再点“下一步”;

5、然后选择正确的打印机驱动程序(注:可以事先安装后,因为hp一般只提供exe安装文件),系统会自动提示用现有的驱动程序;

6、设置完成之前,可以点一下“打印测试页”,以测试所有设置是否正确。

二、网络共享扫描功能的实现

(一)路由器侧设置

1、在OpenWrt上安装必要的支撑程序:

opkg update

opkg install sane-daemon sane-frontends sane-hpljm1005 xinetd

sane-hpljm1005是HP Laserjet M1005 MFP的扫描驱动程序,若是其它机型,则需要自己查询如下网站进行确认。

http://www.sane-project.org/sane-backends.html#SCANNERS

2、运行一下以下命令确认扫描仪是否正确安装:

scanimage -L

# 显示示例如下

device `hpljm1005:libusb:001:002' is a Hewlett-Packard LaserJet M1005 multi-function peripheral

显示类似 “device `hpljm1005:libusb:001:002′ is a Hewlett-Packard LaserJet M1005 multi-function peripheral” 即OK。

3、开启监控,修改 /etc/xinetd.d/sane-port的内容,将最后的 disable = yes 改成 disable = no

vim /etc/xinetd.d/sane-port

# default: off
# description: The saned provides scanner service via the network.  
#       Applications like kooka, xsane or xscanimage can use the remote 
#       scanner.
service sane-port
{
        socket_type = stream
        port        = 6566
        wait        = no
        user        = root
        group       = root
        server      = /usr/sbin/saned
        disable     = no
}

4、添加内网使用扫描仪支持,在 /etc/sane.d/saned.conf 中添加,例如:192.168.1.0/24

vim /etc/sane.d/saned.conf

# saned.conf
# Configuration for the saned daemon

## Daemon options
# Port range for the data connection. Choose a range inside [1024 - 65535].
# Avoid specifying too large a range, for performance reasons.
#
# ONLY use this if your saned server is sitting behind a firewall. If your
# firewall is a Linux machine, we strongly recommend using the
# Netfilter nf_conntrack_sane connection tracking module instead.
#
# data_portrange = 10000 - 10100


## Access list
# A list of host names, IP addresses or IP subnets (CIDR notation) that
# are permitted to use local SANE devices. IPv6 addresses must be enclosed
# in brackets, and should always be specified in their compressed form.
#
# The hostname matching is not case-sensitive.

#scan-client.somedomain.firm
#192.168.0.1
#192.168.0.1/29
#[2001:db8:185e::42:12]
#[2001:db8:185e::42:12]/64

192.168.1.0/24

# NOTE: /etc/inetd.conf (or /etc/xinetd.conf) and
# /etc/services must also be properly configured to start
# the saned daemon as documented in saned(8), services(4)
# and inetd.conf(4) (or xinetd.conf(5)).

5、防火墙打开6566端口(注:高版本OpenWrt系统不需要)

6、重启路由器

(二)电脑侧设置(以win10下安装为例)

1、先下载wiasane:http://github.com/mback2k/wiasane,然后安装,按提示输入相关内容即可;

2、利用“windows附件”中的“windows 传真和扫描”就可进行网络共享扫描了。

这次我们讲解了惠普M1005实现网络共享打印及扫描的设置方法,这是一项非常实用的应用,特别是家里有多台电脑的时候,实现共享以后每台电脑都好像连接了一个打印机和扫描仪,可以省去很多不必要的麻烦。如果你家里有类似老式的打印机或扫描仪,建议可以用类似的方法去试试实现网络共享的乐趣。

路由器wan口pppoe拨号模式下如何进入光猫设置界面?

路由器wan口pppoe拨号模式下如何进入光猫设置界面?路由器采用pppoe拨号模式获取IP地址时,光猫端也将由路由模式变更为桥接模式(pppoe协议),这时连接路由器lan端的电脑,在其浏览器地址栏输入192.168.1.1,就无法像路由模式(DHCP Client)时那样进入原光猫设置界面了。

但如果你连接的路由器是刷了OpenWrt系统的,那通过简单设置就可以解决这个问题。

1、在OpenWrt路由器的Luci界面,点”Network – Interfaces”,在设置页中添加一个新wan口,例如:wan1

2、设置协议采用静态地址(static address),IP地址就设置成:192.168.1.2;网关及dns都设置成192.168.1.1;防火墙设置成与wan口一样

路由器wan口pppoe拨号模式下如何进入光猫设置界面?-1

设置完成后,电脑连接路由器任一lan口,在浏览器地址栏输入192.168.1.1就可以进入光猫设置页面了。

路由器wan口pppoe拨号模式下如何进入光猫设置界面?-2

特别建议:

因为很多路由器的缺省lan口IP地址都是192.168.1.1,为避免导致无法连接、无法识别的问题,建议将光猫的IP地址改一下,例如:将192.168.1.1改为192.168.88.1,具体方法可参见IPTV单线复用一文。

光猫超级账号及密码

当我们按光猫上标注的普通账号及密码登录后,设置页面里允许我们对光猫进行修改的权限是非常有限的,所以如果我们需要对光猫进行某些特殊要求的设定时,就必须先想办法获取光猫超级账号及密码,再以超级账户及密码的方式登录。

不同的光猫其获取超级账户及密码的方法有可能是完全不一样,我们今天只讲解HG6201T这款光猫超级账号及密码的获取方法:

电脑与光猫连接,先确认通过电脑能访问光猫的设置页,例如:在浏览器地址栏输入:192.168.1.1,会提示你输入账号及密码。

光猫超级账号及密码-1

然后在浏览器地址输入:http://192.168.1.1:8080/cgi-bin/baseinfoSet.cgi

在浏览器返回的页面里你就会发现很多信息,其中就包含下面两行:

光猫超级账号及密码-2

第一行显示的就是超级账户:telecomadmin

第二行包含了超级密码,但是要做个转换,从120&到114&对应的就是telecomadmin;

后面的部分54&对应的就是6,55&对应7,以此类推。也可以到 https://www.mokuge.com/tool/asciito16/ 网站进行十进制ASCII码与字符串之间的转换。

最终我们得到的超级密码就是:telecomadminXXXXXXXX

 

IPTV单线复用

在现实生活中,其实需要设置IPTV单线复用的情形已很少发生,因为目前家庭网络中已几乎不存在单口光猫、单口路由器、墙面单网线布置的情况,但作为技术分享的一部分,本文还是对其做一些简要说明。

我们就以墙面单网线布置的情况为例,光猫是多口的(Internet和ITV传输口是分开的),路由器也是有一个WAN口、多个LAN口的那种,因为光猫与路由器连接之间的墙面只布置了一条网络,所以我们只能采用单线复用的方式来进行Internet和ITV信号的正常传输。

1、光猫内部配置情况分析

我们需要先进入光猫端的设置页面,PC网口直接连接光猫的千兆口,然后在浏览器地址输入:192.168.1.1,再输入账号及密码(一般光猫背面都有标注)就进入简易配置页面。为避免与路由器LAN处于同一IP网段(缺省一般采用192.168.1.X)信号冲突,建议先将光猫配置服务器端IP网段从192.168.1.X改为其它的。当然我们也可以选择修改路由器LAN口的IP网段,但最好还是修改光猫端的,特别是涉及到多级路由的情况下,修改光猫端一劳永逸、最方便。

IPTV单线复用-1

进入“高级设置”页面,再点选“局域网设置”,将局域网IP从192.168.1.1修改为其它的,上图中我是修改为:192.168.88.1,这样不容易与路由器设置相冲突。

接下来我们要配置千兆口既传输Internet信号也传输ITV信号,相互分工明确且互不干扰。这时我们需要用到光猫的超级账号及密码,因为接下来要设置的项目以普通账户登录是没法操作的。关于如何才能够获取光猫的超级账号及密码,请参考光猫超级账号及密码一文。

PC浏览器地址栏输入:192.168.88.1,然后输入超级账号及密码,就进入光猫的详细配置页面了。例如:刚才我们配置的IP网段,就可以在“网络-用户侧管理“页面发现。IPTV单线复用-2

还有Internet及ITV的接口配置情况:

IPTV单线复用-3

Internet信号采用“VLAN ID”是41,绑定了”网口1“,即千兆口。

IPTV单线复用-4

ITV信号采用“VLAN ID”是43,绑定了ITV口及“网口3”、“网口4”,即两个百兆口。

单线复用时,我们希望Internet及ITV都通过网口1即千兆口传输,再通过设定VLAN绑定,在路由段端将接收的信号分离。同时为了让路由器端完全还原光猫的接口功能,我们将路由器的LAN1设为Internet信号输出,LAN2、LAN3、LAN4设为ITV信号输出。

IPTV单线复用-5

2、光猫端设置

因为VLAN绑定的优先级高于LAN端口绑定,因此我们只需要设定VLAN绑定,而不需要去修改光猫内部别的配置:

IPTV单线复用-6

光猫超级账号的设置页面:点“网络-宽带设置-VLAN绑定”,点“添加”按钮,在新增的“用户侧端口”栏勾选”网口1“,”用户侧VLAN“栏输入:41(与”绑定WAN连接名称“栏的VID_41对应),点:保存”。同理,再添加用户侧43对应光猫侧VID_43:

IPTV单线复用-7

光猫端的设置就全部完成了。

3、路由器端设置

TL-WDR4310路由器为例,它刚好有一个WAN口,4个LAN口,可以满足我们完全还原光猫接口功能的要求。

1)先设置交换机Switch

IPTV单线复用-8

eth0.1对应LAN,就关联了LAN1;eth0.41对应WAN,建立internet口;eth0.43对应通过WAN连接LAN2、LAN3、LAN4,用来建立iptv口。

2)新增internet及iptv口

删除原wan及wan6口;

新增internet口:协议PPPoe(注:跟自己所用的宽带上网协议一致,桥接模式就选PPPoe,路由模式就选DHCP Client),eth0.41,防火墙挂wan区域;

新增iptv口:协议DHCP Client,eth0.43,防火墙可以另行创建,也可挂wan区域。

IPTV单线复用-9

LAN1接电脑,上网测试正常;LAN2、LAN3、LAN4任一口接IPTV机顶盒测试,都正常。

若想拓宽IPTV使用范围,可参考利用OpenWrt系统拓宽IPTV使用范围一文进行更进一步设置。

实现IPTV组播信号播放的特殊拓扑结构

这次我们要讲解实现IPTV组播信号播放的特殊拓扑结构,不同于《利用OpenWrt系统拓宽IPTV使用范围》一文中虚拟WAN口的配置方法,这些拓扑结构要显得更加简单些,但也有一个缺点:就是只支持组播地址的播放,不支持单播地址的播放,不过将组播地址通过udpxy代理出来的单播地址还是支持的。

首先我们还是来看一下常规的IPTV接线图:

实现IPTV组播信号播放的特殊拓扑结构-1

>>  一旦我们通过抓包、对数据包分析获得组播地址,最简单的方法就是抛开IPTV机顶盒,让PC电脑网线直接与ITV口(三选一),在PC播放器例如Potplayer上输入组播地址,或者双击m3u格式组播列表文件由Potplayer打开,就可以观看IPTV直播节目了。

实现IPTV组播信号播放的特殊拓扑结构-2

>>  但是按上图连接PC无法连接Internet,因此我们还是加上OpenWrt路由器,让WAN口连接光猫千兆口连接Internet,让LAN口连接ITV。但是不同于上次将其中的一个LAN口设置成VWAN口,然后通过DHCP鉴权的方式获取ITV信号,这次连接ITV的LAN口不做改变,还是继续保持与其它LAN口一样的桥接模式,即保持LAN口功能不变。

实现IPTV组播信号播放的特殊拓扑结构-3

按上图连接后,PC端播放器打开组播地址并不能正常播放,这时我们需要开启LAN口的IGMP snooping功能:

实现IPTV组播信号播放的特殊拓扑结构-4

勾选“Enable IGMP snooping”,保存并应用后使之生效,再用PC的Potplayer播放器测试一下(以CCTV1HD为例,rtp://233.50.201.118:5140):

实现IPTV组播信号播放的特殊拓扑结构-5

若需支持无线播放,仍需增加udpxy代理服务,将组播地址变更为单播地址;支持个别播放器播放直播地址列表文件(m3u),安装DLNA服务(xupnpd);支持远程播放,设置DDNS和端口转发,具体可参考《利用OpenWrt系统拓宽IPTV使用范围》一文,这里不再展开。

>>  若对Internet连接没有要求,还有一种较简单的拓扑结构也可以实现有线及无线对组播信号播放的要求:

实现IPTV组播信号播放的特殊拓扑结构-6

按上图连接以后,我们需要通过设置让组播信号能够在LAN口与WAN口之间自由传输:安装igmpproxy服务,并对/etc/config/igmpproxy文件进行相应的设置,有线连接就可以正常播放组播地址了。其它像无线及远程支持,只要按以前讲解的方法设置OK,播放就没有问题,这里不再累述。

利用OpenWrt系统拓宽IPTV使用范围

前面我们讲了如何利用OpenWrt系统来抓取IPTV数据包,又在应用技巧及工具栏目讲解了如何分析IPTV数据包并提取有用的信息,这次我们要来讲解如何利用OpenWrt系统拓宽IPTV使用范围,从使用传统的IPTV机顶盒拓展到PC、网络机顶盒、平板电脑、手机等终端,同时还要拓宽其使用环境:既支持有线连接也支持无线连接;既支持在局域网内部使用也支持远程访问使用;既支持组播信号播放也支持单播信号播放。

通常IPTV网络电视须通过IPTV机顶盒才能播放:

利用OpenWrt系统拓宽IPTV使用范围-1

但只要有OpenWrt路由器,通过一些并不算太复杂的设置,我们就可以将IPTV服务拓宽到更多的使用环境下:

利用OpenWrt系统拓宽IPTV使用范围-2

这次我们先讲解最常见的方法,即在路由器上设置虚拟WAN口,来代替IPTV机顶盒取得IPTV信号。该方法既适用组播信号,也适用单播信号,但是采用单播信号传输时设置要稍微复杂一点。

下面以TL-WDR4310路由器为例,说明一下具体的设置过程,与光猫的连接方式如上图,WAN口与光猫千兆口连接以获取Internet信号,LAN1口设置成VWAN,既虚拟WAN口与光猫的ITV口(注:一般光猫中的两个百兆口都设置成与ITV口桥接模式,因此这三个口可以任选一个连接)。

1、设置交换机Switch

利用OpenWrt系统拓宽IPTV使用范围-3

接口eth0.1对应桥接的LAN2、LAN3、LAN4口;eth0.2对应WAN口;eth0.3对应LAN1口即新增的VWAN口。

2、新增IPTV接口

因为涉及DHCP鉴权,因此通过Luci界面无法完成所有的配置工作,因此我们选择在network配置文档上直接修改:

vim /etc/config/network

# 在打开的编辑界面,新增如下语句

config interface 'iptv'
    option ifname 'eth0.3'
    option proto 'dhcp'
    option metric '20'
    option delegate '0'
    option macaddr 'xx:xx:xx:xx:xx:xx'
    option hostname 'XXXXXXXXXXXXXXXXXXXXXXXXX'
    option sendopts '0x3c:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

macaddr处填上抓包所用的IPTV机顶盒的MAC值;hostname处填上分析DHCP鉴权相关信息时获取的Option 12,是一组明码字符串;sendopts处因为我所在的地方只需要验证Option 60的值,所以只要将分析时获取的Option 60,即一长串16进制密码字符填入即可。如果你所在的地方,需要认证Option 61的值,则需要在上面的语句中再增加一句(注:十进制60对应16进制的0x3c;十进制61对应16进制的0x3d):

option sendopts ‘0x3d:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY’

同理有其它需要DHCP鉴权的值,可以按上面的方法一并加入。

如果原WAN口未设置网关跃点metric值,需要在上面的network文档的wan接口上添加如下语句(注:数值可以自行设定,只要与iptv接口的metric不同即可):

option metric ’10’

设置完成后,重启一下network服务:

service network restart

3、安装igmpproxy,让组播信号可以在LAN与IPTV之间传输
opkg update
opkg install igmpproxy

安装完成后,还需要进行设置,但目前igmpproxy程序尚未开发Luci设置界面,因此我们还是直接修改配置文件:

vim /etc/config/igmpproxy

# 修改文件如下

config igmpproxy
    option quickleave 1
#	option verbose [0-3](none, minimal[default], more, maximum)

config phyint
    option network iptv
    option zone iptv
    option direction upstream
    list altnet 0.0.0.0/0

config phyint
    option network lan
    option zone lan
    option direction downstream

再添加igmp在iptv通道防火墙畅行:

vim /etc/config/firewall

# 在打开的文档最后添加:

config rule
        option target 'ACCEPT'
        option src 'iptv'
        option name 'Allow_IGMP'
        option proto 'IGMP'

系统重启后,我们可以验证一下igmpproxy是否已正常运行:

# 先重启一下igmpproxy服务

service igmpproxy restart
vim /var/etc/igmpproxy.conf

# 若igmpproxy运行正常,则文档内容如下:

quickleave

phyint eth0.3 upstream ratelimit 0 threshold 1
    altnet 0.0.0.0/0

phyint br-lan downstream ratelimit 0 threshold 1
4、设置防火墙

>> 防火墙设置可以在Luci界面下进行:

利用OpenWrt系统拓宽IPTV使用范围-4

>> 也可以直接修改防火墙文件

vim /etc/config/firewall

# 在打开的编辑文档里,添加如下语句:

config zone
    option network 'iptv'
    option forward 'REJECT'
    option name 'iptv'
    option output 'ACCEPT'
    option masq '1'
    option input 'REJECT'

config forwarding
    option dest 'iptv'
    option src 'lan'

设置完成后,重启一下firewall服务:

service firewall restart

通过以上这几步的设置,IPTV接口就可以获取鉴权服务器返回的IP地址了:

利用OpenWrt系统拓宽IPTV使用范围-5

这时,有线连接的PC、网络机顶盒等已可正常播放IPTV的组播信号了(以当地的CCTV2HD为例:rtp://233.50.201.119:5140)。

利用OpenWrt系统拓宽IPTV使用范围-6

5、支持单播信号播放

要想让单播信号可以正常播放,还必须使一些特殊的IP地址也通过IPTV接口进行DHCP鉴权,具体涉及哪些地址,在对IPTV包分析的文章中有详细说明,这里不再展开。这里主要讲如何在OpenWrt系统里使用和设置这些IP地址,实现方法有很多种,但我这里只讲最简单的方法:就是在系统自启配置文档中添加上相关的路由表及信号路径。

>> 可以在Luci界面里直接添加:

利用OpenWrt系统拓宽IPTV使用范围-7

>> 也可以在自启配置文档中直接添加:

vim /etc/rc.local

# 在exit 0之前,添加如下语句

ip rule flush table 100
ip route flush table 100
ip rule add from 192.168.1.0/24 to 122.229.17.0/24 table 100 
ip rule add from 192.168.1.0/24 to 115.233.41.0/24 table 100
ip rule add from 192.168.1.0/24 to 220.191.136.0/24 table 100
ip rule add from 192.168.1.0/24 to 115.233.200.0/24 table 100
ip route add default via 10.242.96.1 dev eth0.3 table 100

保存后,重启一下系统。然后用播放器打开单播地址测试一下(以CCTV3HD为例:rtsp://115.233.41.137/PLTV/88888913/224/3221229136/10000100000000060000000005809121_0.smil):

利用OpenWrt系统拓宽IPTV使用范围-8

对于单播地址,有线连接测试OK,那么无线连接肯定也OK,你可以用网络机顶盒、手机、平板电脑测试一下。

但对于组播地址,有线测试OK,但是用无线却无法播放,还需要更进一步配置,通过代理服务将组播地址转换成单播地址。

6、组播地址转单播地址,以便无线连接设备播放
opkg update

opkg install udpxy luci-app-udpxy

在udpxy的Luci界面设置如下:

利用OpenWrt系统拓宽IPTV使用范围-9

在Bind IP/Interface栏输入:192.168.1.1(LAN地址);Port:4022(缺省值);Source IP/Interface:eth0.3,即IPTV的接口。

在浏览器上输入:http://192.168.1.1:4022/status,可以看到udpxy服务的具体运行情况:

利用OpenWrt系统拓宽IPTV使用范围-10

在防火墙上,增加允许udpxy信号通行的语句:

vim /etc/config/firewall

# 增加如下语句,保证udpxy信号顺利传输

config rule
        option target 'ACCEPT'
        option src 'iptv'
        option proto 'udp'
        option name 'Allow-UDP-udpxy'
        option dest_ip '224.0.0.0/4'

设置完成后,可以将原先的组播地址,例如CCTV1HD:rtp://233.50.201.118:5140,修改为:http://192.168.1.1:4022/udp/233.50.201.118:5140,就可以在无线连接的设备上进行播放了。

另外,对于一些有线连接时组播地址无法播放的情况(注:多半是播放器不支持组播信号播放),也可以用udpxy代理服务方式进行播放。

而且通过设置DDNS及端口转发,你稍微修改一下地址就可以实现在远程设备上进行播放的目的。例如,在远程播放CCTV1HD时,可以将地址修改为:http://123.red-yellow.net:4022/udp/233.50.201.118:5140,这样你公司的电脑也可以播放家里的IPTV直播节目了。

7、IPTV DLNA服务的实现

大多数的视频播放器支持m3u或txt格式的视频列表文件,但也有一些播放器不支持,特别是苹果IOS系统的设备,但每次输入直播地址进行变台操作又太复杂了,这时我们需要用到DLNA服务。

opkg update

opkg install xupnpd

在浏览器上输入:http://192.168.1.1:4044,就可以配置xupnpd:

利用OpenWrt系统拓宽IPTV使用范围-11

在PlayLists上传入m3u格式的列表文件,支持DLNA服务的播放器就可以播放列表里的所有视频了。

8、原IPTV机顶盒支持

将原IPTV机顶盒与路由器的LAN口连接,按以上的设置步骤,不需要新增别的设置内容,就可以在显示器或电视上享受直播、回看及点播节目了。

当然,利用OpenWrt系统拓宽IPTV使用范围的方法有很多种,以上我们只是讲解了最常见的一种解决方案,应该说也是一种高效、彻底地的解决方法。后续我们还会讲解利用其它拓扑结构来拓宽IPTV使用范围的方法,以及单线复用模式下的IPTV拓展

 

IPTV包分析

上次我们讲了如何抓取IPTV包,这次我们就来分析一下这些数据包。我们希望可以通过对IPTV包分析来获取下面这些非常有用的信息:1)与DHCP鉴权相关的信息;2)IPTV直播源地址;3)IPTV回看源地址。这次的分析过程我们都将在Windows系统下完成,而且主要会用到WiresharkNotepad++这两个软件工具,如果你的电脑还没有安装这两个软件的话,你需要事先下载并安装好。

注:这次的分析是有一定的局限性的,因为不同的地方、不同的IPTV提供商其“握手”方式、直播源格式等都可能不一样,所以这次分析主要还是提供一种方法,具体实践时你还需要根据自己的实际情况加以灵活应用。

一、获取与DHCP鉴权相关的信息

1、先用Wireshark程序打开前面抓取的IPTV包:

IPTV包分析-1

2、筛选DHCP协议,找出IPTV机顶盒与光猫第一次“握手”时的信息:

IPTV包分析-2

3、选中“DHCP Request”这一行,即“握手”时两条红行之间的这一行,然后点开”Dynamic Host Configuration Protocol (Request)”这一行的下拉箭头,就会发现DHCP鉴权时的所有信息都在里面了:

IPTV包分析-3

4、新建一个空的文本文档,然后将下面的一些信息复制后保存起来,以备后用。

1)Client MAC Address,即机顶盒的MAC地址;

2)DHCP Server Identifier,即Option 54,例如:10.242.96.1;

3)Host Name,即Option 12,是一串很长的字符串,通常是明文传输,所以直接记录就行;

4)Vendor class identifier,即Option 60,是以密码形式传输的一长数据串。选中“Vendor class identifier: ”这一行,点击鼠标右键,点“复制”,再点“…as Hex Stream”复制内容后在文档中保存。

注:有些地方的DHCP”握手“的方式可能更复杂,还会涉及Option 59、Option 61等等,如有必要也一并把它们都记录下来。

5、用IPTV单播地址播放时,我们还必须获取其它需要DHCP鉴权的IP地址。

通常来说,拿到以上DHCP鉴权信息后,我们只要在路由器上做好相应设置,就可以抛开IPTV机顶盒设备,在其它像电脑、手机、网络机顶盒上播放IPTV的组播信号了。但是播放IPTV单播地址时,仅仅以上信息还是不够的,我们还必须获取其它需要DHCP鉴权的IP地址,否则会因为交互过程无法完成,导致单播信号无法传输。

IPTV包分析-4

如何提取其它的IP地址?如上图所示,筛选http协议,然后在列表中选择记录那些与IPTV机顶盒有信息交互的服务端IP地址,例如:122.229.17.132;220.191.136.23;115.233.41.139;115.233.200.101等,统统记录下来,在后续的实际应用中我们设置时要用到这些地址。

二、获取IPTV直播源地址

1、先利用Wireshark程序提取出IPTV直播源列表信息

Wireshark打开IPTV数据包后,按http协议先进行筛选,然后点”查找“按钮,即像放大镜一样的一个图标,在新出现的查找栏中选择”分组列表“、”宽窄“、”字符串“,再输入”getchannellist“进行查找:

IPTV包分析-5

我们再选中从服务器返回机顶盒信息的那一行,即定位行的下一行,然后选中程序中间显示界面栏中的”Line-based text data: text/html (915 lines)“这一行,点击鼠标右键,点击”显示分组字节…“,我们就可以看到完整的直播源列表信息了(注:需要将显示码从“ACSII”变更为”UTF-8“,否则中文字符无法正常显示):

IPTV包分析-6

将所有与直播源列表相关的信息选中后复制备用。

2、通过Notepad++程序整理出IPTV直播源地址

打开Notepad++程序,新建一个文档窗口,然后将上面复制的内容粘贴到新文档中:

IPTV包分析-7

我们可以仔细来看一下里面的直播源信息,它还是非常规整的,有频道名称,有频道地址。频道地址里面igmp://后面显示的是组播地址,rtsp://后面显示的是单播地址,有很长一段,但我们只需要前面到.smil为止的信息即可:

IPTV包分析-8

因为信息都非常规整,所以我们可以采用正则表达式的方法非常方便的提取到所需要的内容。目前直播源地址文件通常采用m3u和txt两种格式,所以我们在提取时也会分别生成这两种文件。

1)提取IPTV组播地址

在Notepad++程序界面点击”替换(R)…”按钮,采用如下正则表达式

^\s+<script>.+?ChannelName=”(.+?)”,.+?ChannelURL=”igmp://(.+?)\|rtsp://.+?”.+?</script>\s+$

>> 需要生成m3u格式直播源文件,则替换成:

#EXTINF:-1,\1\nrtp://\2

IPTV包分析-9

>> 需要生成txt格式直播源文件,则替换成:

\1,rtp://\2

注:细心的朋友可能已经发现,我把原直播源信息中的组播地址从“igmp://”换成了“rtp://”,原因很简单因为在实际测试发现直接用igmp://无法播放,用rtp://则可以,而不同的地方需要换的协议可能还不一样,大家可以多试试就会发现正确的了。

2)提取IPTV单播地址

在Notepad++程序界面点击”替换(R)…”按钮,采用如下正则表达式

^\s+<script>.+?ChannelName=”(.+?)”,.+?ChannelURL=”.+?\|(.+?)\?rrsip=.+?”.+?</script>\s+$

>> 需要生成m3u格式直播源文件,则替换成:

#EXTINF:-1,\1\n\2

>> 需要生成txt格式直播源文件,则替换成:

\1,\2

IPTV包分析-10

提取完成后,分别按不同格式进行保存即可使用。

三、获取IPTV回看源地址

目前的IPTV机顶盒除了看直播节目外,大多也提供了回看功能,像电信和移动,都提供一星期的节目回看功能,那我们怎么来获取IPTV的回看地址呢?首先你需要在抓取IPTV包时,在机顶盒上操作一下你想提取回看源地址的节目的回看功能,例如你想提取CCTV1的回看源地址,你可以在抓取时回看一下CCTV1的节目。如果你想提取多个节目的回看源地址,那你就需要操作多个节目的回看功能。

抓取包完成后,我们还是用Wireshark程序先把包文件打开。按http协议先筛选,然后在查找栏中选择”分组列表“、”宽窄“、”字符串“,再输入”get_tvod_info“进行查找:

IPTV包分析-11

在定位信息的下一行,即服务器返回的信息中就包含回看源的地址。选中返回信息行,然后在程序中间界面里选择“Line-based text data: text/html (20 lines)”这一行,然后鼠标点击右键,点“显示分组字节…”就可以看到具体的信息了:

IPTV包分析-12

稍微看一下我们就会明白,抓取时我们曾经回看了CCTV1的新闻30分节目,其回看源地址mediaUrl后面是很长一串字符,但其实我们只需要取前面的部分就可以了,例如:“rtsp://115.233.41.137/TVOD/88888913/224/3221228078/10000100000000060000000002460690_0.smil?playseek=20201205120000-20201205123600”。而且在实际应用中,你可以将playseek后面的时间端随意设置,当然要符合在一星期之内,例如你想回看2020年12月13日CCTV1的早上6:15到6:30的节目,你只需要将回看源地址修改为:“rtsp://115.233.41.137/TVOD/88888913/224/3221228078/10000100000000060000000002460690_0.smil?playseek=20201213061500-20201213063000“。在Potplayer播放器中输入以上地址(不含双引号),测试回看节目完全正常!!

IPTV包分析-13

再点“查找”可以到下一个回看源,同样的方法可以提取其回看源地址(回看节目是CCTV2的第一时间):

IPTV包分析-14

继续点“查找”又可以到下一个回看源,重复上面的操作,一直到所有的回看源地址提取完成。

如果想在电脑端方便回看或录制节目,建议可以编写一个小程序,通过选择回看的电台,回看的时间段,就可以直接实施播放及录制节目的功能。

20201226补充:经过多个回看源的提取,再与单播地址对照,发现还是有规律可循的,不需要一个一个回看源提取,当然有些电台只有直播源没有回看源,到时直接删除或跳过即可。现在就以CCTV1HD为例,来说明一下回看源地址与单播地址之间的关系:

单播地址:rtsp://115.233.41.137/PLTV/88888913/224/3221228078/10000100000000060000000002460690_0.smil

回看源地址(20201226早上6点-7点):

rtsp://115.233.41.137/TVOD/88888913/224/3221228078/10000100000000060000000002460690_0.smil?playseek=20201226060000-20201226070000

回看地址只需将单播地址中PLTV目录修改为TVOD,再加上回播的时间端,其它数据与单播地址是完全一致的。

OpenWrt系统下的IPTV抓包方法

IPTV抓包的实现方法有很多种,像网络抓包神器(Throwing Star LAN Tap)加Wireshark实现方法,像高档交换机的端口镜像设置再加上Wireshark实现方法等等。但这次我们主要还是讲在OpenWrt系统下的IPTV抓包方法,你只要有一台刷了OpenWrt系统的路由器,不需要再添加别的设备就可以轻松实现IPTV的抓包过程。

方法一、端口镜像设置加Wireshark

采用这种方法,你需要先有一台拥有端口镜像功能的路由器,一般有多个LAN口的路由器都能符合要求,我们这次讲解以TP-Link的TL-WDR4310为例展开:

1、先来看一下接线图:

OpenWrt系统下的IPTV抓包方法-1

图中,ITV源信号与LAN1口连接,IPTV机顶盒(目标信号)与LAN2口连接,LAN4口接PC。

2、路由器设置

在PC浏览器的路由器Luci界面,点“Network – Switch”进入交换机设置界面:

OpenWrt系统下的IPTV抓包方法-2

勾选“Enable mirroring of incoming packets”和“Enable mirroring of outgoing packets”,设置将进出镜像数据一起抓取:

OpenWrt系统下的IPTV抓包方法-3

然后根据自己实际的接线情况,来选择镜像源端口Mirror source port,我这里选LAN2,即IPTV机顶盒端;选择镜像监控端口Mirror monitor port,即PC端,我这里选LAN4,点“Save & Apply”按钮使设置生效。

3、在PC端使用Wireshark程序抓包

在PC端运行Wireshark程序:

OpenWrt系统下的IPTV抓包方法-4

双击“以太网”行,进入监控及数据包的抓取:

OpenWrt系统下的IPTV抓包方法-5

将IPTV机顶盒重新启动一下,机顶盒和ITV之间交互的数据包就完全被Wireshark抓取了出来,后续点红色停止按钮,再将相应数据文件保存即可。

方法二、应用Tcpdump软件

与Wireshark一样,Tcpdump也是一个非常有名的抓包软件,它被移植到了多种不同的平台上,这里面就包括OpenWrt系统,我们可以在opkg应用仓库中直接安装OpenWrt版的Tcpdump。继续以TP-Link的TL-WDR4310为例:

1、先安装tcpdump应用

opkg update
opkg install tcpdump

2、配置tcpdump的抓包环境

先按下图连接好相关接线:

OpenWrt系统下的IPTV抓包方法-6

因为tcpdump只能抓取wan(eth0.2)及br-lan(eth0.1)的数据包,所以我们无法像方法一那样,将ITV源信号及机顶盒目标信号都放在LAN口上,而是将ITV源信号与路由器的WAN口连接,机顶盒目标信号与LAN口相连。但这样连接以后,在路由器缺省配置模式下,IPTV组播信号是无法在WAN口与LAN口之间传递的。

最简单的解决方法就是建立wan和br-lan的桥接模式,这样既能保证IPTV组播信号的正常传递,又能用tcpdump对传输数据包进行抓取。

在PC浏览器的路由器Luci界面,点”Network – Interfaces”,点LAN接口所在行的“Edit”按钮进入编辑状态:

OpenWrt系统下的IPTV抓包方法-7

在”Physical Settings“界面下的Interface栏中增加eth0.2接口,点”Save”保存,然后再点“Save & Apply”使配置生效,桥接模式就设置好了,为安全起见建议将系统重启一下。

3、然后再回到路由器shell界面,运行tcpdump抓包程序:

tcpdump -i eth0.2 -s 0 -w /mnt/sda1/tcpdump/iptv.cap

回车运行,路由器就会进入wan(eth0.2)的监控及抓包进程,将IPTV机顶盒重启一下(注:抓取完成就在shell界面按ctrl+c停止相应进程),相应的数据包就会自动保存到我们指定的文件里。

OpenWrt系统下的IPTV抓包方法-8

4、接下来我们就可以对抓取下来的iptv.cap文件进行分析了。具体分析的过程在后面的文章中再详细展开。

总的来说,方法二比方法一的应用范围要更广一些,像一些没有端口镜像功能的路由器,例如WR720N这种只有两口的路由器、还有软路由等,就没有办法用方法一,但都可以用方法二来实现IPTV的抓包功能。不过从配置上来说,方法一要稍微简单一点,所以说两种方法是各有好处,在实际使用中大家可以灵活应用。