家庭监控,⽹络摄像头(OpenWRT平台下Mjpg-Streamer+Ngrok实现⽅案)
2017/07这篇博⽂的⽬的是从头开始记录如何搭建⼀个家庭监控环境,那我这⾥会将思路与可能遇到的问题都⼀⼀说明,本篇博客⼗分适合电⼦,计算机,通信专业本科⽣的第⼀个团队合作项⽬,实现简单,没有什么代码需要⾃⼰写,都是利⽤已有的开源项⽬完成,未来的可扩展性丰富。所有涉及到的软件部分都会放在中。
注:每⼀天的材料部分都不会重复之前提到过的材料。⾏内代码部分会有灰⾊背景。
This is not just another simple howto, please make your own note and try to think about each and every sentences. Keep asking why and how. Furthermore, you may adjust the pace of learning to fit your own plan. Day1 to Day7 are 7 logically independent sections, which doesn’t mean that you need to finish Day1 in just one day.
花销:硬件部分摄像头和wifi模块基本上100RMB能搞定,⾄于VPS部分看⼤家个⼈的情况。
(2020-07-06)
3年过去了,感谢⼤家在此期间的阅读,点赞和引⽤。我也在去年底结束了⼈⽣中的第⼀份⼯作。这篇博⽂写在⼯作之前,⾥⾯记录的家庭监控是当初为了照顾⽣病需要长期住院的外公⽽开发的。还记得外公
对我说的最后两个字是“⼯作”,现在也算还了⼀⼩部分愿。特别想在这再说⼀句,在今年疫情的⼤背景下,希望⼤家继续秉持⾃⼰的信念和初⼼,流⽔不争先,争其滔滔不绝。当然也许注意锻炼⾝体哈!我们学电⼦计算机的孩⼦就是容易长时间在电脑前久坐。
Day 1
材料
1. ⼀个⽀持刷写 OpenWRT 的路由器,推荐 TP-link WR703N,原因价格便宜(某宝上⼆⼿仅需 30 RMB 左右),在下⾯的教程当
中称其为 wifi 模块。
2. ⼀台 Linux 系统电脑,教程使⽤ Ubuntu 系统。
3. ⼀根⽹线,⽤于连接 wifi 模块和电脑。
思路:利⽤ wifi 模块构建局域⽹(简称 AP 模式)
1. 这⼀步是所有后续的基础,⽬的在于熟悉 OpenWRT。OpenWRT 系统⾃带了⼀个部署在 19
2.168.1.1:80 上的⽹页服务
器,Luci。它和⽇常路由器中的登录管理页⾯是同⼀个东西,通过它我们可以很⽅便得设置路由器的不同功能和参数。但在本项⽬中,我并不推荐使⽤ Luci 执⾏后续相关的操作。原因有⼆,其⼀它占据空间很⼤!我们选⽤的 TP-link WR703N 的 SquashFS 只有 4 MB,因此每⼀个 bit 都很关键,所以⼀个本质是 UI 的软件对于本项⽬的开发者没有太⼤的必要。其⼆,对于像我们这样抱着学习⽬的的开发者来说,图形化⽤户界⾯可能会导致⼀定程度的依赖性,Luci 能完成的东西越多,我们⾃⼰能掌握到的东西就越少。2. AP 模式是以 wifi 模块为路由器,使⽤ DHCP 协议动态分配 ip 给所有加⼊的设备。所以第⼆点就是熟悉计算机⽹络的最基本内容,
短的现代诗如何以⼀个路由器的视⾓看局域⽹。⾸先路由器作为主⾓分配 ip,此时默认包括路由器在内的所有设备都在同⼀个⽹段当中。这⼀点虽然看似也⼀点不重要,但在实际操作中我多次因为没有考虑到两个通信的设备是否在同⼀⽹段中,⽽导致通信失败。问题出现后,我还在到处查看是不是⽹线没插好,电源是不是不稳定之类的问题。所以希望⼤家不会重蹈覆辙,再次强调⼀下,wifi 模块和电脑⽤⽹线直连时保证能通信的⼤前提是:电脑 ip 所处的⽹段必须和 wifi 模块相同!
步骤
1. 刷机。向 wifi 模块刷⼊不死引导以及 OpenWRT,具体步骤请看我的另⼀篇博⽂《》。OpenWRT
官⽅给出 15.05 版本的针对 TP-
Link WR703N 的固件可以在官⽹的,在⽹页⾥搜索关键字 703,然后你就可以发现名为 openwrt-15.05-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin 的官⽅固件。有了官⽅固件之后就继续参照《》继续完成刷机!
2. wifi 模块连电脑。⽤⽹线将电脑和 wifi 模块连接起来,设置电脑的ip和⼦⽹掩码为192.168.1.2/24。这样就保证电脑和 wifi 模块在
同⼀⽹段下(因为 OpenWRT 默认的 ip ⽹段就是 192.168.1.XXX,如果之前有更改过默认的 ip 记得给电脑也配上同⽹段的 ip 即可),可以通过⽹线直接通信。Ubuntu 系统设置 ip 很简单,在插上⽹线后,电脑的⽹线接⼝(RJ45⼝)的数据灯闪烁就代表链接成功,接着在 Ubuntu 系统设置->⽹络中到有线连接,修改 ipv4 选项卡下⾯的 ip 即可,更加具体的操作可以参考。
3. 登录 OpenWRT 系统。Ubuntu 电脑打开 terminal,快捷键是ctrl+alt+t。如果已经⽤ ssh 命令登录过 OpenWRT 系统的就直接ssh
root@192.168.1.1(OpenWRT 刷机后默认的 ip 为 192.168.1.1),然后输⼊密码即可。如果是第⼀次登录 OpenWRT 系统,那么需要先telnet 192.168.1.1⽤不加密⽅式登录系统,登录之后键⼊passw
d命令给 root ⽤户设置密码,设置好密码之后就必须要⽤ ssh 的⽅式登录。这⼀步使⽤ ssh ⽅式登录是为了给我们未来客制化的 wifi 模块提供多⼀层的安全保障,毕竟没有密码的根⽤户对于Linux ⽽⾔是极其危险的。
4. 使能 wifi。利⽤cd /etc/config/命令进⼊到 /etc/config/ ⽬录下,通过ls -altF查看这个⽬录下的所有⽂件,我们使能 wifi 功能需要操
作到的⽂件是 wireless。这是⼀个默认存在于 OpenWRT ⽂件系统中的重要配置⽂件。直接vim wireless开始编辑。vim 是⼀款历史久远的命令⾏⽂本编辑器,⾥⾯的操作习惯和我们当下主流的编辑器相差甚远,需要⼀定时间的习惯和适应,如果对 vim 还不太熟悉的同学,我推荐在这⾥可以先暂停⼀下本项⽬进度,学习台湾同学编写⼀篇 vim 。vim 很难⼀下⼦掌握,但是我们不得不⽤它,因为在 TP-link WR703N 的 OpenWRT 中并没有给我们提供其他更好的编辑器。还有⼀个原因,它虽然“⽼”,但是特别优秀,快捷键的设置考虑到了⽅⽅⾯⾯,简⽽⾔之就是开发者的利器!了解它的基本内容对于嵌⼊式开发⼯作⼤有裨益。在看台湾同学的⽂章时,如果你觉得已经知道怎么在 vim 当中编写⼀个⽂档,那就回过来继续我们的教程吧。编辑 wireless 的内容其实很简单,⾥⾯有⼀⾏option disabled “1”,我们所有要做的内容就是把它删除。除此之外,你还可以在 wifi-iface 部分看到我们的 AP 模式下默认的ssid 和登录密码。如果需要更换⼀个具有个性的 ssid 和⾃⼰专属的登陆密码也只需要在这⾥修改即可。保存退出之后,⽤wifi命令重新启动 wifi 功能,不久之后你就可以在电脑上搜索到
⼀个名字是 OpenWRT 的 wifi 热点啦!恭喜,这是我们跨向成功的第⼀⼩步!
5. ⽤你⼿上的设备去连接这个热点试试吧!连上之后就代表第⼀天的内容结束了!
进阶
如果你是⼀名和我⼀样好奇⼼很重⽽且⼗分谨慎的开发者,并且觉得有必要粗浅了解 /etc/config/wireless ⾥存在的众多陌⽣设置,那么请看官⽅的!This could not harm you. Read it, my geek friend.
Day 2
张默牛萌萌材料
1. 客制化OpenWRT固件⼯具:ImageBuilder,单击下载。解压在你喜欢的本地⽬录当中,我们称解压之后的ImageBuilder的⽬录为A
⽬录,⾥⾯应该包含有:include, packages, scripts, target等等的⽬录以及.config, .targetinfo, Makefile, rules.mk等⽂件。A⽬录就是我们之后经常要在⾥⾯进⾏客制化OpenWRT的场所了。
2. ⽀持mjpg格式输出的摄像头⼀枚,某宝上可以买到,40rmb左右。另外如果⾃⼰家有⽼的摄像头也可以拿来看看是不是⽀持mjpg输
出。请看这个,学习⼀下如何⽤linux查看usb摄像头的基本信息,看看你的⽼摄像头是不是⽀持mjpg。这⾥必需要⽀持mjpg的原因是,⾸先jpg格式的图⽚是压缩过的图⽚,⽤的压缩算法⼜很经典,所以⽤mjpg传输图像要省流量,但是mjpg的压缩是需要很⼤计算量的!所以如果摄像头不⽀持mjpg的输出,只能靠wifi模块的CPU去进⾏格式转换,那就呵呵了,算死这个CPU,真的会算爆它的,因为我们选⽤的设备额定⼯作温度为0到40摄⽒度。所以安全起见,实在没有mjpg的摄像头,那还是先停⼀下实战,买⼀个再说。
思路:在局域⽹中开启mjpg-streamer服务,并⽤其他加⼊该局域⽹的设备查看live video
1. Mjpg-Streamer是⼀个开源项⽬,其基本功能是从⼀个uvc内核摄像头读取内容,然后将它推送到本地的8080端⼝上⾯。就是⼀个
本地的视频服务器。它的项⽬⽹站在。OpenWRT的软件源中也已经对它有了移植,所以我们只需要从OpenWRT的官⽅⽹站上到对应15.05版本OpenWRT系统的Mjpg-Streamer,然后下载安装即可。除此之外还需要⼀些其他的软件包去⽀持它的运⾏:kmod-usb-core, kmod-usb2, kmod-video-core, kmod-video-uvc, libpthread, libjpeg。前4个是linux的系统内核⽂件,相当于usb接⼝和摄像头的驱动;
后2个是库⽂件,⽤与提供多线程和jpeg图⽚格式⽀持。
2. 在第⼀天的内容当中提到过,由于这次选⽤的wifi模块的Flash(SquashFS)特别⼩!所以我们在安装Mjpg-Streamer的⽅法会很特
别,不会是⽤OpenWRT默认的opkg这款软件进⾏安装下载,因为opkg的安装⽅式会消耗很多不必要的Flash空间,其直接结果就是装了⼏个额外的软件之后就没有剩余空间。所以我们采⽤客制化OpenWRT固件的⽅式,将需要的软件直接写到OpenWRT的固件当中,这样极其节省空间,⽽且还可以删去和本次项⽬没有关系的⼀些默认安装的软件,以达到系统精简的⽬的。
步骤
1. 客制化OpenWRT固件。请先看我的这篇,去⼤致了解⼀下客制化固件,⾥⾯有推荐官⽅的wiki⽂档和其他⼀些准备内容,记得看完
之后再接下去操作!如上所述。为了安装mjpg-streamer和之后的⼀些内容,我们需要将⼀些不需要的软件包删除,并安装必要的包。⾸先在本地电脑上打开terminal,然后cd A/,进⼊到A⽬录下。输⼊make image PROFILE=TLWR703 PACKAGES="-ppp -ppp-mod-pppoe -kmod-ppp -kmod-pppoe -kmod-pppox -kmod-nf-ipt6 -kmod-nf-contrack6 -kmod-ipv6 -ip6tables -odhcp6c -libip6tc -kmod-ipv6 -
firewall -iptables -odhcpc -kmod-ipt-conntrack -kmod-ipt-core -kmod-ipt-nat -kmod-nf-conntrack -kmod-nf-ipt -kmod-nf-nat -kmod-nf-nathelper -uhttpd -uhttpd-mod-ubus kmod-video-core kmod-video-uvc libpthread libjpeg mjpg-streamer",之后程序就会⾃动进⾏客制化固件的过程了,视⽹络情况不同,客制化的花费时间也不同,我这⾥⽤中国移动的20MB宽带⼏分钟就完成了。⾄于命令为什么这么写,就在官⽅wiki中有解释,所以这部分基础内容不重复了,再强调⼀下为了扎实的前进,花时间去看⼀下我的博⽂和⾥⾯所提到的wiki。值得注意的是在ImageBuilder当中默认的软件⾥就不带luci,所以我们不⽤额外删除它咯!当然Day 1当中提到的官⽅固件⾥⾯是默认包括luci的。2. 刷机。将第⼀步当中A⽬录下的bin/ar71xx/下⽣成的固件,‘openwrt-15.05-ar71xx-generic-tl-wr703n-v1-squashfs-
factory’,刷⼊我们的wifi模块,⽅法就是第⼀天中提到的刷机⽅式,《》。这⾥可能会有疑问,为什么不⼀步到位直接让我们刷最终版本的固件呢?因为重复的练习,会让我们更加清楚⾃⼰在做什么。毕竟这篇博⽂的⽬的不仅仅是⼀篇HowTo,更加重要的是对问题的理解和处理问题的⽅式。好了这⾥就提⼀个新的需要注意的细节,在《》的初级办法当中我们实际上⽤的sysupgrade /tmp/openwrt-
15.05.1-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin这条命令进⾏刷机,那有⼼的⼩伙伴也许会有担⼼说我们Day 1当中更改了⼀下
系统的设置,刷机之后这个设置还会保留吗?答案:会保留。在sysupgrade命令当中如果加⼊-n这个选项,那么⼀些的设置都会被reset,所以当我们发现⾃⼰改着改着系统不知道哪⾥被玩坏了之后,请记得在刷机的时候⽤带n选项的sysupgrade就可以了,这⾥给⼀个例⼦: sysupgrade -n /tmp/openwrt-15.05.1-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin。所以,我们默认是保留设置的,Day 1当中已经给OpenWRT的root⽤户设置了密码,开启了ssh登录⽅式,以及AP模式,在刷机完成之后,这⼀切都会被保留,是不是很赞!
3. 将⽤户设备连⼊wifi模块提供的热点。⽤⼿机或者电脑连接,wifi模块的热点中。这样我们的⽤户设备会⾃动的被分配到⼀个ip,这个
ip和wifi模块的ip属于同⼀个⽹段。我们假设是⽤电脑连接的,打开terminal,⽤ssh root@192.168.1.1链接到wifi模块。如果做到这⾥你发现搜不到wifi模块的热点,不⽤着急,我们这⾥的⽬的只是为了取得wifi模块的控制,所以像Day 1当中那样⽤有线⽅式连接也完全没问题,连上之后再去查问题所在吧。
4. 启动mjpg-streamer服务。⽤vim /etc/config/mjpg-streamer修改mjpg-streamer配置⽂件,到⾥⾯的enabled设置,将0改为1即
可。然后记得看⼀下这个配置⽂件⾥⾯的其他内容,都是很直⽩的内容,注意fps,led是可以删除的
设置内容,⽬前不需要指定帧率和led灯的只是状态。记住默认的帐号密码和端⼝之后保存退出。然后启动服务:/etc/init.d/mjpg-streamer start,以及确保OpenWRT开机⾃启动/etc/init.d/mjpg-streamer enable。
5. 将准备好的mjpg摄像头插到wifi模块的usb接⼝上。
6. 电脑上打开浏览器,⽹址栏输⼊192.168.1.1:8080。默认mjpg-streamer的服务器是架设在8080端⼝上的。你就可以看到实时的
监控画⾯咯!恭喜!
进阶
信息论⾥有⼀个基本的常识就是,从单⼀信源获得信息的时候必将会有信息的丢失,说成⽩话就是咱们听⽼师上课绝对不会全部记住⽼师讲了什么。所以我们每次的进阶内容还是很推荐⼤家阅读的,从多个途径对同⼀主题了解,事倍功倍。
第⼆天的进阶内容是让你熟悉⼀下。请⾃⼰发现它⾥⾯补充说明的内容哦!因为我也是参照它学习的呢!
党校培训学习总结学有余⼒的geek们,可以看⼀下关于我们wifi模块的⼀些硬件信息:在,,还有。
Day 3
材料
思路:wifi模块加⼊wifi热点(简称STA模式)
1. 因为最终我们的⽹络摄像头会部署在⼀个有wifi的环境当中,⽐如家⾥,办公室,等等。所以我们必须了解如何将wifi模块连⼊这些热
点当中。其实有⼼的同学在第⼀天学习AP模式的时候看掉了进阶⾥⾯提到的/etc/config/wireless设置的话,对接下来我们需要完成的任务就不⾄于太陌⽣了。
2. 由于我们的wifi模块可以使⽤有线连接,也可以⽆线,⽆线⼜可以分成AP与STA,当然所以对于每⼀种接⼊模式我们都需要在⽹卡上
定义⼀个逻辑的⽹络接⼝,⽤于区分彼此。每⼀个逻辑⽹络接⼝中会定义这个⽹络接⼝的ip的分配⽅式,使⽤的物理接⼝,等等。这是OpenWRT⽹络设置的核⼼部分,具体的⽂件就是/etc/config/network。可见/etc/config/这个⽬录底下就是专门存放这种软件的设置⽂件,之后我们还
会学习到⼀个linux命令专门⽤来修改这个⽬录底下的⽂件。所以想要连接wifi那就必须先在network这个配置⽂件⾥⾯创建⼀个逻辑⽹络接⼝,并且标明这个⽹络接⼝的ip,dns之类的都是通过dhcp分配的,因为⼀般我们遇到的wifi热点都是⽤DHCP的,所以这⾥就不考虑特殊情况了。如果你的实验环境要求wifi热点的ip是静态的,那请看今天进阶部分的内容,会给⼀些参考资料供研究。
步骤
1. ssh连接wifi模块。当然我们这⾥选择⽤⽹线⽐较⽅便,因为如果⽤AP的话,等⼀下由于要更改wireless的设置,会重启wifi,这样大s电视剧
AP会在重启的时候⾃动断掉,这⾥推荐⽤有线连接。
2. 修改wireless。⽤vim /etc/config/wireless进⼊编辑界⾯,在最下⾯加⼊(其实在哪加都⼀样,只要是⾃成⼀段就好。你可以放在中间的
已有段落后⾯)
config wifi-iface station
option device radio0
option network wwan
深圳旅游景点大全介绍option mode sta
option ssid 你家的ssid
option encryption 对应的加密⽅式⼀般都是psk,psk2或wep
option key wifi密码
wifi-iface后⾯跟的station是我们给这个wifi-iface⼩节取得名字,⽅便以后修改。⾥⾯根据⾃家情况需要变化的部分是ssid,encryption 和key。其中不太明显的是encryption,加密⽅式。如果⾃⼰家新买⽆线路由器的时候有配置过路由器的同学会知道,wifi密码的加密⽅式也是分种类的,同⼀个字符串,⽐如‘12345678’,在不同的加密⽅式下⾯会有不同的验证密码的⼿段。⼀般⽆线路由器⾥⾯的加密⽅式会选⽤WPA或者WPA2⼜或是WEP。所以WPA对应的encryption是psk,WPA2对应的是psk2,WEP对应的是wep。除了这个各家各情况的三个部分,还有⼀个network,我们给的值是wwan,这就是思路⾥⾯提到的逻辑⽹络接⼝。我们在下⾯⼀步会
在/etc/config/network中写明这个接⼝,这⾥的wwan也是个名字,我们称接下来新建的逻辑⽹络接⼝名叫wwan。
3. 添加逻辑⽹络接⼝wwan。之前说了这么⾼⼤上的逻辑⽹络接⼝,⼜是核⼼咯,⼜是关键咯,其实设置起来超级超级简单。⽤vim
/etc/config/network打开编辑。同样在最下⾯,或者中间的某处添加:
config interface 'wwan'
option proto 'dhcp'
这样⼀来这个wwan逻辑接⼝就会调⽤OpenWRT⾥由busybox这款软件提供的udhcpc命令去接收并且设置⾃⼰的ip辣。
4. 重启wifi。wifi down 然后再wifi。之后使⽤ifconfig看⼀下各个⽹卡物理接⼝的具体情况,到wlan0这个⽹卡接⼝,注意哦,这⾥不
是逻辑接⼝了!⽽是实实在在的⽹卡!如果看到inet addr:192.168.0.10 Bcast:192.168.0.255 Mask:255.255.255.0这三个字段(ip,⼴播地址,⼦⽹掩码),你就可以确定已经连上wifi热点辣!
5. ⽤同样连上这个热点的⼿机,打开浏览器,⽹址栏输⼊你的wifi模块的ip:8080,就实现了在本地局域⽹⾥查看摄像头的视频咯,不⽤
再连上wifi模块提供的热点辣。⽐如我的wifi模块ip是192.168.0.10,那我就在⽹址栏⾥输⼊192.168.0.10:8080。不连wifi模块⾃⼰的OpenWRT热点,好处就是能⽤⼿机看摄像头的视频,⼜能聊。酷吧!下⼀个⼤⽬标就是想办法把我们假设的摄像头视频服务推到Internet上⾯,实现我在哪上⽹都能看到摄像头视频!
进阶
李白千年之狐就是关于network这个配置⽂件的说明。
Day 4
材料
1. ImageBuilder。为了实现wifi的检测功能,我们需要安装⼀个额外的程序包,wireless-tools,给客制化的OpenWRT。
思路:同时开启AP与STA模式
1. 细⼼的朋友可能已经发现在Day3的内容当中,我们在将wifi模块连到⼀个热点上的同时,OpenWRT这个wifi模块本⾝的热点也会同
时存在,所以我们已经把同时开启AP和STA的⽅法带到过了,这⾥着重提出⼀些细节上的问题。在此之前我想解释⼀下开启AP和STA的意图,当我们最后做完成品,这个带摄像头的wifi模块很可能会被放在天花板的⾓上或者⼀些平时够不到的地⽅,这样能保证镜头的视野。所以在这个时候如果我们相对wifi模块做⼀些更改的时候总不可能搬个梯⼦连着把⽹线连上去。于是乎AP模式就很有存在的必要了。那可能⼜有同学会问,我开着STA模式,不同样也可以ssh到wifi模块么!对的,没错,AP模式的作⽤可以被STA代替,但是如果家⾥的⽆线路由器不能正常⼯作了,或者改了⼀下密码,那STA模式不就会因为没有跟上它修改的新密码⽽失效。所以,说到底AP模式就是⼀个fail safe。⼀个⽅便我们操作的fail safe。
2. ⼀个棘⼿的问题,如果真的STA模式瘫痪了,可能原因有很多,最简单的就是wifi热点的密码换了。那么会有⼀个很尴尬的结果,AP
模式跟着失效。我的理解就是如果wireless当中的设置错误,wifi命令就会⼀直停在错误位置。因为没有查到wifi命令的帮助⽂件,所以只是个猜测。那如何保证我们的AP模式⼀直存在呢?到的⼀个替代,它的思路是先把只有AP模式的wireless⽂件以及AP+STA 模式的wireless⽂件保存在OpenWRT内部,默认的wireless也是这个AP+STA的设置。当每次开机的时候检测是否有连上wifi热点,即STA模式是否⼯作正常,如果正常那AP模式也就⾃然没有问题,如果⼯作异常,它会⾃动将wireless的内容换作只有AP模式的配置。相当于发现STA模式不好使的时候,断⼀下wifi模块的电源,然后等它重启
后的⾃动检测。这算是解决这个问题的⼀个很简单的思路,在下⾯步骤这节会具体实现。
步骤