Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
nuc980
【NUC980开发板DIY项目大挑战】门禁系统
发布于 2022-05-29 03:13:52 浏览:892
订阅该版
[tocm] ### 1 准备工作 这几年工作和平时都在玩和用rt_thread,这次参加这个diy活动有幸被选中,很高兴。 收到板子后,第一件事情就是,创建rt-thread 工程,因为平时习惯使用了mdk ,照着rt-thread 官网发布的nuc980iot开发板使用教程,用git进行工程下载,并用教程的指导过程进行代码更新和生成 mdk工程。 ![aac21c91a78f0ae8b95fb8614126fbac.png](https://oss-club.rt-thread.org/uploads/20220528/aac21c91a78f0ae8b95fb8614126fbac.png) 生成工程后进入mdk进行编译。 ![202204262128_0011_MDK编译通过.png](https://oss-club.rt-thread.org/uploads/20220528/0fafd645702425d9ec146522c526d2e9.png.webp) 软件准备工作完成,接下来是硬件,由于我报名的是做个门禁系统所以,必须需要读卡器,读卡器有很多各种接口类型有,但是和开发板进行连接测试最方便的还是UART-TTL方式,手上正好有一个ID卡模块输出是串口,很合适,模块供电5V ,开发板子3.3V所以还需要一个电平3.3v 和 5v互转电路,为了方便手焊接了一个。电路百度找到的采用2N7002来完成,在这个基础上增加了1个LM1117-3.3V这样只要给这个5v就好。 ![电平转换电路_2N7002_双向电平转换电路.png](https://oss-club.rt-thread.org/uploads/20220528/9d9b98939541235c9ff073cabf071d27.png.webp) 连结好后最终 NUC980的 TXD5接ID卡模块的RXD ,RXD5接模块的TXD,GND接GND,再给个5V供电一共4跟线。 连接好的样子。 ![微信图片_20220528220709.jpg](https://oss-club.rt-thread.org/uploads/20220528/fc4041e8bc9f3596846c4c8f316f3e7b.jpg.webp) ## 简单介绍 - 板子上的TXD5 RXD5接 ID读头的串口TTL 信号。 - 板子的K1代替出门按钮 ,按下为触发 - 板子上的红色LED 代替控制门的门磁铁或者其他控制门的部件。 - 红灯亮表示在执行开门的状态期间。 - 灭表示没有在执行开门动作 接下来开始介绍一下门禁功能。简单的说就是刷卡,卡有注册(下载到过板子里有存储并且存储的卡的数据格式对应的门有权限打开)就根据权限开执行结果进行开门或者没有权限静默。并把这些事件记录成日志供应上位机通过有线或者其他网络途径读取汇总。 时间有限所以采取了 有线网络TCP协议来完成。加之比较尴尬不会编写电脑PC端程序。所以只好用网络助手代替一下。指令的收发, 另外由于rt-thread 出色的shell 组件,所以为了调试方便。又增加了通过shell 可方便调试shell指令。 以及对卡模拟和操作的 卡管理器 代码里叫做pushbuff ,这是一个开辟了一大片区域(NUC980内存大可以使劲造)作为生成模拟卡数据(比如1000个模拟卡信息和10个真实卡信息)以及一些操作(可进行排序,写入到指定卡管理存储文件)。 门禁刷卡 ,卡在一堆注册卡中如何被快速找到,就需要一定的算法支持。最方便简单,但效果很好的当属二分查找算法。 但是这个算法前提是需要进行排序,所以PC管理端下载到门禁的这个区域的卡必须进行排序。但是为了测试性能效果。当然由于本人不会编写PC端程序,没法用网络助手输入那么多模拟卡和真实卡的数据文件给门禁。 这个时候就靠上面shell和大片内存所做的 模拟器来完成。比如生成10000张卡 然后再加入一些真实卡,输入命令可查看. 由于主卡区是进行排序能快速查找,所以一般一次性下载。但是偶尔会临时需要增加几张卡的时候,所以需要这个辅助区临时区无序区。 所以需要在文件系统中有3个文件来保存关键的信息文件名分别如下 - CardAM.bin 此文件保存经过排序后的卡信息。以供二分查找快速的在较多的卡中查找定位。 - CardAS.bin 此文件保存的是临时的无需排序的卡信息。以供二分查找快速的在较多的卡中查找定位。 - CardLog.bin 此文件保存刷卡日志信息。 ### 指令说明 pushbuff辅助模拟器指令如下 以下都是在rtthread shell下输入的指令 设置系统刷卡模式 - setmode 1 进入调试模式此时刷卡 算的卡不会被拿去对比搜索,而是放入pushbuff。 - setmode 0 进入正常模式 - pushbuff 1 输出当前保存在pushbuff列表里的所有卡 - pushbuff 2 对当前保存在所有pushbuff的卡进行排序 - pushbuff 3 对当前保存在所有pushbuff的卡写入 卡管理主区 排序区,存储文件在CardAM.bin - pushbuff 4 对当前保存在所有pushbuff的卡写入 卡管理临时区 不需要排序区,存储文件在CardAS.bin - pushbuff 5 清空当前 pushbuff 所有数据,以及记录的卡数量,全部归零。 使用pushbuff生成虚拟卡号,如果之前通过设置setmode 1 把读卡器上刷的卡会推送进入这个模拟器的buff,之后模拟器生成的卡会一起追加进去。 ![20220526234210_0011_查看Card缓冲器记录卡下部分.png](https://oss-club.rt-thread.org/uploads/20220530/5f7d11b1a539cb797b4c5dd6b36f28a0.png) 使用pushbuff 2 指令对 对buff里的卡进行 排序冒泡算法排序。 ![20220526234402_0015_Card缓冲器经过排序后上部分.png](https://oss-club.rt-thread.org/uploads/20220530/aee92c66623099af1597721727583654.png) ![20220526234443_0016_Card缓冲器经过排序后下部分.png](https://oss-club.rt-thread.org/uploads/20220530/5e97bb74552bd159c90095d616870bcf.png) 最后可以使用pushbuff 3 把buff里的卡生成完整卡信息写入 卡主区排序区 文件。(写入这里之前必须执行pushbuff 2 进行排序因为采用二分查找) 使用pushbuff 5清空 模拟器Buff所有信息。然后从新通过pushbuff 0 (生成虚拟卡数量) 再使用pushbuff 4 写入到辅助区临时区的卡文件。 完成以上操作可以通过setmode 0切换成正常运行模式 ,刷卡就会被系统与卡库进行正常判断对比。 先对比主卡区(排序区),再对比辅助区临时区的卡文库。 卡存储的基本结构(无论存储在主区(排序区)或者辅区(临时区无序区))卡的数据结构是一样。 卡存储信息格式一条16字节,卡号存储时候4字节16进制,实际实物卡上一般10位十进制,所以卡信息显示时同时输出10进制 ``` 4字节 1字节 1字节(预留) 1字节(预留) 1字节(预留) 8字节 卡号 门1权限 门2权限 门3权限 门4权 备注信息 门1权限 1表示允许开门。目前只支持这个. ``` 日志格式 一条16字节 ``` 4字节 6字节 1字节 1字节 1字节 1字节 1字节 1字节标记 卡号 发生时间 门1 门2 门3 门4 事件源 年月日时分秒 刷卡或者按扭 220510010203 时间存储2022年5月10号01点02分03秒 ``` 卡号4字节16进制方便节省存储结构事件源主要时刷卡 和出门按钮开门 两种。目前只实现单门所有无需要标记是哪个门上发生的事情。 TCPIP指令部分。目前测试的板子IP 192.168.1.32 电脑IP 192.168.1.128 电脑使用8088端口创建TCP服务器监听连接。板子开机后自动会连接,服务器断开连接,板子也会不停尝试连接。 指令格式4字节。由于`MAC IP TCP`本身有CRC 和包长度等部分所以指令部分没有这些。 `1B index 1B cmd 2B 预留 ` 目前实际指令只用第二个字节 实际这样的格式就可以了`00 cmd 00 00`或者跟数据部分 Tcp Cmd : ``` 0x01 获取系统信息 数据无 //省略 返回系统信息 硬件版本 软件版本asic ii 0x10 获取卡信息 数据无 返回 4B 主卡总数 4B临时卡总数 0x11 获取卡信息根据存储序号(排序区) 4B 开始位置,4B结束位置 (数据01 02 03 04 发送时候按04 03 02 01发送) 0x12 获取卡信息根据存储序号(临时区) 4B 开始位置,4B结束位置 (数据01 02 03 04 发送时候按04 03 02 01发送) 0x13 获取卡信息根据卡号 4B 卡号 0x18 下载卡信息(排序区) 卡1数据 ... 卡N数据 0x19 下载卡信息追加卡(临时区) 卡1数据 ... 卡N数据 0x20 获取刷卡日志信息 数据无 返回 4B 日志信息 总数 0x22 查询刷卡日志 根据存储位置编号 4B开始位置 结束位置4B (开始位置==结束位置查询一条) (数据01 02 03 04 发送时候按04 03 02 01发送) 返回 符合条件日志信息 ``` 辅助shell调试命令介绍: 1 updatainfo 显示3个主要文件大小 卡数量以及日志记录数量 ![image.png](https://oss-club.rt-thread.org/uploads/20220529/8ba1bc1469abb3f229f39ff906245ca2.png) 2 getcarda - card area main get info 根据序号查找AREA MAIN 排序区主卡区查找 参数序号(10进制)(1开始查第一条,对应存储的位置序号是0) ![image.png](https://oss-club.rt-thread.org/uploads/20220529/87b98ada957415d98c558a80c6c1fe4b.png) 3 getcards - card area sub get info 根据序号查找AREA SUB 非排序区辅卡区查找 参数序号(10进制)(1开始查第一条,对应存储的位置序号是0) ![image.png](https://oss-club.rt-thread.org/uploads/20220529/22fa9f2e02c1206711fac0b3f02ec014.png) 4 findcarda (待测试修正) - card area main get info 根据卡号查找(卡号10进制),主区排序区中的卡是否存在。 5 findcards (待测试修正) - card area sub get info 根据卡号查找(卡号10进制),辅卡区非排序区中的卡是否存在。 TCP 指令测试 1 获取当前数据库记录卡总数: ``` 00 10 00 00 [2022-05-29 13:23:57.948]# RECV HEX FROM 192.168.1.32 :57804> E8 03 00 00 64 00 00 00 主卡区(排序区) 000003E8 (1000条)辅卡区(临时区)00000064 (100条) ``` 2 读取主卡区的中的卡信息 ``` 00 11 00 00 01 00 00 00 FF 00 00 00 //前4字节指令头部后面数据部分。从第一张1开始 00 00 00 01 物理存储位置0 到255 张结束, 000000FF ``` ![image.png](https://oss-club.rt-thread.org/uploads/20220529/329c43c60d06c5714d793cdd9ed7a6e9.png) 3 读取辅卡区的中的卡信息 ``` 00 12 00 00 01 00 00 00 FF 00 00 00 //前4字节指令头部后面数据部分。从第一张1开始 00 00 00 01 物理存储位置0 到255 张结束, 000000FF ``` 格式同上作用同上指令不一样。只是返回的是辅卡区中的卡 如果存在。 4获取日志总数 ``` 00 20 00 00 [2022-05-29 13:40:38.811]# RECV HEX FROM 192.168.1.32 :57804> 12 00 00 00 当前日志总数00000012条 18条 ``` ![image.png](https://oss-club.rt-thread.org/uploads/20220529/31f67a0573485f1f1090f082a8eb4b9b.png) 5获取日志 `00 22 00 00 01 00 00 00 05 00 00 00 //从 00000001 第一条开始到 00000005` 如果结束的日志编号大于板子现有的日志最大数量。板子就会只发送存在的编号对应的,对于大于存在的编号的将忽略,比如当前18条日志 。 如果这个指令查询到20的话 那只会接收到1-18条数据之后19 20 条不存在板子不会发送。 ``` [2022-05-29 13:43:04.413]# RECV HEX FROM 192.168.1.32 :57804> 3B D6 4D 00 16 05 1D 0D 28 01 00 F1 F2 F3 01 02 [2022-05-29 13:43:04.524]# RECV HEX FROM 192.168.1.32 :57804> EF 48 52 00 16 05 1D 0D 28 02 00 F1 F2 F3 01 02 [2022-05-29 13:43:04.635]# RECV HEX FROM 192.168.1.32 :57804> 14 47 20 00 16 05 1D 0D 28 05 00 F1 F2 F3 01 02 [2022-05-29 13:43:04.746]# RECV HEX FROM 192.168.1.32 :57804> E4 46 20 00 16 05 1D 0D 28 07 00 F1 F2 F3 01 02 [2022-05-29 13:43:04.856]# RECV HEX FROM 192.168.1.32 :57804> 2F 84 A1 00 16 05 1D 0D 28 08 00 F1 F2 F3 01 02 ``` ### 演示测试过程 1 下载板子程序,可在板子启动开始快速的敲入空格,让板子进入uboot命令行下。输入run update 这个命令板子自带uboot用于通过超级终端下ymodem协议发送给uboot进行升级和固化到flash。 2 板子完成升级后第一个需要确认事件是否正确,如果不正确可以使用rt thread shell的rtc_set_date 和rtc_set_time进行设置。 3 打开网络助手 创建TCP 端口8088服务器等待板子的tcp连接 4 通过shell 输入setmode 1 指令让 实际刷的卡能进行 先被送到pushbuff模拟器上进行和之后的模拟器卡进行混合创建数据库。 5 通过pushbuff 1查看物理卡和模拟数据库情况 6 通过pushbuff 2 对当前保存在pushbuff中的卡进行排序, 7 通过pushbuff 3 把生成的虚拟卡和实际物理刷的卡排序后的关于卡的数据库写入到主卡存储文件CardAM.bin 。 8 通过ls查看主卡文件是否 大小正确 9 执行pushbuff 5 清空 pushbuff ,接着直接刷物理卡若干张。到pushbuff 10 执行 pushbuff 4 把之前刷的物理卡 生成并且到 临时卡存储文件CardAS.bin 11 以上步骤模拟了实际使用过程所需要的卡。 排序区已经被存储大量的卡,而临时区被存下若干张卡 12 shell下输入setmode 0 。切换到正常刷卡模式开始测试。 13 出门按钮板子上的k1 代替出门按钮 ,按下表示实际使用过程中的出门按钮 被按下。板子的红灯会亮。红灯模拟显示过程中的开门控制门磁。 14 通过shell下输入ls查看日志文件的大小,通过getlog 数据(日志索引1开始 ) ,比如getlog 1 表示输出第一条日志到shell下打印信息并且显示 15 通过网络指令可同样完成部分功能。(重点测试日志的读取) ### 心得体会 首先就是RTT越来越完善的功能和组件以及越来越多的芯片的支持,给我们这样的工程师实际使用中带来了很多的便利和节省了很多的时间。 就拿这次diy来说,如果是以前就需要自己花很多时间去创建工程测试厂家给的库,看看有没有Bug,编写程序的时候也没有现在这么方便。 第二点就是RTT功能强大的组件和完善的外设驱动以及一些模块的库。这些更方便了我们这些工程师。 希望 RT-THREAD以后会越来越完善和强大,sdk出现的任何芯片都能完美的运行。 像uboot那样。 造福更多的人。。 昨晚创建的上传的工程 ,下载下来发现缺少文件,从新弄了个现在这个应该完整正常了。 - 代码地址: https://gitee.com/BeyondProject/rtthread_ncu980diy.git - 视频地址: https://b23.tv/CRVVEJb
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
beidou2010
这家伙很懒,什么也没写!
文章
1
回答
8
被采纳
1
关注TA
发私信
相关文章
1
ENV下的NUC980能移动到RT STUDIO上吗?
2
NUC980 生成 UFFS 文件系统镜像
3
怎样生成基于NUC980、rt_thread系统的板级支持包(MDK开发环境)
4
这个接口在哪个文件里面的。
5
NUC980IOT开发板rt工程创建文件
6
NUC980之EMAC功能模块的硬件介绍
7
nuc980DDR和MDK的IRAM是怎样的映射关系
8
ncu977 跑rtthread 操作io没有反应
9
NUC980开发板生成Keil工程找不到Device和编译出错
10
rtthread studio创建NUC980工程无法设置RTC日期和时间
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部