APP下载

基于STM32 的改进型RFID 读写系统的设计

2021-12-07陈明忠

关键词:读写器数组上位

陈明忠

(汕头职业技术学院 机电工程系,广东 汕头 515078)

多年来,伪造仿制正规商品的现象大量存在,因此各种防伪技术应运而生。传统的防伪技术主要有序列号、一维条码、二维码等,但它们容易被复制盗用或揭下复用。RFID(无线射频识别)技术克服了传统防伪技术的不足,RFID 标签ID 为出厂时写入,当其附着在防伪对象后具有揭下自毁功能。而UHF(超高频)RFID 由于其读写距离较远,读取速度较快,标签成本较低,目前已成为市场主流[1],被广泛应用到商品的防伪溯源系统(包括物流管理、防伪追踪)中。

一种典型的RFID 系统由电子标签、读写器、上位机和远程服务器组成[2],读写器一般由天线、射频模块、控制模块和接口组成,远程服务器的数据库存放商品编号、商品基本信息和溯源信息,如图1 所示。电子标签与读写器间采用无线连接,读写器与上位机间采用COM/USB 口连接。

图1 RFID 系统的组成

现行的RFID 读写系统存在如下问题:1)现行的读写器是以8 位的8051 单片机作为控制模块的核心,这种读写器的功率较低,发送的信号衰减较快,标签的读写速度较慢。当连续读取多个标签时,容易发生碰撞而造成漏读和误读[3]。2)标签数据容易被不法份子非法读取、窃听或位置跟踪,从而导致隐私信息泄露。3)无法检查包装内的货物是否被不法份子替换或调包过。电子标签一般是附着在货物的包装上的,当不法份子在不损坏包装的前提下,将包装内的货物替换成仿造货物时,现行的RFID系统是检查不出来的。

为了解决现行RFID 系统存在的问题,本文以基于ARM 架构的STM32 单片机为控制模块的核心,RLM100 作为射频模块,设计了一种改进型的读写器系统,为商品的防伪溯源研究和实践提供一定的借鉴价值。

1 基于STM32 的RFID 读写器的硬件组成和功能特性

1.1 基于STM32 的RFID 读写器的硬件组成

前面已谈到,读写器一般由天线、射频模块、控制模块和接口组成。

射频模块主要由发送电路和接收电路组成,功能是:产生高频发射功率,并接收和解调来自电子标签的射频信号[4-5],本读写器采用睿芯联科公司研制的RLM100 作为射频模块。RLM100 模块集成了PLL、发射、接收、耦合器以及MCU 等部件,同时定义了一系列的命令帧和响应帧。

控制模块由ASIC 组件和微控制器组成,微控制器是控制模块的核心部件,本读写器采用STM32 作为微控制器[6]。STM32 是意法半导体集团(ST)推出的一种高性能、低成本、低功耗的基于ARM Cortex-M 架构的微控制器(MCU)。

上位机与STM32 之间、STM32 与RLM100 之间的媒介称为接口,本读写器采用UART(串口)作为接口。STM32 模块通过USART1 与上位机连接,通过USART2 与射频RLM100 模块连接,如图2 所示。

图2 上位机-STM32-RLM100 串口联接图

1.2 STM32 的功能特性

单片机是将多种接口芯片集成到一片芯片的微控制器,目前有51 单片机和STM32 单片机两种[7]。STM32 是基于ARM Cortex-M 内核的32 位闪存微控制器,相对于51 单片机,STM32 单片机具有如下特性:

(1)处理速度快。STM32 的处理速度大约是51 单片机的几十倍。

(2)储存容量大。片上集成32~512 KB 的Flash 存储器,6~64 KB 的SRAM 存储器。

(3)外设接口数量多,功能强大。为用户扩容、升级、改造提供方便。

(4)低功耗控制多。提供睡眠模式、停止模式、待机模式三种低功耗供用户选择。

(5)升级维护方便。用户程序在PC 端开发,然后编译、生成hex 文件后,通过ARM 仿真器(含JTAG和SWD 端口)就可方便地烧写到STM32 的存储器中。

总之,STM32 融高性能、实时性、低功耗于一体,为用户提供一个全新的自由开发空间和各种简单易用的软硬件辅助工具,让STM32 成为各类智能型产品开发的理想选择。将STM32 应用到读写器中,可以明显提高标签的读写速度,避免标签信息的漏读和误读。

2 基于STM32 的RFID 读写系统的软件设计

2.1 基于读写器和标签间的双向安全认证协议的设计

为了防止标签数据被非法读取,本系统设计了一种改进的RFID 双向安全认证协议,如图3 所示。

图3 改进的RFID 双向安全认证协议

每一个RFID 标签在出厂时,厂商都会写入一个标识ID、密钥K、Hash 函数和随机数生成器,其中ID 和K 具有唯一性,不同点是ID 可被读取,K 不能被读取,并禁止标签被“读写”。读写器存储一个随机数生成器。后台服务器中的数据库存储将要使用的所有标签的ID 和K 值对以及Hash 函数[8]。认证过程如下:

(1)当读写器对准电子标签时,读写器产生一个随机数r1,并向标签发送读写请求Query 和r1;

(2)当标签收到Query 和r1后,立即产生一个随机数r2,并计算r2和K 异域后的哈希函数,即H(r2⊕K),然后将r2,H(r2⊕K)发送给读写器;

(3)读写器向后台数据库转发r1,r2,H(r2⊕K);

(4)在后台数据库中遍历标签的K值。每取出一个标签的K 值,计算H(r2⊕Ki),并将H(r2⊕Ki)与H(r2⊕K)比较,若不等,则取出下一个标签的K 值;若相等,则表示被请求的标签为有效标签,停止取K 值,继续计算H(r1⊕r2⊕Ki),并向读写器发送H(r1⊕r2⊕Ki)。若遍历完毕时,不存在H(r2⊕Ki)=H(r2⊕Ki),表示认证失败;

(5)读写器向标签发送H(r1⊕r2⊕Ki),标签将自己的K 代替式中的Ki,并计算H(r1⊕r2⊕K),然后比较H(r1⊕r2⊕K)和H(r1⊕r2⊕Ki),若两者是相等的,则标签判断读写器为有效读写器,这时标签允许被“读写”。

当RFID 标签与读写器双向认证之后,能有效防止标签信息被非法读取、窃听和位置跟踪[9]。

2.2 上位机向STM32 发送命令帧的处理流程

(1)在上位机中,根据RLM100 命令帧的数据格式和操作目的,构造上位机的相应命令帧,向读写器发送相应命令;

(2)在读写器中,对STM32 模块的RCC 系统时钟、NVIC(嵌套中断向量控制器)、TIM2 定时器、Systick 定时器进行初始化[10];

(3)配置USART1(串口1),实现STM32 与上位机的连接。然后调用USART1 的中断处理函数,接收上位机发送过来的命令帧;

(4)对Ucos 的系统时钟、定时器、延时、串口等进行初始化,并创建起始任务。同时对刷卡中断、LED、蜂鸣器信号量进行初始化[11];

(5)根据RLM100 通信协议和操作目的,构造出STM32→RLM 各个具体的命令帧和响应帧;

(6)在上位机中,根据RLM100 响应帧的数据格式和操作目的,构造上位机的相应响应帧,接收读写器返回的数据。

2.3 STM32 与RLM100 间的数据帧与字节数组的关系

STM32 发给RLM100 的数据帧称为命令帧,RLM100 返回给STM32 的数据帧称为响应帧[12]。数据帧是一种结构变量,由若干域名组成,STM32 和RLM100 之间通过Usart2(串口2)传递数据帧。由于每次传递一个字节,因此在一方传递给另一方之前,要将数据帧存入字节数组中。根据RLM 数据帧格式的规定,数据帧存入字节数组时需要进行格式处理,如表1 所示。

表1 数据帧与字节数组的关系

2.4 STM32 接到上位机的写卡命令帧后的流程设计

(1)将上位机发送的“写卡”命令帧各域的值存入全局数组usart1_rev_buff 中[13];

(2)利用RLM_GET_STATUS(询问状态)命令测试上位机-STM32-RLM100 的连接状态;

(3)利用RLM_INVENTORY_SINGLE(单标签识别—单步模式)命令读取标签的UII 区信息;

(4)利用RLM_BLOCK_WRITE_DATA(写入标签数据_多字长模式<指定UII>)命令向RFID 标签的指定分区写入数据;

(5)利用RLM_READ_DATA(读取标签数据<指定UII>)命令从指定的存储分区读取数据,检查读取的数据与用户写入的数据是否一致。

2.5 STM32 接到上位机的读卡命令帧后的流程设计

(1)将上位机发送的“读卡”命令帧各域的值存入字节数组usart1_rev_buff 中;

(2)利用RLM_GET_STATUS(询问状态)命令测试上位机-STM32-RLM100 的连接状态;

(3)利用RLM_INVENTORY_SINGLE(单标签识别—单步模式)命令读取标签的UII 区信息[14];

(4)定义字节数组TxDatatemp,用于存放RLM_READ_DATA(读取标签数据<指定UII>)命令帧的PAYLOAD 域的值;

(5)把字节数组usart1_rev_buff 的5~8 号元素(上位机输入的标签密钥)存入TxDatatemp 数组的0~3 号元素中;把usart1_rev_buff 的9~10 号元素分别存入TxDatatemp 数组的4~5 号元素中;把usart1_rev_buff[11]/2 存入TxDatatemp 数组的6 号元素中;

(6)利用UII 区信息的前5 位算出UII 区的总长度,并存入lentemp 中。把UII 区信息从左边开始拷贝lentemp 个字节到TxDatatemp 数组的7 号元素开始的字节中;

(7)STM32 把RLM_RE AD_DATA 命令帧中各域按表1 进行处理后,依次存入字节数组UHF_TX_Buf 中。然后,STM32 将UHF_TX_Buf 数组逐个字节发送给RLM100;

(8)RLM100 读取目标存储区的数据后向STM32 发回响应帧,STM32 收到响应帧之后,首先存入字节数组UHF_RX_Buf 中,然后根据表1 对数组元素进行处理,获取响应帧的各个域;

(9)将响应帧的PAYLOAD 域(即目标存储区数据)通过串口上传到上位机;

(10)在上位机中,检查目标存储区是哪一个?如果读取的是TID 区,还要完成以下两步:

1)从标签User 区读取前7 个字节的数据(格式:“第××次,”),并对其中的××加1,然后读取上位机当前的日期和时间(格式:YYYY-MM-DD,HH:MM:SS),组建26 个字节的字符串(格式:“第××次,YYYY-MM-DD,HH:MM:SS ”),以反映标签ID 被读取信息;

2)将标签ID 被读取信息写入标签User 区,同时将标签ID、标签ID 被读取信息通过Fttp 方式写入数据库相应的商品编号中。终端用户通过标签ID、商品编号访问商品信息。

终端用户只要读取User 区,就能知道标签ID 被读取次数。一般地,商品在生产、包装、贴标签后,厂商会读取一次标签ID,终端用户购买商品时,也会读取一次标签ID,即标签ID 一般被读两次。不法份子在将假货替换真货之前,为了获取真货信息,也可能要读取标签ID。因此,标签ID 被读取次数越多,商品被伪造的可能性就越大[15]。通过将标签ID 被读取次数和读取时间写入标签User 区的方法,有效解决包装内的货物无法检查真伪的问题。

3 写卡、读卡的实验测试

(1)写卡:当商品贴上电子标签以后,商品生产商要向标签的User 区写入“第01 次”和读取时间。

操作步骤为:在标签密钥中输入:“0-0-0-0”,存储分区选择“User”,地址偏移量输入:0,“写卡”按钮后面的编辑框输入“第01 次”和读取时间,并单击“写卡”按钮,如图4 所示。

图4 向User 区写入数据

(2)读卡:终端用户在购买商品时,要从标签TID 区读取标签ID,从User 区读取“标签被读取次数和读取时间”,并通过Fttp 方式写入远程服务器的数据库相应的商品编号中。

操作步骤:在标签密钥中输入:“0-0-0-0”,存储分区选择“TID”,地址偏移量输入:0,读出的数据长度输入:16,商品编号输入:abc(假定事先在数据表中输入商品编号为abc 的记录),并单击“读卡”按钮,如图5 所示。

图5 向TID 区读取数据

4 结语

本文以STM32 单片机作为控制模块,RLM100 作为射频模块,设计了一种改进型的RFID 读写系统,该读写系统具有三大优点:一是读写器能快速对RFID 标签进行正确读写;二是基于读写器与RFID标签之间设计了一种双向安全认证协议,有效防止标签信息被非法读取、被窃听和位置跟踪;三是在读取标签TID 区时,自动将标签ID 被读取次数和读取时间实时写入标签User 区,终端用户只要读取User 区,就能判断包装内的货物的真伪问题。本文还对STM32 与RLM100 之间的数据传送、写卡操作、读卡操作的流程进行详细设计,最后通过实验,验证本文设计的写卡操作、读卡操作的正确性。

猜你喜欢

读写器数组上位
JAVA稀疏矩阵算法
宁波轨道交通AFC系统读写器测试平台设计
JAVA玩转数学之二维数组排序
共享密钥与位运算的移动RFID认证协议
一种增强型RFID 双向认证协议∗
一场史无前例的乐队真人秀
特斯拉 风云之老阿姨上位
更高效用好 Excel的数组公式
寻找勾股数组的历程
基于VC的PLC数据采集管理系统