UHF超高频RFID纸质电子标签与树莓派通信

在物联网领域,我们经常听到 RFID 这个词,接下来讲解一下,什么是 RFID ?

RFID 全称为 Radio Frequency Identification,中文称“射频识别”技术。

现实中,我们经常用到这一技术的应用,比如门禁卡、考勤卡等。

关于 RFID,比较正式的定义是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。

我们看看它的原理图,如下图所示,RFID 由服务器、阅读器、标签三部分组成,其中阅读器与服务器之间由有线信道连接,通信过程通常认为是安全的,而阅读器与标签之间由无线信道连接,存在很大的安全隐患。

 因项目涉及到电子标签的使用,对于此方面没有涉足的我一直担心于起通信协议的撰写,因为当今社会所有的产品都是向着高质量化方向发展。我所购买的是UHF-R200读写器,配置了30m超远距离探测的天线,成套的设备虽然提供了很多资料,但都是现成封装好的软件与命令协议,无法直接使用,而且指导书的字数多的可怕,而我们的项目本身所使用的又是Raspberry Pi 4B,网上关于R200与树莓派之间通信协议的资料根本没有,所以通过一下午的钻研,我终于攻克了此难点,特地来给大家一个台阶和参考。

1.UHF-R200 是一款超高频读写模块,体积小,功耗低,最大功率为28dbm,并且功率可调;主要用于典型读距离在 0-30m 以内的应用。该芯片具有低功耗,小尺寸、远距 离的特征,是低成本 RFID 系统的优良解决方案。UHF-R200模块有多种通信方式,有串口,SPI,USB通信。我们这里涉及到的是树莓派与R200模块采用的串口通信,PC端与R200采用的USB通信。

2.在R200固定发射功率(默认26dbm)情况下天线线圈决定R200读写RFID标签的最大范围,本文的线圈能识别读取30米内的RFID标签。

1.UHF-R200                                  2.天线

3.电子标签                                  4.PVC白卡(与电子标签一样)

 

3.纸质电子标签只有USR和EPC两个存储区,EPC用于存储12字节卡号,USR存储区可存最大64字节数据,一般利用用户存储区来放需要处理的数据。

4. 一般的电子标签有4个存储区:RFU,USR,EPC以及TID四个数据存储区,而PVC白卡只有EPC存储区,宽度为12个字节,一般存了卡号,就用不了别的地方了。

 其实如果是简单运用的话,只需要记住EPC就OK了,因为这个是电子标签最核心的存储区,也是通信是收发的最明显的区域。

第一步:在PC端修改电子标签的EPC,改成自己需要的存储数据。

1. 安装驱动:
设备在第一次使用的时候,用户需先安装 USB 驱动:WIN7 以上版本在插入 USB 线的时候,电脑会自动搜索,并安装,一般在电脑右下角会提示,安装成功后打开 计算机-系统属性-设备管理器-端口,如果 出现CP210X的端口,表明安装成功。如下图所示:
                                
2. 驱动安装完成后,打开 PC Demo2.0 软件,打开 RFID_Reader_Csharp,在端口号位置选择和上面端口一致的 COM 口,然后点连接串口按钮后(红色的连接端口会变成绿色的断开连接),无其他异常提示表明连接成功。
      

 

3. 读取标签:点击“多标签识别”,此时模块会进行读卡工作,如果有标签的话,软件上会显示出读到的标签,绿色的圆球状为读到标签成功状态,注意此时是多次轮询,次数为655354 次,到达 65535 次时,读卡器会自动停止读取,如果需要再次读取,再次点 “多标签识别”即可。如果在读取的时候需要停止读取,点“停止识别”设备即可停止读取。
      

 

4. 写数据操作:
进入“读写标签”界面,单击“单标签读取”,界面会显示刚刚读到的标签,如果界面出现了好几个标签数据,说明在天线的感应范围内,有别的标签也被读到,为了确保是对指定的标签操作,可以将附近的几张标签拿走一点,这样再次读取一次,保证只有一个数据,或者确定当前的标签数据即可。确定了要操作的标签数据后,鼠标点击界面上面的标签EPC 数据, 此时标签数据会变成蓝色,在右边的读写标签里面,选择访问区域,(下拉框选择),比如EPC,起始地址改成 0002,字长度改成对应的长度一般不超过6,即00 06,访问密码不变。在“数据”的右边文本框输入4*6 的个数的 16 进制数据。比如:111111111111111111111111,然后点“写”按钮,如果写成功,在最下面状态值:write memory success,此时单标签读取,会出现刚刚修改的数据。
     

 (注:这里修改EPC时,博主很久都没有成功,一直以为是哪个步骤头问题,实则不是,你所想写入的电子标签一定在读卡器范围里面,且只有它被读取,而且先在此界面把选择点上对勾,然后点单标签读取,之后再点现在的EPC,最后在写入。这里的几个点一定得多做几遍,因为写入不是一次就能成功的,需要鼠标一直点写入,说不定哪次就成功了。最主要的是,有可能不是一次就改成你所想改成的EPC,可能刚开始会改一部分,你只能把选择的对勾取消之后看看现在的EPC是多少了。)

好的,进行到这一步,电子标签已经按照你的想法初始化完成了。

第二步:在Raspberry Pi 4B上写串口命令,实现R200通讯协议。

树莓派接RFID模块进行写码这个需要看RFID模块引脚图以及引脚定义,比如:

串口需要接5个引脚,对应关系如下:

1).rfid的5v -> 树莓派的5v

2).rfid的gnd -> 树莓派的gnd

3).rfid的tx -> 树莓派的rx

4).rfid的rx -> 树莓派的tx

接线接好之后就可以在树莓派中写串口代码控制RFID了,这个需要去看对应的RFID模块的串行接口通讯协议文档。 比如:

命令帧(树莓派给R200)一共7个字

 响应帧(R200给树莓派)一共8个字

 上位机指令数据包格式如上,那么在树莓派中就可以用串口发命令了。对于代码段有不懂的可以私信我嗷!

import serial
import time

while True:
    ser = serial.Serial('/dev/ttyAMA0',115200,timeout=0.5)
    ser.isOpen()
    ser.write(bytearray.fromhex('BB 00 27 00 03 22 FF FF 4A 7E'))    #命令帧
    ser.inWaiting()
    version = ser.read(24)
    ser.close()
    xianshi =version[8]     #16进制                1号鹅:8-18字 全是0001 0001  就是 17
    print(xianshi)          #16进制                2号鹅:8-18字 全是0010 0010  就是 34
    print(version)          #16进制                3号鹅:8-18字 全是0011 0011  就是 51
    if xianshi==17:
        print("1 goose")     #这里用了三个电子标签作为3只鹅的识别
        time.sleep(4)
    if xianshi==34:
        print("2 goose")
        time.sleep(4)
    if xianshi==51:
        print("3 goose") 
        time.sleep(4)
    time.sleep(0)
    
    
def uchar_checksum(data, byteorder='little'):
    length = len(data)
    checksum = 0
    for i in range(0, length):
        checksum += int.from_bytes(data[i:i+1], byteorder, signed=True)
    checksum = ((~checksum) + 1 ) & 0xFF
    return hex(checksum)

 

下面我放一些常用的命令帧
1. 单次读取卡号
Send:BB 00 22 00 00 22 7E
如果读到卡,模块回复:
BB 02 22 00 11 DC 30 00 00 00 00 00 00 00 00 00 00 00 00 00 0D AD FB 7E
BB 02 22 :是包识别符,长度3个字节;
00 11 :是包长度,16进制,0x11表示 17个字节,长度2个字节;
DC:
30 00:PC
00 00 00 00 00 00 00 00 00 00 00 00 00:卡号(EPC),可修改,占12个字节(通过修改EPC来改卡号)
0D AD:卡号的CRC
FB:Checksum;
7E;结束符;
如果读不到卡,或者无卡,模块回复:
BB 01 FF 00 01 15 16 7E
一共8个字节;

2. 群读卡号
Send:BB 00 27 00 03 22 FF FF 4A 7E
BB 00 27 :帧标志,3个字节;
00 03:数据长度,2个字节;0003表示3个字节;
22:保留字节;
FF FF : 读取次数,连续读取65535次;如果连续读取100次,填入00 64;
4A:Checksum,00 27 00 03 22 FF FF 每个字节都累加起来,得到0x024A;支取低8位 4A;
7E:结束符

Recv: BB 01 FF 00 01 15 16 7E
BB 01 FF 00 01 15 16 7E
.
.
.
BB 02 22 00 11 C8 34 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 16 3D D3 7E
BB 01 FF 00 01 15 16 7E
BB 02 22 00 11 C9 34 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 16 3D D4 7E
BB 02 22 00 11 C0 34 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 16 3D CB 7E
BB 01 FF 00 01 15 16 7E
发出连读读取帧后,会联续的接收到收到两种类型的包。
BB 01 FF 00 01 15 16 7E
这是其中一种,表示读取失败;
BB 02 22 00 11 C0 34 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 16 3D CB 7E
这是另外一种,表示读到卡号:
具体格式与单次读取卡号的回复包相同;
BB 02 22:帧标志,3个字节;
00 11:数据长度,11 表示16进制,实际为17个字节;
C0:信号强度;RSSI,一个字节;
34 00:PC,2个字节;
E2 00 10 71 00 00 52 9B 09 40 B4 02:卡号,12个字节;
16 3D :CRC2个字节;
CB:Checksum,02 ~ 16 3D 累加,取低8位;
7E:结束符;

3 .结束群读
Send: BB 00 28 00 00 28 7E
由于群读次数多时,操作时间会很长,客户可以发送该指令结束群读指令;
Recv: BB 01 28 00 01 00 2A 7E
模块执行结束群读指令的回复。

4. Read读卡内容
Send :BB 00 0C 00 07 23 00 00 00 00 60 00 96 7E (选择命令)
BB 00 39 00 09 00 00 00 00 03 00 00 00 04 49 7E (读命令)
其实是发送了两包数据,第一包是Select Set;第二包是写入包。Select Set的详细信息请参考上面Select Set的帧解析;下面介绍读取包:
BB 00 39 :是包识别符,长度3个字节;
00 09 :是包长度,16进制,0x09表示 9个字节,长度2个字节;
00 00 00 00:是访问密码(默认是00 00 00 00),长度4个字节;
03 : 表示选择用户存储区;
00 00 :表示读取的存储区的地址偏移量,00 00 指从0地址开始写入;
00 04 :表示去读的数据长度,00 04 表示写入4个字(8个字节);
49:Checksum,计算公式是,Checksum字节前面的所有字节,除了第一个字节BB外,每个字节的累加,结果只取低8位;
比如:00 39 00 09 00 00 00 00 03 00 00 00 04 累加的结果是:0x49,所以 Checksum就是0x49;
7E :结束字符;

Recv:BB 01 0C 00 01 00 0E 7E
BB 01 39 00 17 0E 34 00 E2 00 00 16 55 11 02 06 03 90 EA AF 01 02 03 04 05 06 07 08 49 7E
读取成功会接收到其实是2包,第一包是Select Set 的响应包;第二包是读取成功的响应包:
BB 01 39 :是包识别符,表示读取成功,长度3个字节;
00 17 :是包长度,16进制,0x17表示 23个字节,长度2个字节;
0E :PC+卡号的长度,16进制,0x0E表示 14个字节,长度1个字节;
34 00: 是PC值,这里不作解析,可以不处理;
E2 00 ~ EA AF :是成功写入的卡号,一共12个字节;
01 02 03 04 05 06 07 08 : 是读取的具体数据,一共8个字节。
49: Checksum;
7E:结束符;
读取失败会收到:
BB 01 0C 00 01 00 0E 7E
BB 01 FF 00 10 09 0E 34 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 AA 7E
读取失败接收到其实是2包,第一包是Select Set 的响应包;第二包是读取失败的响应包:
BB 01 FF :是包识别符,表示出错,长度3个字节;
00 10 :是包长度,16进制,0x10表示 16个字节,长度2个字节;
09: 错误码: 0x09表示没找到卡;
0x16表示 访问密码错误;
0xA3表示超出读写范围;

5. Write写入内容
写入标签数据存储区的数据长度 DT 应不超过 32 个 word,即 64Byte 字节
Send:BB 00 0C 00 07 23 00 00 00 00 60 00 96 7E (选择命令)
BB 00 49 00 11 00 00 00 00 03 00 00 00 04 01 02 03 04 05 06 07 08 85 7E (写命令)
其实是发送了两包数据,第一包是Select Set;第二包是写入包。Select Set的详细信息请参考上面Select Set的帧解析;下面介绍写入包:
BB 00 49 :是包识别符,长度3个字节;
00 11 :是包长度,16进制,0x11表示 17个字节,长度2个字节;
00 00 00 00:是访问密码(默认是00 00 00 00),长度4个字节;
03 : 表示选择用户存储区;
00 00 :表示写入的存储区的地址偏移量,00 00 指从0地址开始写入;
00 04 :表示写入的数据长度,00 04 表示写入4个字(8个字节);
01 02 03 04 05 06 07 08 :是写入的数据;
85:Checksum,计算公式是,Checksum 字节前面的所有字节,除了第一个字节BB外,每个字节的累加,结果只取低8位;
比如:00 49 00 11 00 00 00 00 03 00 00 00 04 01 02 03 04 05 06 07 08 累加的结果是:0x85,所以 Checksum就是85;
7E :结束字符;

Recv:写入成功会收到:
BB 01 0C 00 01 00 0E 7E
BB 01 49 00 10 0E 34 00 E2 00 00 16 55 11 02 06 03 90 EA AF 00 2E 7E
写入成功会接收到其实是2包,第一包是Select Set 的响应包;第二包是写入的响应包:
BB 01 49 :是包识别符,表示写入成功,长度3个字节;
00 10 :是包长度,16进制,0x10表示 16个字节,长度2个字节;
0E :PC+卡号的长度,16进制,0x0E表示 14个字节,长度1个字节;
34 00: 是PC值,这里不作解析,可以不处理;
E2 00 ~ EA AF :是成功写入的卡号,一共12个字节;
00 : 表示操作成功;
2E : Checksum;
7E:结束符;

到这里,差不多就对RFID与树莓派的通信有了一定基础和认识,希望对于大家之后的学习有帮助!

还请大家记住我这个喜欢在深夜搞事情的快乐科研喵😋!

  • 6
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
安卓UHF超高频标签读取是指利用安卓系统设备与UHF超高频标签读写器结合,通过相应的应用程序实现对UHF超高频标签的读取和写入操作。这种技术可以在不同的场景下应用,比如物流管理、仓储管理、智能交通等领域。 实现安卓UHF超高频标签读取的demo通常包括以下几个关键步骤: 1. 设备准备:首先需要一台安卓系统的智能手机或平板电脑,并连接一个UHF超高频标签读写器,通常通过USB或蓝牙进行连接。 2. 开发应用程序:开发人员需要编写一个安卓应用程序,通过该应用程序实现与UHF超高频标签读写器之间的通讯,包括对标签进行读取和写入操作。编写应用程序可以使用安卓开发工具包(Android SDK)以及相关的UHF标签读取的API。 3. 进行标签读取:通过开发的应用程序,在安卓设备上进行UHF超高频标签的读取操作,可以获取标签的唯一识别码、存储信息、温度等数据。 4. 数据处理和展示:读取到的标签数据可以进行处理和展示,比如通过应用程序界面展示标签的信息,或者将数据上传至服务器进行进一步处理和管理。 通过这样的demo,可以演示安卓设备与UHF超高频标签读写器的连接和数据读取过程,为后续的实际应用提供参考和基础。同时,这种技术的应用也有助于提高物流管理和仓储管理的效率,为智能物联网领域的发展提供了有力支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐科研喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值