本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于 Raspberry Pi 1 Model A+ 的运动检测安全系统

发布时间:2021-11-14
分享到:

基于 Raspberry Pi 1 Model A+ 的运动检测安全系统

发布时间:2021-11-14
分享到:

树莓派安全系统---在Raspberry Pi上运行的简单安全系统。

特征:

  • 使用相机进行运动检测和照片捕捉。
  • 带有照片的移动通知。
  • 检测您何时在家并自动布防或撤防。
  • 可以使用Telegram远程禁用或查询。

要求
您将需要以下硬件:

  • 带摄像头接口的树莓派。我使用的是 A+ 型。
  • 树莓派相机模块。
  • 支持监控模式的 USB Wi-Fi。我使用了基于 RT5370 的适配器,它们很便宜,大约 6 欧元,而且很容易找到。

其他需求:

  • 一个电报机器人。它是免费且易于设置的。
  • 安装了 Raspbian 发行版。我用的是杰西精简版。您可能会使用不同的操作系统,但我还没有尝试过。
  • Python 3.

这个怎么运作
自动存在检测

我的主要目标之一是让系统完全自动化。我不想在离开或回家时必须布防或撤防它。我认为实现这一目标的最简单方法是尝试检测住户的手机。从概念上讲,这很简单,但实际上这是最具挑战性的部分,因为:

  • 捕获 Wi-Fi 接口上的所有数据包过于耗费资源。
  • 目前没有好的 5Ghz USB Wi-Fi 适配器支持监控模式。这意味着数据包监控仅限于 2.4Ghz,而大多数现代手机现在使用 5Ghz。
  • 手机并不总是在线并通过 Wi-Fi 发送数据包。有时他们会保持 15 分钟或更长时间的未连接状态。
  • 即使有 99% 的准确率,误报也很烦人。

经过大量测试,我使用了一种方法,该方法基于了解手机的 MAC 地址,通过 Wi-Fi 适配器混合主动(ARP 扫描)和被动(数据包捕获)检测。手机 MAC 地址在配置中设置,rpi-security 应用程序使用以下过滤器在监控模式接口上捕获数据包:

  • 来自任何已配置 MAC 的 Wi-Fi 探测请求。
  • 从配置的 MAC 发送到运行 rpi-security 的主机的任何数据包。

当检测到数据包时,应用程序会重置计数器,如果计数器的时间超过约 10 分钟,则系统已准备就绪。为了消除许多误报,当从布防状态转换到撤防状态或反之亦然时,应用程序会针对每个配置的 MAC 地址执行 ARP 扫描,以确保它们确实在线或离线。在 ICMP ping 非常不可靠的情况下,iOS 和 Android 将在 99% 的时间内响应此 ARP 扫描。通过结合捕获 Wi-Fi 探测请求和使用 ARP 扫描,Wi-Fi 频率并不重要,因为移动电话会在两个频率上发送探测请求,而且 ARP 扫描也可以跨两个频率工作。

通知
甲电报机器人用于发送与所捕获的图像的通知。他们有很好的移动应用程序和很好的 API。您还可以在浏览器中查看消息,并且消息会跨设备同步。

如果系统处于布防状态并且检测到运动,则 Telegram 机器人会向您发送一条包含捕获图像的消息。

任何警报状态变化也会发送通知。

遥控
您可以发送触发某些操作的 Telegram bot 命令。

  • /disable :禁用服务直到重新启用。
  • /enable :服务被禁用后启用。
  • /status :发送状态报告。
  • /photo :捕获并发送照片。
  • /gif :捕获并发送 gif。

Python
该应用程序是用 python 3 编写的。

应用程序使用多线程来异步处理事件。有4个线程:

  • telegram_bot:响应命令。
  • monitor_alarm_state:布防和撤防系统。
  • capture_packets:从移动设备捕获数据包。
  • process_photos:通过 Telegram 消息发送捕获的图像。

安装、配置和运行
用于连接到您的 WiFi 网络的接口必须与支持监控模式的接口相同。这必须是手机连接的同一个WiFi网络。

首先安装所需的软件包:

安装 rpi-security,重新加载 systemd 配置并启用服务:

将您的 MAC 地址或地址、Telegram bot API 密钥和任何其他更改添加到/etc/rpi-security.conf.

确保您已使用 启用相机模块raspi-config。

并启动服务:

您需要至少向 Telegram 机器人发送一条消息,否则它将无法向您发送消息。这样服务就可以保存电报chat_id。所以只需发送/status命令。

它作为服务运行并记录到系统日志。要查看日志检查/var/log/syslog。

还有一个调试选项可以记录到标准输出:

root@raspberrypi:~# iw phy phy0 interface add mon0 type monitor
root@raspberrypi:~# ifconfig mon0 up
root@raspberrypi:~# rpi-security.py -d
2016-05-28 14:43:30 DEBUG   rpi-security.py:73  MainThread          State file read: /var/lib/rpi-security/state.yaml
2016-05-28 14:43:30 DEBUG   rpi-security.py:44  MainThread          Calculated network: 192.168.178.0/24
2016-05-28 14:43:41 INFO    rpi-security.py:214 monitor_alarm_state thread running
2016-05-28 14:43:41 INFO    rpi-security.py:196 capture_packets     thread running
2016-05-28 14:43:41 INFO    rpi-security.py:259 telegram_bot        thread running
2016-05-28 14:43:41 INFO    rpi-security.py:154 process_photos      thread running
2016-05-28 14:43:43 INFO    rpi-security.py:392 MainThread          rpi-security running
2016-05-28 14:43:43 INFO    rpi-security.py:112 MainThread          Telegram message Sent: "rpi-security running"
2016-05-28 14:44:29 DEBUG   rpi-security.py:191 capture_packets     Packet detected from aa:aa:aa:bb:bb:bb
2016-05-28 14:44:29 DEBUG   rpi-security.py:191 capture_packets     Packet detected from aa:aa:aa:bb:bb:bb
2016-05-28 14:44:48 DEBUG   rpi-security.py:280 Dummy-1             Motion detected but current_state is: disarmed

这就是我的 Raspberry Pi Model A+ 所需的全部内容。这显示了我的 WLAN 网络设备安排:

您可以使用不同名称的接口,只需确保更改network_interface参数 in/etc/rpi-security.conf以及rpi-security.service 中对 mon0 的引用。

连接丢失时重新启动
我的 Raspberry Pi 大约每隔一两个月就会失去 WLAN 连接。我创建了一个 cron 作业来检查连接并在检查失败时重新启动。

本方案所用到的一些代码

如果您对此项目有任何想法、意见或问题,请在下方留言。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论