` 本帖最后由 wufan931111 于 2014-9-17 16:32 编辑
1,研究与选择方案:
我们公司的电子门锁的开门设备是通过一个带弹簧的开关(门内,类似墙面上开灯的开关)控制的,按下开关就能打开门,按下开关的时候能够听到明显的继电器闭合的声音,因此,趁着没人的时候我把开关拆开看了一下,证实的确是通过触电控制的一个继电器。按下开关时,两个金属触电接触,继电器动作,门打开。继电器在动作后延时4秒左右恢复。这样看来,硬件层面的开门实现就非常简单了:跨接一个数字继电器,要开门时,通过电平信号控制继电器闭合并保持2秒即可。
但要实现远程控制,必须设置一台可以通过TCP或是HTTP协议接受用户命令,并能控制开门硬件(继电器)的设备。最初考虑过Arduino,作为一个开源的硬件平台,Arduino的电平输出非常易于控制和操作。而且Arduino也有RJ45或是无线的接口模块。不过在查看了Arduino的无线模块的操作方式之后,我发现要让Arduino接入一个WPA加密的无线网络并实现一个web server并不容易。所以最终还是选择了树莓派(Raspberry Pi)。
树莓派与Arduino的设计目标不同,它主要是一个超小的PC主机。树莓派本身提供了若干个GPIO的输出口(3.3V),用来操作数字继电器倒是没有问题。
请特别注意:由于GPIO的引脚是没有保护电路的,不当的硬件连接很可能会导致树莓派烧掉,连接和操作时务必慎重。在确定方案时,我个人使用了面包板,电阻和二极管等电子元件搭建实验电路,并反复用万用表验证过输出电压和电流(主要是对树莓派的每个脚的输出不确定)。
操作步骤:
在树莓派上安装操作系统,论坛有很多教学安装的,这里就没说了。
配置网络树莓派本身的网络支持已经比较完善,通过有线方式接入的话,只要直接插入网线就可。考虑到无线方式部署比较方便,我采用的是无线连接的方式。 2,插入网卡后,修改网卡的配置信息: - [AppleScript] 纯文本查看 复制代码
- sudo vi /etc/network/interfaces
复制代码
修改其中与wlan0相关的部分: - [AppleScript] 纯文本查看 复制代码
- auto lo
- iface lo inet loopback
- iface eth0 inet dhcp
- allow-hotplug wlan0
- iface wlan0 inet static
- wpa-ssid 你要连接的wifi ssid
- wpa-psk 你的wpa连接密码
- address 192.168.0.20 # 设定的静态IP地址
- netmask 255.255.255.0 # 网络掩码
- gateway 192.168.0.1 # 网关
- network 192.168.0.0 # 网络地址
- #wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
- iface default inet dhcp
复制代码
里我选择了使用静态地址,原因是我们不希望开门的服务器地址老是变来边去。设置好网络并确认能够正常工作后,就可以着手进行下一个步骤了。 3,连接硬件 下图是具体的连接方式,注意连在RPI上的三条线,白色(电源)、黑色(GND)、灰色(信号)分别连接在RPI GPIO的2号、6号与7号针脚上。
编写代码 RPI的操作系统缺省已经有一个Python的安装了。因此,我们可以使用Python来设置Web Server并控制开门的硬件设备。 开门硬件控制相关代码: - [AppleScript] 纯文本查看 复制代码
- import RPi.GPIO as GPIO
- import time
- PORT = 7
- def reset():
- GPIO.setmode(GPIO.BOARD)
- GPIO.setup(PORT, GPIO.IN)
- def initcontroller():
- GPIO.setmode(GPIO.BOARD)
- GPIO.setup(PORT, GPIO.OUT)
- GPIO.output(PORT, True)
- def opendoor():
- GPIO.setup(PORT, GPIO.OUT)
- GPIO.output(PORT, False)
- time.sleep(2)
- GPIO.output(PORT, True)
复制代码
- [AppleScript] 纯文本查看 复制代码
- import web
- from web import form
- import doorop
- import requests
- render = web.template.render('templates/')
- urls = (
- '/', 'index'
- )
- app = web.application(urls, globals())
- myform = form.Form(
- form.Textbox("username"),
- form.Textbox("password", form.notnull)
- )
- #initial door controller
- doorop.initcontroller()
- def verifyuser(uname, passwd):
- #这里是验证用户的逻辑,我是用公司的LDAP服务器进行验证的
- #验证成功返回True,否则返回False
- pass
- class index:
- def GET(self):
- form = myform()
- return render.formtest(form)
- def POST(self):
- form = myform()
- if not form.validates():
- return render.formtest(form)
- else:
- if(verifyuser(form['username'].value, form['password'].value)):
- doorop.opendoor()
- return "door opened!"
- else:
- return "Username/Password invalid!"
- if __name__ == "__main__":
- web.internalerror = web.debugerror
- app.run()
复制代码
这样就在RPI上建立了一个web server,用HTTP POST方式输入正确的用户名和口令就能实现开门。
为了更方便地应用远程开门(不过肯定是用手机开门更cool),可以编写iOS或是Android上运行的开门应用。当然,由于开门只需要发送一个HTTP POST请求,直接写成一个可以在Mac/Linux/Win下运行的命令行也可以。
|