树莓派通过物联网照顾宠物龟
作者:半点闲
撰写:2015年4月16日
博客:blog.csdn.net/cg_i
邮箱:[email protected]
资源:http://pan.baidu.com/s/1i3INVal(文中提到的资源)
写在前面的
春节期间,到公园游玩,看门前有卖各种小宠物的商贩,见其中巴西红耳龟很是可爱,就买了一对。因是第一次饲养这种爬行类动物,虽是很小心但还是有一只不幸夭折,在感到惋惜痛心的同时,也想能否用什么更好的办法照顾这仅剩下的另一只小龟。
在这种想法的推动下,借助手里拥有的树莓派,其强大的处理能力,加上当下新兴起的物联网平台,初步做了一个集图像监控、水温监控、定时开启水质过虑泵、晒背灯。搭建起一个智能照顾小龟的保姆,也为我分担了不少精力。即使我身在外地也可以通过手机,实时了解小龟的生存状态。
现将,整个软、硬件搭建过程整理出来和大家分享。当然RaspberryPi有着巨大的潜力,如果,你要监控、感知离开你后的卧室,有没有外星人造访过。或者在上班的路上用手机通过网络控制你办公司的咖啡机,在你进入办公司前为你冲上一杯香醇的咖啡等等。希望能通过这篇文章获得一些启示,那我将倍感荣幸(注:如果你像我一样有无比旺盛的好奇心,通过网址:http://www.yeelink.net/devices/19605现在你就可以去看看我饲养的“八大王”)。
(图-0八大王)
读者对象
我假设阅读这篇文章的读者,了解如何配置和保护树莓派,对Linux有一定的了解,会编写一些脚本或代码,至于文章中提到的硬件安装,读者大可放心(注:将继电器用于市电开关时要特别小心),这些硬件都已模块化,你只需要简单的把它们连接到你的树莓派即可。
至此,再没其它要求,现在开始你的物联网之旅。
第一章 硬件菜谱
- 硬件及费用清单
名称 |
费用(元) |
备注 |
RaspberryPi(B)Rev2.0 |
315 |
当时英国代购比较贵,现在最新的RPi2(B)也就200多。 |
PiFace扩展板 |
240 |
为了保护树莓派不受接线错误的伤害,也是为了利用它的两个继电器开关。 |
EP-N8508GS迷你USB无线网卡 |
40 |
用于联网。 |
USB摄像头 |
-- |
旧机器上拆的,用于采集图像。 |
RisymDS18B2水温探头 |
5.9 |
用于监测饲养缸水温。 |
DHT11温湿度传感器模块 |
6.1 |
用于监测室内温与相对湿度。 |
方形玻璃带晒台龟缸 |
50 |
龟龟的豪华别墅。 |
爬虫UVB陶瓷灯罩 |
29 |
用于给乌龟晒背增加钙质与活性。 |
UVA+UVB3.0太阳卤素灯25W |
18 |
|
低水位瀑布式过滤泵 |
35 |
用于净化水质。 |
其它 |
577.36 |
各种书籍、饲料、龟药及配件 |
- 初识硬件
1、RaspberryPi
我手中的这块RaspberryPi(B)Rev2.0购于2013年4月23日,配备一枚700MHz博通出产的ARM架构BCM2835处理器,512MB内存,使用SD卡当作储存媒体,且拥有一个Ethernet,两个USB接口,以及HDMI(支持声音输出)和RCA端子输出支援。操作系统使用的是RaspberryPi基金会所推荐的RaspbianWheezy
Linux操作系统详细信息如下:
$uname -a
Linux raspberrypi3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux
请确保操作系统版本和我的一样或高于它。因为,实际操作中发现低于这个版本的系统不能正常驱动我手中的RisymDS18B2水温探头。可从官网下载最新的操作系统镜像https://www.raspberrypi.org/downloads/或访问我的百度网盘下载和我同版本的系统镜像(2015-02-16-raspbian-wheezy.zip)文件。
(图-1RaspberryPi(B)Rev2.0)
在RaspberryPi的一边有一组双排排针,这些排针被称为GPIO(General
Purpose Input/Outpu,通用输入/输出)接口,通过这个接口,可以把Pi与其它电子硬件设备相连,就像使用USB接口那样。
(图1-1 GPIO引脚)
如果你像我一样是一个真正的初学者,初看到这些引脚时,是不是心生畏惧?这里你大可宽心,我们只需要连接GPI04、GPI07两个引脚,再无其它。至于,其它引脚作用(注:细心的你也许还发现有些GPIO引脚用圆圈起来,里面有其它数字,这些引脚都是有特殊用途的。)有机会再给大家介绍或者你也可以通过网络搜索获取这方面更多的资料。
2、PiFace
PiFace数字接口板可以从曼彻斯特大学计算机学院获得,网址是:http://shop.openlx.org.uk/。这块板子能提供8个GPI0输入和8个GPI0输出,,可是这些输入输出都不是树莓派自己的GPI0线,它们是由另一块芯片(ULN2803A)提供的,这块芯片是通过树莓派的一个串行外部设备接口(注:SPI)所控制的。
直接连接在树莓派上的GPIO线是很脆弱的。PiFace上的输入可以直接处理5V的信号,而且这个板子允许输出电流高达200mA,这两项指标还都有些很宽的容限。
它的输出还带有LED,当前的版本的板子上有8个,还有4个输入上带了按钮开关,不过,对于我这个作品最有用的,是其中两个输出上接了很强大的继电器,这使得理论上可以开关高达10A的强大电流。PiFace还有自己的Python模块,使得扩展板在使用时更加简易。
最初,我是想通过它来连接传感器,但当我收到货后,才发现购买的这个附件,除了安全说明和包装盒,再无其它,官方文档也不是那么好获得,通过网络搜索得到很多误导性的网页,终于得到它《PiFace数字快速入门指南》正如字面上所说一样。我疯狂的从网上查阅相关书籍,只要发现书籍章节目录中有PiFace字眼,就果断下单购买。然后,无比焦急的等待快递上门,这个过程让我觉得像过了几个世纪那样漫长。书籍到手后又无比失望,这类书籍里大费笔墨的都是一些,能从网上搜索我们所共知的,而我真正需要的,是一些支言片语一笔带过的普及性的介绍。我仍然在黑暗中。
幸运的是,有上手指南,给出了一些有限的应用例子,加之前几年有学习Perl语言的经历“每个问题都有许多解决方式(TMTOWTDI)”,在这里我只使用了它的继电器,其它传感器直连到树莓派的GPIO插座上(注:如果你熟悉这块扩展版,请一定不吝赐教),也许待以后再充分的利用它。
(图-2 PiFace-1)
3、DS18B20、DHT11传感器
Risym DS18B20数字温度传感器,采用不锈钢防水型探头,有VCC(红色电源)、 黄色(DATA信号)、黑色(GND地线)3根输出引线,3.0V~5.5V供电、9~12位可调分辨率、感温范围-55℃~+125℃(引线最高只能承受85℃左右)。特点:接线简单系统内置支持,无需编程即可获取传感温度数据。
DHT11温湿度传感器模块,可以检测周围环境的湿度和温度,湿度测量范围:20%-95%(0度-50度范围)湿度测量误差:+-5%,温度测量范围:0度-50度温度测量误差:+-2度,采用小块PCB板3线式接口,VCC(电源)、DATA(信号)、GND(地线),工作电压3.3V~5V,带电源指示灯(红色)。特点:应用广泛实例众多,本文直接采用国外大牛针对它编写的C代码,几乎不需要编程。
(图-3 各种传感器)
以上,是针对本文核心的几个硬件做了一下简单的介绍,其它,如USB无线网卡、USB摄像头,都能在Linux下识别免驱,安装相对简单,就不花费笔墨叙述了。
- 硬件连接
1、PiFace安装到RaspberryPi上,注意力度对准GPIO插槽即可。
(图-4 PiFace安装)
2、Risym DS18B20、DHT11传感器连接。
首先,借用别人的电路图。
(图-5 Risym DS18B20连接图)
如上电路图所未,它是将传感器直接到RaspberryPi上,而我手中的RaspberryPi上方已经安装上了PiFace,在前文里我也说过,对于PiFace我了解甚少,我借鉴了上图的接线方式,将DS18B20信号线直接到RaspberryPi的GPIO4口上,将VCC、GND线接到了PiFace相对应的接口上,看到这里你一定很好奇,为何我这样连接?实话告诉你吧!这里没有什么高深的原因,这样连接我可以少焊接两根线,一来手笨、二来接电源线毕竟会有一定的风险,如果出错PiFace的保护电路会起到保护RaspberryPi的作用,大不了PiFace损坏。
DHT11模块也参考了上面给出的电路图,只是它的信号(DATA)线连接的是GPIO7引脚,电源(VCC)、地线(GND)串联到PiFace对应接口上。
(图-6 DS18B20和DHT11传感器接线)
3.继电器连接用于市电开关。
继电器通过放大微弱信号来生成强信号,继电器像开关一样,它优于开关之处就在于,继电器可以不必人工控制。不夸张的说,我们生活在充满继电器的世界里,继电器改变了世界。
通过操控继电器就能控制市电,使得自动化开关设备成为可能。继电器有三个端口:常开(NomalOpen)、公共(Common)、常闭(Nomal Close)。常开,正常状态为开路(开路即断开的),通电后关闭(连通),公共端,顾名思义,常闭,正常状态为闭合(连通状态),通电后断开(开路)。
因此,市电是没有正负极之分,零线或火线可任意接在常开或常闭,是否有电流通过取决于当前低电端给予的电平情况。
这里为了能同时开关过滤泵、晒背灯,也为了将来需要进一步扩展控制更多设备(注:安全起见应特别谨慎,充分考虑市电输入/输出线路和继电器负载能力)。我将家里的一个插线排做了改造,将继电器输出线路直连接到插线排上(注:参见图-6)。
(图-7 继电器端口接线)
到这里,针对我的这个作品,硬件设备的连接已经全部完成(注:是不是很简单)。我使用了一些奇怪的接线方式,是我对所掌握的知识匮乏的一种妥协,实属无奈。希望,不会对你产生困扰。毕竟,我的目地是想通过这个案例启发到你,你可以根据你实际拥有的硬件资源选择合理的接线方式。
硬件是计算机的驱体,而软件是计算机的灵魂。要想上述硬件能如愿工作,还需要对它注入灵魂。下面,就带大家进入它的世界,和它的灵魂对话。
第二章 软件菜谱
一、更新RaspberryPi
登录到你的RaspberryPi在命令行输入以下命令:
sudoapt-get update
sudo apt-get upgrade
当系统提示输入“Y”,等待系统执行这需要一定的时间。
二、SPI启用
PiFace需要启用SPI引脚的RaspberryPi上才能运行,这是很简单的事情,要启用SPI,你须通过raspi-config配置工具开启,在命令行输入以下命令:
sudo raspi-config
菜单中选择8 Advanced Options (高级设置),选择A5 SPI 是否默认启动SPI内核驱动,设置为“YES”,选择“OK”,然后“Finish”。
三、安装PiFace数字Python模块
前面我们已将RaspberryPi更新到最新版本,现在只须通过apt-get就可以轻松地安装PiFace数码软件。在命令行输入以下命令:
sudo
apt-getinstall python3-pifacedigital-emulator
sudo apt-get installpython3-pifacedigital-scratch-handler
提示时输入“Y”。
成功安装后,sudo
reboot你的RaspberryPi。
四、测试你的PiFace
为了测试所有PiFace软件已经安装并RaspberryPi设置正确,在命令行输入以下命令:
python3/usr/share/doc/python3-pifacedigitalio/examples/blink.py
或Python2:
python/usr/share/doc/python-pifacedigitalio/examples/blink.py
按Ctrl+C关闭LED灯闪烁程序。
五、DS18B20温度探头测试
在命令行输入以下命令:
sudo modprobew1-gpio
sudo modprobe w1-therm
cd /sys/bus/w1/devices/
ls
显示结果:
28-00000494cb79
w1_bus_master1
这个是传感器的序列号(注:并不是都一样,如果有多个传感器会有多个28-xxx对应文件),看到它证明系统已正确识别设备。在命令行输入以下命令,查看当前温度:
cd28-00000494cb79
cat w1_slave
显示结果:
70 01 4b 46 7f ff 10 10 e1 : crc=e1 YES
70 01 4b 46 7f ff 10 10 e1 t=23000
这个传感器不是很稳定,系统如果读取到消息,会在返回消息的第一行末尾加上YES或NO,如果是YES,那第二行紧接着就是温度,以1/1000摄氏度为单位,所以在上面的例子中,实际读取到的温度是23摄氏度(注:下面给出的脚本自动完成这个工作)。
将以下两条命令添加到/etc/rc.local这个启动脚本里(注:在exit 0这行之上写),这样每次启动都会自动加载w1模块了。
sudo modprobew1-gpio
sudo modprobe w1-therm
六、DHT11温湿度传感器测试
这里我直接使用某国外大牛针对它读取信息的C代码(注:为何不用呢?)代码是开源的。我的RaspberryPi它采用Broadcom
BCM2835(CPU,GPU, DSP, and SDRAM)芯片。所以读取GPIO口需要到网址:http://www.open.com.au/mikem/bcm2835/index.html获取最新的BCM2835
C语言库,下载、编译和安装。在命令行输入以下命令:
wgethttp://www.open.com.au/mikem/bcm2835/bcm2835-1.36.tar.gz
tar -zxvf bcm2835-1.36.tar.gz
cd bcm2835-1.36
./configure
make
sudo make install
获取DHT11/DHT22温湿度程序:
cd
/home/pi
git clonehttps://github.com/dohkoos/Raspberry-Pi-Code.git
cd Raspberry-Pi-Code/DHT22
make
sudo ./dht 11 7(注:数据接口接在第7针脚)
DHT11和时序之间很紧密的,执行命令同样也占用时序。所以,并不是每次执行完命令都能读出数据,多执行几次就可以了(注:后面给出的脚本自动完成这个动作)。
七、USB摄像头图像采集测试
我使用是支持UVC的摄像头,在Linux下免驱支持,正确插入到RaspberryPiUSB接口,在命令行输入以下命令:
ls
/dev/video0
video0(注:系统正确识别才有此文件,如有多个摄像头被识别会有多个videoX文件)
安装抓图软件fswebcam:
sudoapt-get install
fswebcam
提示时输入“Y”。安装完毕,在命令行输入以下命令:
fswebcam
-d /dev/video0 -r320x240 photo.jpg
查看生成的文件,正常。则,摄像头测试通过。
八、获取RaspberryPi CPU温度
参见下文,直接给出相应的脚本代码,这里就不再叙述了。
九、PiFace继电器测试
参见下文,直接给出相应的Python代码,这里就不再叙述了。
通过上面一系统软件的安装与测试,本文作品必需的软、硬件环境已经完全具备了,接下来就是将这些硬件采集的数据分类、有序的传到物联网对应接口,使您的设备迈进物联网时代。
第三章 烹饪之法
一、接入Yeelink平台
Yeeklink作为一个免费开放的公共物联网接入平台,目的是为服务所有的爱好者和开发者,使传感器数据的接入、存储和展现变得轻松简单。限于篇幅你可以访问网址:http://www.yeelink.net/developer/doc/11按官方给出的教程和例子,逐步注册、添加设备、添加传感器等,这里就不多加叙述了。
二、传感数据物联网接口脚本
开始之前,因为RaspberryPi用SD卡当做硬盘,为了避免擦写过于频繁,我在内存中开辟一小块区域专门存放运行的中间文件(注:程序执行效率也提高了)。
先在/mnt下新建一个目录。
sudomkdir
/mnt/yeelink
然后把这个文件夹挂进内存里。
sudo
mount –t tmpfs –o size=5mtmpfs /mnt/yeelink
这句命令将/mnt/yeelink挂载内存,上限是5M,不用就不占空间,更多的资料请搜一下Linux相关的tmpfs。挂进内存之后可以用df命令查看。
测试成功后让RaspberryPi每次启动自动把文件夹挂载进内存,编辑/etc/fstab在最后一行增加:
tmpfs /mnt/yeelink
tmpfssize=5m 0 0
保存。
再将下面给出获取、上传传感器数据到云端的代码,创建、保存到用户主目录bin目录下(注:如/home/pi/bin这个目录需要你自已创建)。也可以直接从我给出的网盘里下载我编辑好的脚本文件(注:bin.rar将U-ApiKey及传感器APIURL地址修改为你自己的)。
- yeelink_cam.sh
############################################################################################ # 作者:半点闲 # 时间:2015-4-23 # 博客:blog.csdn.net/cg_i # 邮箱:[email protected] # 文件:yeelink_cam.sh # 功能:摄像头抓图 # 硬件:RaspberryPi(B)Ver2.0 # 系统:Linux raspberrypi 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux # 满足:apt-get install fswebcam ############################################################################################ #!/usr/bash sudo fswebcam -d /dev/video0 -r 320x240 --bottom-banner --title "blog.csdn.net/cg_i" /mnt/yeelink/photo.jpg curl --request POST --data-binary @"/mnt/yeelink/photo.jpg" --header "U-ApiKey:xxxxxxxx" http://axxxxxxxxxxxxxxxxxxxxxxxxxxxx sudo rm /mnt/yeelink/photo.jpg
- yeelink_dht.sh
############################################################################################ # 作者:半点闲 # 时间:2015-4-24 # 博客:blog.csdn.net/cg_i # 邮箱:[email protected] # 文件:yeelink_dht.sh # 功能:DHT11温度器读取室温与相对湿度 # 硬件:RaspberryPi(B)Ver2.0 # 系统:Linux raspberrypi 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux # 满足:暂无 ############################################################################################ #!/bin/bash until sudo dht 11 7 | grep 'Temp' > /mnt/yeelink/dht.tmp do : done #获取室内温度与相对湿度 TEMP=`sed 's/Temp = \([0-9]*\).*/\1/' /mnt/yeelink/dht.tmp` HUM=`sed 's/.* Hum = \([0-9]*\).*/\1/' /mnt/yeelink/dht.tmp` curl --request POST --data-binary "{\"value\":$TEMP}" --header "U-ApiKey:xxxxxxxxxxxxxxx" http://xxxxxxxxxxxxxxxxxxxxxxxxxxx curl --request POST --data-binary "{\"value\":$HUM}" --header "U-ApiKey:xxxxxxxxxxxxxxxx" http://xxxxxxxxxxxxxxxxxxxxxxxxxxx sudo rm /mnt/yeelink/dht.tmp
- yeelink_bs18b20.sh
############################################################################################ # 作者:半点闲 # 时间:2015-4-23 # 博客:blog.csdn.net/cg_i # 邮箱:[email protected] # 文件:yeelink_bs18b20.sh # 功能:读取BS18B20水温传感器值 # 硬件:RaspberryPi(B)Ver2.0 # 系统:Linux raspberrypi 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux # 满足:启用modprobe w1-gpio,modprobe w1-therm模块 ############################################################################################ #!/bin/sh TEMP=`cat /sys/bus/w1/devices/28-000006dd4882/w1_slave | tr -d '\n'` echo $TEMP | grep 'YES' if [ $? -eq 0 ] then TEMP=`echo $TEMP | sed 's/.*t=\(.*$\)/\1/'` TEMP=`expr $TEMP / 1000` curl --request POST --data-binary "{\"value\":$TEMP}" --header "U-ApiKey:xxxxxxxxxxxxxxxxxxx" http://xxxxxxxxxxxxxxxxxxxxxxxxx fi ############################################################################################ # 作者:半点闲 # 时间:2015-4-23 # 博客:blog.csdn.net/cg_i # 邮箱:[email protected] # 文件:yeelink_bs18b20.sh # 功能:读取BS18B20水温传感器值 # 硬件:RaspberryPi(B)Ver2.0 # 系统:Linux raspberrypi 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux # 满足:启用modprobe w1-gpio,modprobe w1-therm模块 ############################################################################################ #!/bin/sh TEMP=`cat /sys/bus/w1/devices/28-000006dd4882/w1_slave | tr -d '\n'` echo $TEMP | grep 'YES' if [ $? -eq 0 ] then TEMP=`echo $TEMP | sed 's/.*t=\(.*$\)/\1/'` TEMP=`expr $TEMP / 1000` curl --request POST --data-binary "{\"value\":$TEMP}" --header "U-ApiKey:xxxxxxxxxxxxxxxxxxx" <a target=_blank href="http://xxxxxxxxxxxxxxxxxxxxxxxxx">http://xxxxxxxxxxxxxxxxxxxxxxxxx</a> fi
- yeelink_cpu.sh
############################################################################################ # 作者:半点闲 # 时间:2015-4-23 # 博客:blog.csdn.net/cg_i # 邮箱:[email protected] # 文件:yeelink_cpu.sh # 功能:读取树莓派CPU温度 # 硬件:RaspberryPi(B)Ver2.0 # 系统:Linux raspberrypi 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux # 满足:暂无 ############################################################################################ #!/bin/bash CPU_TEMP=`cat /sys/class/thermal/thermal_zone0/temp` CPU_TEMP=`expr $CPU_TEMP / 1000` curl --request POST --data-binary "{\"value\":$CPU_TEMP}" --header "U-ApiKey:xxxxxxxxxxxxxxxxxxxxxx" <a target=_blank href="http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</a>
- yeelink_turn.py
#!/usr/bin/env python # -*- coding:utf-8 -*- ############################################################################################ # 作者:半点闲 # 时间:2015-4-26 # 博客:blog.csdn.net/cg_i # 邮箱:[email protected] # 文件:yeelink_turn.py # 参数:on 开启;off 关闭 # 功能:开关PiFace断电器1 # 硬件:RaspberryPi(B)Ver2.0 + PiFace1 # 系统:Linux raspberrypi 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux # 满足:Python安装pifacedigitalio模块 ############################################################################################ import sys,exceptions,pifacedigitalio as p try: param = sys.argv[1] if param == 'on': p.init() p.digital_write(0,1) elif param == 'off': p.init() p.digital_write(0,0) except IndexError: print('Error:Lack of necessary parameters:on or off')
将上面给出的脚本创建并保存在bin目录后,再将以下命令添加到/etc/rc.local这个启动脚本里(注:在exit
0这行之上写),这样每次启动都会自动将脚本复制到我开辟的内存区域内。
sudo cp/home/pi/bin/yeelink_cam.sh
/mnt/yeelink
sudo cp /home/pi/bin/yeelink_cpu.sh/mnt/yeelink
sudo cp /home/pi/bin/yeelink_dht.sh/mnt/yeelink
sudo cp /home/pi/bin/yeelink_bs18b20.sh/mnt/yeelink
sudo cp /home/pi/bin/yeelink_turn.py/mnt/yeelink
- 自动化上传数据
最后通过corn按照我约定的时间执行上述脚本(注:限于篇幅,有关cron具体信息可通过网络搜索来获取),在命令行输入以下命令:
sudo crontab
–e
*/1 * * * * /mnt/yeelink_cpu.sh(注:每1分种上传一次获取的CPU温度)
*/2 * * * * /mnt/yeelink_cam.sh(注:每2分钟上传一次摄像头抓取的图像)
*/5 * * * * /mnt/yeelink_bs18b20.sh(注:每5分钟上传一次获取的水温)
*/10 * * * * /mnt/yeelink_dht.sh(注:每10分钟上传一次获取的室内温湿度)
30 6 * * * /mnt/yeelink_turn.py on(注:每天6:30开启过虑水泵、晒背灯)
0 11 * * * /mnt/yeelink_turn.py off(注:每天11:00关闭过虑水泵、晒背灯)
写在后面的
终于,对于我的这个作品暂时划上了句号。我并不擅长写作,对于这篇文章,我已然倾尽了全力。通过写作发现,要想把脑子里的想法,通过文字表述明白,是一件极具挑战的事情。在文中我不止一次的说过:“我是一个真正的初学者!”在计算机的世界里,我只是一爱捣鼓里面东西的孩子,撰写这篇文档,只是想送给像我这样对计算机刚刚有点兴趣的小伙伴们一点启发(注:我也期待通过观看这篇文章的大牛们慷慨的建议)。
最后,这就是工具论:有了一点点正确的知识,你就可以做出任何东西来。