探索黑客技术攻防,实战研究与安全创新

导航菜单

树莓派实现智能防盗

 总体架构

1.png

网站前台

2.png

设备记录图

演示地址 :demo       账号:admin       密码:password

3.png

设备列表图

本系统,全自动全方位监控,开启后不需要其他操作,人体感应器检测到人之后就会像后台记录一条数据,所以可以根据图片更加直观的显示,当然在有些时间段我们自己会触发警报,但是如果在你出去后,也有记录,那么代表很可能遭到物理入侵了。那么我们树莓派可以检测除了本人出现的时间段,可以给予相应的警报,发送邮件,微信等。

树莓派JAVA程序


4.png

设备图

红外传感器检测到人之后,树莓派会打开摄像头录像,之后会插入相应的记录到网站,并且上传视频到云备份,目前打算采用讯飞云存储,之后再做迁移到百度云盘,2T容量不要浪费了。将树莓派装到一个小盒子里用wifi和充电宝就完美了,也可以藏在隐蔽的地方。

5.png

名为SmartHome.jar的文件,代码可以在后面下载。有log.log日志文件,error.log日志文件。img是用来放视频文件和图片,抓拍存放小偷的视频的资料,晚上会自动上传到百度云空间。

6.png

运行后的程序并没有什么提示,因为会记录相应的错误日志和log到文件中。

7.png

百度云盘上的文件,我百度云可以存放2T视频,所以我很长一段时间不需要清空。

8.png

为啥和上面的文件名称不一样,嘻嘻,那是因为我经过转码以后上传的,这样手机还是电脑都可以直接看了。根据网站记录的名称,可以观看相应的视频。给个栗子除了可以这么用以外,我还怎么用:

9.png

我设置了一个地址用来传送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的状态: 关");  

            }  

        }  

    }