标题 | 基于ARM的RFID系统设计与实现 |
范文 | 谢文俊++王会燃 摘 要:设计了一种基于ARM的RFID系统。系统由采集节点、路由部分、协调部分、PC组成,采集节点和路由部分采用LM3S811芯片,协调器部分采用LM3S9B96芯片。各部分间通信采用可靠性和安全性很高,且功耗低的ZigBee无线网络,射频收发器采用CC2420,可以实现快速组网,且性能稳定、抗干扰能力强。系统功耗低、数据处理能力强、易于封装,可有效提升门磁系统的安全性。 关键词:RFID; LM3S811; LM3S9B96; Zigbee; CC2420;门磁 DOIDOI:10.11907/rjdk.1511029 中图分类号:TP319 文献标识码:A 文章编号文章编号:1672-7800(2015)012-0145-04 1 开发平台 系统由4大部分组成:位于最底层的传感器采集节点、中间的路由节点、将数据传送到PC机的协调器节点以及PC机。系统框架如图1所示。 协调器与PC机的通讯可采用UART或USB方式,其它各个部分之间都采用ZigBee网络方式。整个系统除PC机外的其它部分都采用低功耗、小封装的Cortex-M3芯片作为主控芯片。其中的采集节点和路由节点采用LM3S811,协调器节点采用内部集成以太网和USB控制器的LM3S9B96。 1.1 Cortex-M3介绍 Cortex-M3内核由ARM公司于2005年推出,是整个Cortex内核系列中的微控制器系列(M)内核。该处理器采用纯Thumb2指令的执行方式,使这个具有32位高性能的ARM内核能够实现8位和16位的代码存储密度,并且它使用最少门数的ARM CPU,核心门数只有33K,在包含了必要的外设之后的门数也只有60K[1],使得封装更为小型化。 Cortex-M3采用ARM V7哈佛架构,具有带分支预测的3级流水线,内核流水线分为3个阶段:取指、译码和执行。当遇到分支指令时,译码阶段也包含预测的指令取指,从而提高了执行速度。处理器在译码阶段自行对分支目的地指令进行取指。在稍后的执行过程中,处理完分支指令后便知道下一条要执行的指令。如果分支不跳转,则紧跟着的下一条指令随时可供使用;如果分支跳转,则在跳转的同时分支指令可供使用,空闲时间限制为一个周期[2]。 1.2 CC2420介绍 CC2420是Chipcon As公司推出的首款符合2.4GHz IEEE802.15.4标准的射频收发器[3]。它基于Chipcon公司的SmartRF 03技术,能工作于2.400~2.4835GHz的频带范围,采用IEEE 802.15.4规范要求的直接序列扩频方式,数据速率达250kbps,码片速率达2MChip/s,抗邻频道干扰能力强,性能稳定,功耗低,灵敏度高,输出功率编程可控,可确保短距离通信的有效性和可靠性。利用此芯片开发的无线通信设备支持数据传输率高达250kbps,可实现多点对多点的快速组网。 图1 系统框架 1.3 节点介绍 协调器主要负责将路由器或采集节点上传的数据发送到上位机,因此采用集成USB控制器的LM3S9B96芯片。协调器节点结构如图2所示。 图2 协调器节点结构 UART单元主要完成LM3S9B96与PC机通信或控制实验箱上的外扩WiFi模块,所采用芯片为MAX3232;JTAG是LM3S9B96的下载口,采用标准20针的JTAG下载口,通过J-LINK或M3-LINK仿真器对程序进行下载或仿真。 路由器主要用于接收采集节点发送过来的信息,然后再将该信息发送到协调器上,最后由协调器发送到PC机,因此路由器采用LM3S811作为主控制器。采集节点主要负责传感器信号的采集与传送,因此也使用LM3S811作为主控制器,采集节点结构如图3所示。 2 RFID(125KHz)与ZigBee 2.1 RFID(125KHz) RFID通过在物品上嵌入电子标签、条形码等能够存储物体信息的标识,通过无线网络的方式将其即时信息发送到后台信息处理系统,而各大信息系统可互联形成一个庞大的网络。 图3 采集节点结构 RFID技术的工作原理是:电子标签进入读写器产生的磁场后,接收解读器发出的射频信号,凭借感应电流所获得的能量发送出存储在芯片中的产品信息,或主动发送某一频率的信号;解读器读取信息并解码后,送至中央信息系统进行相关数据处理[4]。 2.2 ZigBee ZigBee是一种新兴的短距离、低功耗、低数据速率、低成本、低复杂度的无线网络技术。它工作于2.4 GHz的免执照频段,可以容纳高达65 000个节点。这些节点的功耗很低,且具有很高的安全性和可靠性。 在Zigbee网络中,节点分为3种类型:协调者、路由器和终端节点。其中,ZigBee 协调者(coord)为协调者节点,每个ZigBee网络必须有一个,主要作用是初始化网络信息;ZigBee 路由器(router)为路由节点,其作用是提供路由信息;ZigBee 终端节点(rfd为终端节点)没有路由功能,完成整个网络的终端任务。 ZigBee的体系结构由称为层的各模块组成。每一层为其上层提供特定的服务,即由数据服务实体提供数据传输服务;管理实体提供所有其它管理服务。每个服务实体通过相应的服务接入点(SAP)为其上层提供一个接口,每个服务接入点通过服务原语完成对应的功能[5]:①物理层(PHY):物理层定义了物理无线信道和MAC子层之间的接口,提供物理层数据服务和物理层管理服务;②介质接入控制子层(MAC):MAC层负责处理所有的物理无线信道访问,并产生网络信号、同步信号,支持PAN连接和分离,提供两个对等MAC实体之间的可靠链路;③网络层:ZigBee协议栈的核心部分在网络层。网络层主要实现节点加入或离开网络、接收或抛弃其它节点、路由查找及传送数据等功能;④应用层:除了提供一些必要函数以及为网络层提供合适的服务接口外,一个重要的功能是应用者可在该层定义自己的应用对象。 3 设计与实现 首先对系统的总体功能进行大致规划,这些功能包括以下方面:①主机通过串口收集数据;②分析解析数据包;③查看特定终端(用户可选择)网络节点的控制与采集信息;④查看路由节点的控制信息与子节点相关信息。 static void taskForm (void *parg) { EVB_LED1_OFF(); GucIfSuccess = 0; aplFormNetwork(); while(apsBusy()) {apsFSM();} conPrintROMString("Network formed,waiting for RX\\n"); conPrintROMString("#00000&000$0000*0000000%\\n"); GucIfSuccess = 1; EVB_LED1_ON(); aplSetMacMaxFrameRetries(0); while (1) {apsFSM();} } 协调器首先完成初始化目标单片机、组网等任务,并告知主机组网结果。这里定义通信数据包的格式如下: #00000&000$0000*0000000% 格式内容具体解析如下:①#(协议包起始符);②路由器位:字符变化范围为00~99,表示此数据帧最多可以扩展99个路由节点。若路由器位信息为“00”,则表示没有通过路由,直接与协调器连接;③源端点物理编号位:终端节点的物理编号字符变化范围为000~999,表示此数据帧可以扩展1 000个终端节点;④传感器类型位:前两位字符代表采集点传感器类型,后一位字符代表传感器的工作方式。此数据帧可扩展99种不同类型的传感器,并且每种传感器最多有10种工作方式;⑤$(静态短地址起始符);⑥短地址:表示终端节点的16位2进制短地址,并转化为4位16进制,然后以字符形式表示;⑦*(采集信息开始位);⑧采集信息位:8位数据内容可以带小数点(此时已转换为字符);⑨%(协议包结束符)。 解析代码如下: void CIOTMonitoringDlg::AnalysisPacket(char *ptrData) { int Dataflag=0; ptrData= RecvDataPacket; char *ptrSAddr=SAddrTmp; char *ptrSenType=SenTypeTmp; char *ptrSenData=SenDataTmp; char *ptrEndNum=EnddNumTmp; while(*ptrData!='\\0') { switch(*ptrData) { case '#': Dataflag=1; ptrData++; break; case '&': Dataflag=2; ptrData++; break; case '$': Dataflag=3; ptrData++; break; case '*': Dataflag=4; ptrData++; break; case '%': Dataflag=5; break;} switch(Dataflag) { case 1: *ptrEndNum=*ptrData; ptrEndNum++; break; case 2: *ptrSenType=*ptrData; ptrSenType++; break; case 3: *ptrSAddr=*ptrData; ptrSAddr++; break; case 4: *ptrSenData=*ptrData; ptrSenData++; break; } ptrData++; } } 路由节点在完成各项初始化工作后,通过ZigBee网络接收来自采集节点的数据,然后根据数据包格式对用户数据进行格式化,最后通过ZigBee网络将格式化后的数据发送给协调器,相应过程如下: void aplFormatUserPacket(unsigned char *payload,unsigned char *data,unsigned char senType[4]) { unsigned char i=0,c; unsigned int temp,temp2; *payload='#'; payload++; *payload='0'; payload++; *payload='0'; payload++; #ifdef LRWPAN_ROUTER temp = 0; #else temp= aExtendedAddress_B0; #endif *payload='0'+temp/100; payload++; temp=temp%100; *payload='0'+temp/10; payload++; temp=temp%10; *payload='0'+temp; payload++; *payload='&';payload++; *payload=senType[0]; payload++; *payload=senType[1]; payload++; *payload=senType[2]; payload++; *payload='$';payload++; temp=aplGetMyShortAddress(); temp2 = temp >>8; c = (temp2>>4)& 0xf; if (c > 9) {*payload='A'+c-10;payload++;} else {*payload='0'+c;payload++;} c = temp2 & 0xf; if (c > 9) {*payload='A'+c-10;payload++;} else {*payload='0'+c;payload++;} temp2 = temp; c = (temp2>>4)& 0xf; if (c > 9) {*payload='A'+c-10;payload++;} else {*payload='0'+c;payload++;} c = temp2 & 0xf; if (c > 9) {*payload='A'+c-10;payload++;} else {*payload='0'+c;payload++;} *payload='*';payload++; for(i=0;i<7;i++) {if(*data=='\\0') break; *payload=*data; payload++; data++;} for(;i<7;i++){ *payload='0';payload++;} *payload='%';payload++;*payload='\\0'; } RFID(125KHz)模块通过传感器/ZigBee接口置于采集节点上,当在有效的刷卡范围内有卡出现时,采集节点上的LED灯点亮,并通过ZigBee网络将卡内数据传送到路由节点。如果卡一直检测有效,LED灯则一直点亮,但只输出一次有效的数据;不再刷卡后,灯熄灭,重新刷卡后继续送出卡号,过程如下: void getRFID125KData() { unsigned char ucData[10],i,c,buffer[4] ,payload[60]; char cbuffer[10];unsigned long num; SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); GPIOPinTypeGPIOOutput(buzzer_PORT,buzzer_PIN); GPIOPadConfigSet(buzzer_PORT,buzzer_PIN,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPU); uartInit(); for(i=0;i<4;i++){ c = uartGetc(); UARTCharPut(UART0_BASE,c); buffer[i] = c; } GPIOPinWrite(buzzer_PORT,buzzer_PIN,0x00); SysCtlDelay(50 * (SysCtlClockGet( )/3000)); GPIOPinWrite(buzzer_PORT,buzzer_PIN,0xFF); num=0; for(i=0;i<4;i++) { num <<=8; num |=0xFF; num &=(buffer[i] | 0xFFFFFF00); } cbuffer[0]= num/1000000000+'0'; num=num%1000000000; cbuffer[1] = num/100000000+'0'; num=num%100000000; cbuffer[2] = num/10000000+'0'; num=num%10000000; cbuffer[3] = num/1000000+'0'; num=num%1000000; cbuffer[4] = num/100000+'0'; num=num%100000; cbuffer[5] = num/10000+'0'; num=num%10000; cbuffer[6] = num/1000+'0'; num=num%1000; cbuffer[7] = num/100+'0'; num=num%100; cbuffer[8] = num/10+'0'; num=num%10; cbuffer[9] = num/1+'0'; ucData[1] = buffer[2]; ucData[2] = buffer[3]; ucData[3] = '\\0'; for(i=0;i<4;i++){UARTCharPut(UART0_BASE,ucData[i]); } for(i=0;i<10;i++){ ucData[i] = cbuffer[i];} for(i=0;i<10 ;i++){UARTCharPut(UART0_BASE,ucData[i]); } formatData(ucData); conPrintString(ucData); aplFormatUserPacket(payload,ucData,"111");EVB_LED2_ON();sendData(payload); halWaitMs(500); } 4 系统应用 传统门磁主要由磁体和门磁主体组成,在安全性上存在严重不足。非法入侵者可以通过伪造磁体达到欺骗门磁主体的目的,进而实现非法入侵。 RFID电子标签的电子编码具有唯一的特性,电子标签封装于门磁的永磁体内,然后将射频识别系统的阅读器封装于门磁主体内。即使永磁体被伪造的磁体代替,系统也会判断出异常,从而进行报警,达到提高安全性的目的。 用户可以根据自己对安全性的不同需求,考虑在RFID系统中引入加密机制。将电子标签的电子编码通过加密算法(如DES算法、RSA算法等)进行加密,并将密钥初始化,当主机获得电子编码后可以通过解密算法进行解密,安全性可以达到更高级别。 5 结语 Cortex-M3内核主要应用于低成本、小管脚数和低功耗的场合,并且具有极高的运算能力和极强的中断响应能力。Cortex-M3基于ARMV7架构,处理器带有一个分级结构。它集成了名为CM3Core的中心处理器内核和先进的系统外设,实现了内置的中断控制、存储器保护以及系统的调试和跟踪功能。这些外设可进行高度配置,允许Cortex-M3处理器处理大范围的应用并更贴近系统需求,这些特性使Cortex-M3在门磁中的应用可以发挥最大性能。 本文的创新点在于对传统门磁感应技术的不足进行改进,通过在门磁中引入RFID机制使门磁系统在安全性上获得很大提升。针对不同的需求情况,综合考虑成本等因素,用户可以选择不同的加密机制达到不同的安全级别。 参考文献参考文献: [1] [英]JOSEPH YIU.ARM Cortex-M3权威指南[M].宋岩,译.北京:北京航空航天大学出版社,2009. [2] 刘波文.ARM Cortex-M3应用开发实例详解[M].北京:电子工业出版社,2011. [3] Chipcon AS SmartRF CC2420 Preliminary Datasheet (rev 1.2)[Z].2004. [4] 何伟刚.物联网中RFID节点通信安全研究[J].信息安全与技术,2011(7):21-23. [5] 高守玮.Zigbee技术实践教程[M].北京:北京航空航天大学出版社,2009. [6] 宋宝华.Linux驱动开发详解[M].第2版,北京:人民邮电出版社,2010. [7] 徐爱钧,徐阳. Keil C51单片机高级语言应用编程与实践[M].北京:电子工业出版社,2013. (责任编辑:黄 健) |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。