基于STM32动态密码锁(手机APP) 您所在的位置:网站首页 腾讯云密码锁怎么解锁 基于STM32动态密码锁(手机APP)

基于STM32动态密码锁(手机APP)

2024-07-12 06:08| 来源: 网络整理| 查看: 265

1. 前言

前一版设计了一款物联网的密码锁,采用MQTT协议连接物联网服务器进行交互,这一版是本地动态密码锁。采用局域网方式完成网络连接,与门锁进行交互,通信设置,生成密码种子,进行动态密匙比对。 这款智能电子密码锁,以STM32单片机为主控制器,由触摸矩阵键盘、ESP8266、步进电机等模块组成,具有手机APP控制、随机密码生成等功能。

当前支持的开锁方式:

(1)手机APP远程开锁。支持手机APP远程开锁。手机APP连接上ESP8266创建的WIFI热点和TCP服务器,可以在手机APP上对设备端的RTC时间进行校准,设备唯一ID获取,生成随机开锁密码。

(2)随机密码开锁。手机APP与本地设备采用时间、作为算法种子,采用算法生成开锁密码,每一串的密码有效时间为一分钟。查看手机APP上显示的密码之后,在本地设备上输入完成密码对比开锁。

image-20220409013820783image-20220409013820783image-20220409013900929image-20220409013900929image-20220409014715666image-20220409014715666image-20220409014126096image-20220409014126096image-20220409014222568image-20220409014222568

如果需要整个项目工程源码和全部资料可以从这里去下载: https://download.csdn.net/download/xiaolong1126626497/85895855

这里有演示的效果视频: 【基于STM32设计的动态密码锁】 https://www.bilibili.com/video/BV13Y4y1t7Gn?share_source=copy_web&vd_source=347136f3e32fe297fc17177194ce0a8b

2. 相关硬件2.1 WIFI模块image-20220404180739654image-202204041807396542.2 步进电机模块image-20220404180810347image-202204041808103472.3 OLED显示屏image-20220404180915854image-202204041809158542.4 STM32开发板image-20220404180941848image-202204041809418482.5 矩阵键盘模块image-20220404181013714image-202204041810137143. 手机APP设计3.1 开发环境介绍

上位机软件采用Qt框架设计,Qt是一个跨平台的C++图形用户界面应用程序框架。Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。简单来说,QT可以很轻松的帮你做带界面的软件,甚至不需要你投入很大精力。

QT官网: https://www.qt.io/

image-20220314143105032image-202203141431050323.2 学习教程

QT入门实战专栏: https://blog.csdn.net/xiaolong1126626497/category_11400392.html

QT5环境安装教程:https://xiaolong.blog.csdn.net/article/details/120654599

下载QT5.12.6下载地址: https://download.qt.io/archive/qt/5.12/5.12.6/

打开链接后选择:

qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details

软件安装时断网安装,否则会提示输入账户。

安装的时候,勾选一个mingw 32编译器即可。

3.3 实现效果image-20220409013721432image-202204090137214323.4 与服务器通信代码代码语言:javascript复制/* 功能: 连接服务器 */ void Widget::on_pushButton_connect_clicked() { if(ui->pushButton_connect->text()=="连接"){ //开始连接服务器 NewClinet(); } else { if(LocalTcpClientSocket) { LocalTcpClientSocket->close(); } } } //客户端模式:创建客户端 void Widget::NewClinet() { if(LocalTcpClientSocket) { LocalTcpClientSocket->close(); delete LocalTcpClientSocket; LocalTcpClientSocket=nullptr; } /*1. 创建本地客户端TCP套接字*/ LocalTcpClientSocket = new QTcpSocket; /*2. 设置服务器IP地址*/ QString Ipaddr=ui->lineEdit_ip->text(); QHostAddress FarServerAddr(Ipaddr); /*3. 连接客户端的信号槽*/ connect(LocalTcpClientSocket,SIGNAL(connected()),this,SLOT(LocalTcpClientConnectedSlot())); connect(LocalTcpClientSocket,SIGNAL(disconnected()),this,SLOT(LocalTcpClientDisconnectedSlot())); connect(LocalTcpClientSocket,SIGNAL(readyRead()),this,SLOT(LocalTcpClientReadDtatSlot())); /*4. 尝试连接服务器主机*/ int prot=ui->lineEdit_port->text().toInt(); LocalTcpClientSocket->connectToHost(FarServerAddr,prot); } /* 功能: 时间更新 */ void Widget::time_update() { QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 QString text; text = time.toString("yyyy/MM/dd hh:mm:ss ddd"); //设置显示格式 ui->label_time->setText(text); char Password[10]; //更新密码 GeneratePassword(Password,6); ui->label_password->setText(Password); } //客户端模式:响应连接上服务器之后的操作 void Widget::LocalTcpClientConnectedSlot() { ui->pushButton_connect->setText("断开"); Log_Text_Display("成功连接服务器...\n"); ServerConnectStat=1; //标记连接上服务器 } //客户端模式:断开服务器 void Widget::LocalTcpClientDisconnectedSlot() { ui->pushButton_connect->setText("连接"); QMessageBox::information(this,"提示","与服务器断开连接...",QMessageBox::Ok); Log_Text_Display("与服务器断开连接...\n"); ServerConnectStat=0; //标记断开服务器 } //读取服务器发来的数据 //$update,2022/02/22 13:15,2022/02/23 12:17,吃饭,5 void Widget::LocalTcpClientReadDtatSlot() { QByteArray text=LocalTcpClientSocket->readAll(); QTextCodec *tc = QTextCodec::codecForName("GBK"); QString array = tc->toUnicode(text); qDebug()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有