打造一款无需 Wi-Fi 的智能储物柜,采用了 LoRa 技术
扫描二维码
随时随地手机看文章
1. 故事
项目的起源
该项目是在我们于昂斯埃梅尼大学就读的“计算机网络与物联网”专业课程中进行的为期 50 小时的物联网模块学习过程中诞生的。作为一组成员,我们被教授要求利用 LoRa 技术开发一个创新的解决方案。我们的目标不仅仅是满足要求,而是要创造出一种真正能为我们大学实验室服务的工具,尤其是对于像开放日活动(JPO)这样的场合。
问题
大学实验室常常面临这样一个实际操作上的难题:如何安全地将昂贵的硬件(如 Arduino 微控制器、传感器、专用工具)分发给学生使用。像气象站这类常见的“固定式”物联网项目虽然很常见,但并不能解决物理安全问题。我们想要打造一个互动式的设备:智能储物柜。
我们的解决方案:智能双重身份验证密码锁
我们设计了一种智能储物柜系统,该系统能够提供安全的远程访问管理服务,且无需依赖无线网络。
我们的创新之处在于通过 LoRa 无线网络实现双重认证(2FA):
•第一层:用户在储物柜前使用射频识别卡进行身份验证。
•LoRa 传输:独特的标识码通过 LoRa 技术在长距离内传输至中央服务器。
•第二层:如果识别出该徽章,服务器会生成一个唯一的 4 位数字代码,并将其显示在网页应用程序上。
•最终操作:用户从应用程序中获取代码,将其输入到储物柜的键盘上,此时电磁锁便会打开。
通过选择 LoRaWAN 技术,我们确保了储物柜可以放置在校园内的任何位置——哪怕是在没有 Wi-Fi 或移动网络覆盖的区域——同时还能与我们的数据库保持安全的连接。
2. 它是如何运作的?
系统架构
该系统采用分布式架构,将物理硬件与基于云的逻辑中心相连接。储物柜的核心是一个名为“Arduino MKR WAN 1310”的板子,它充当主控制器。该板与多个外围设备相连:一个用于识别的 RFID 读取器、一个用于输入安全密码的 4x4 矩阵键盘、一个用于用户反馈的 I2C 液晶显示屏以及一个由继电器控制的电磁锁。储物柜与管理服务器之间的通信完全通过 LoRa WAN 协议通过 The Things Network 基础设施来处理。
身份验证流程
安全流程始于用户在储物柜处扫描其 RFID 识别卡之时。Arduino 读取卡片的唯一标识符,并将其封装成一个 LoRa 数据包发送至网关。此消息随后被路由至一个基于 Python 的服务器,该服务器托管着一个基于 Flask 的网络应用程序和一个 MQTT 客户端。服务器会将接收到的标识符与数据库进行比对。如果用户被识别,服务器将生成一个随机的四位数安全码。这个码同时会在用户的网络仪表板上更新显示,并作为下行消息发送回 Arduino。
物理访问与监控
一旦 Arduino 通过 LoRa 接收到了秘密代码,它就会切换到等待模式,并通过液晶显示屏提示用户输入数字。用户通过手机上的网络应用程序获取临时代码,并将其输入到实体键盘上。如果输入的代码与 Arduino 内部存储的代码相匹配,继电器就会被触发,从而释放电磁锁,使门能够打开。使用磁性干簧管来监测门的位置,以确保系统只有在门再次完全关闭后才会回到安全的待机状态。
3. 代码逻辑
Arduino 状态机
为了确保用户使用过程的流畅性,并避免在网络通信或键盘输入过程中导致系统卡顿,Arduino MKR WAN 1310 运行着一个有限状态机。这种架构使控制器能够切换到不同的运行模式:待机模式、等待服务器模式以及代码输入模式。在待机模式下,系统持续对 RFID 读取器进行轮询。一旦检测到徽章,系统就会进入等待状态,通过 LoRa 发送 ID 并在 LCD 上显示状态消息。这种非阻塞方式至关重要,因为它使得设备能够在监听 LoRa 消息的同时,同时检查用户是否已在键盘上开始输入操作。
克服 LoRa 类 A 网络延迟问题
一个重要的技术难题在于如何有效地接收来自服务器的二次身份验证(2FA)代码。由于 LoRa WAN 类 A 型设备在发送上行数据后才能立即接收数据,所以我们采用了特定的“ping”机制。在发送初始的 RFID 标识符后,Arduino 会向服务器发送短周期的“ping”信号。这些空消息会开启频繁的接收窗口,使得服务器能够以极短的延迟将生成的安全代码推送到储物柜中。如果没有这种逻辑,用户可能需要等待几分钟才能让网络传递该代码,这对于实体储物柜来说是不切实际的。
服务器端智能与 MQTT
后端逻辑托管在一台 Linux 虚拟机上,是用 Python 语言通过 Flask 框架和 MQTT 客户端编写的。与传统的 Web 调用不同,服务器通过 MQTT 协议与 The Things Network(TTN)保持持续连接。当收到徽章 ID 时,Python 脚本会查询 MariaDB 数据库以验证用户身份。如果身份得到授权,服务器的逻辑会同时处理两项任务:它会生成一个随机的四位数字代码,并将其存储在网页仪表板的会话中,同时还将这个相同的代码编码为 Base64 格式的数据包,以便发送回 Arduino。
通过射频识别技术进行的行政管理
我们还将管理逻辑直接集成到了后端系统中。通过在 Python 配置文件中定义特定的主徽章 UID,服务器可以切换到普通访问模式和管理员注册模式。当管理员徽章被扫描时,服务器会进入“监听”状态,在此状态下,接下来扫描到的 RFID 卡要么会被添加到数据库中(如果是新的),要么会被移除(如果已经存在)。这使得在储物柜站点可以直接轻松管理用户访问,而无需手动编辑数据库表或重启服务器。
本文编译自hackster.io





