总体架构
网站前台
设备记录图
演示地址 :demo 账号:admin 密码:password
设备列表图
本系统,全自动全方位监控,开启后不需要其他操作,人体感应器检测到人之后就会像后台记录一条数据,所以可以根据图片更加直观的显示,当然在有些时间段我们自己会触发警报,但是如果在你出去后,也有记录,那么代表很可能遭到物理入侵了。那么我们树莓派可以检测除了本人出现的时间段,可以给予相应的警报,发送邮件,微信等。
树莓派JAVA程序
设备图
红外传感器检测到人之后,树莓派会打开摄像头录像,之后会插入相应的记录到网站,并且上传视频到云备份,目前打算采用讯飞云存储,之后再做迁移到百度云盘,2T容量不要浪费了。将树莓派装到一个小盒子里用wifi和充电宝就完美了,也可以藏在隐蔽的地方。
名为SmartHome.jar的文件,代码可以在后面下载。有log.log日志文件,error.log日志文件。img是用来放视频文件和图片,抓拍存放小偷的视频的资料,晚上会自动上传到百度云空间。
运行后的程序并没有什么提示,因为会记录相应的错误日志和log到文件中。
百度云盘上的文件,我百度云可以存放2T视频,所以我很长一段时间不需要清空。
为啥和上面的文件名称不一样,嘻嘻,那是因为我经过转码以后上传的,这样手机还是电脑都可以直接看了。根据网站记录的名称,可以观看相应的视频。给个栗子除了可以这么用以外,我还怎么用:
我设置了一个地址用来传送json数据,然后贴上树莓派的栗子:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
/**
* 远程控制树莓派上的GPIO实例
* @author 亓根火柴
*/
public class ControlLed {
GpioController gpio;
GpioPinDigitalOutput pin;
public static void main(String s[]){
//下面的链接就是你在Yeelink的设备的状态URL
String urlStr = "";
ControlLed cl = new ControlLed();
cl.gpio = GpioFactory.getInstance();
cl.pin = cl.gpio.provisionDigitalOutputPin
(RaspiPin.GPIO_01, "LED", PinState.HIGH);
boolean current = cl.getStatus(urlStr);
cl.setLedStatus(current);
while(true){
try{
if(cl.getStatus(urlStr) != current){
current = cl.getStatus(urlStr);
cl.setLedStatus(current);
}
Thread.sleep(2000);
}catch(Exception e){e.printStackTrace();}
}
}
public boolean getStatus(String urlStr){
URL url;boolean on = false;
try {
url = new URL(urlStr);
HttpURLConnection con\= (HttpURLConnection)
url.openConnection();
conn.setRequestMethod("GET");
InputStream in = conn.getInputStream();
BufferedReader rd = new BufferedReader(new
InputStreamReader(in));
StringBuilder tempStr = new StringBuilder();
while (rd.read() != -1) {
tempStr.append(rd.readLine());
}
//System.out.print("--> 服务器上传感器的信息:");
String status = tempStr.substring
(tempStr.lastIndexOf(":")+1, tempStr.length()-1);
//System.out.println(status);
on = status.equals("1")? true:false;
//System.out.println(on);
return on;
} catch (IOException e) {
e.printStackTrace();
}return on;
}
public void setLedStatus(boolean sta){
if(sta){
pin.low();
//因为我的继电器是低电平有效
System.out.println("--> 更新GPIO的状态: 开");
}else {
pin.high();
System.out.println("--> 更新GPIO的状态: 关");
}
}
}