酒店智能门锁/门禁智能系统开发实例

来源:互联网 发布:大数据的潜在产值 编辑:程序博客网 时间:2024/04/28 18:02

一。酒店智能门锁/门禁智能系统开发需要技术基础有:

       1.RFID系统技术基础(常用125KHz和13.56M)

       2.八位微处理器开发技术,如C51或者AVR C语言编程技术

      3.酒店智能门锁管理软件,常用VB/VC/VS2005/VS2008/DEPHI开发,还需要懂数据库,如SQL

      4.卡片知识  ID卡 H4001/

                           IC卡T5557/E5550/

                           Mifare I 卡S50/S70


二。技术详解(以低频125KHz为例解剖电子门锁的核心技术)

     1.RFID系统原理(详见电子书《无线射频识别技术理论与应用》)




     射频识别系统(RFID)一般由阅读器(PCD)和应答器(PICC)两部分组成。一台典型的阅读器包含有高频模块(发送器和接收器)、控制单元以及与应答器连接的耦合元件[1]。应答器是射频识别系统真正的数据载体。通常,应答器由耦合元件以及微电子芯片组成。应答器没有自己独立的供电电源,只是在阅读器的响应范围之内,接收来自阅读器的射频电源。应答器工作所需的能量,如同时钟脉冲和数据一样,是通过耦合单元非接触传输而获得的[2],因此,实现耦合的元件——天线,在本系统中具有关键作用。天线的设计直接关系到系统的通信距离和数据传输的可靠性。下面主要以射频基站芯片U2270B为例,讨论射频识别系统的天线设计。

阅读器基站天线是由电感、电容和电阻组成的串联谐振电路,如图1所示。其特性用谐振频率fo和Q因子表示[3]。fo是RFID系统的工作频率,由天线的电感和电容共同决定,可以由式(1)来计算:


    在RFID系统中有两个LC电路:由基站线圈和连接电容组成的LRCR电路以及由应答器线圈和连接电容组成的LTCT电路。在单线圈系统中,要求两个LC电路调谐在相同的谐振频率上。如果基站和应答器的谐振频率不匹配,零调制就会产生,从而降低系统的性能。在系统设计成型后,天线的电感是固定的,因此要改变LC电路的谐振频率,只有调节回路中的电容量。



  

一般设计采用阅读器工作在单一频率的模式,对U2270B而言,可以取,fo=125 kHzQ因子(QR)与天线的带宽B和谐振频率fo的关系为B=foQR。高QR值会得到较高的阅读器天线电压,从而可增加传输到应答器的能量。高QR值的缺点是减小了天线带宽,进而当应答器频率发生偏移时减小了应答器所感应的数据信号电压,从而导致射频卡的解调困难[4]而无法正常工作。耦合因子为阅读器基站的电磁场产生线圈和应答器线圈之间的耦合,耦合因子取决于系统的结构参数,直接影响阅读器与应答器的阅读距离。优化耦合因子将对能量传输通道和信号传输通道有利。为确定耦合因子,可利用Temic公司提供的试验应答线圈(TTC)及电路进行测试。QR的取值范围要控制在515,一般取QR=12,可以适合于大多数应用情况的要求。如果天线的电感确定,那么QR因子可以通过式(2)RR进行调整:



  2.曼码调制的非接触式IC卡的译码及C51编程技术详解

    曼码---------曼切斯特编解码的简称,非接触式IC卡实现原理通常用它来编码和解码。酒店智能门锁电路图和门禁系统类似,区别是门禁系统使用的是类似4001的ID卡,只能读数据,不可以保存和写数据,而酒店智能门锁用的是IC卡比如T5567/T5577,可进行读写操作.因为产品涉及公司的商业秘密,现只介绍一下ID卡H4001的读操作,但原理是一样的,举一反三嘛大笑,在此电路的基础上增加LCD12864和RS232串口或者以太网网络ENC28J60模块,就可以构成一个很实用的网络型RFID门禁系统或者酒店智能门锁系统,具体要增加什么模块,当然要看应用场合。




     

曼切斯特解码方法如下:

  根据曼彻斯特_码的特点,得知曼彻斯特_码中高电平持续的时间有两种情况:半个位周期和一个位周期。高电平持续一个位周期的情况是因为其中前面半个位周期高电平属于前一位逻辑“0”所有,后半个位周期高电平是属于后一位逻辑“1”所有。根据这个特点,我们分析下图所示的波形, 首先找一个下跳,然后找一个上跳,目的是确认是否接收到信号(曼彻斯特_码)。而后进入一个延时阶段t(延时t大于半个位周期,小于一个位周期)。接着读入信号,它必须是“1”。 那么这个“1”就肯定是数据序列中某一位(如果不是“1”,就从头再来)接下来就是找该位“1”的下跳,找到之后又延时t,继续读入下一位数据。重复找跳变和延时的操作,就可以正确地读出曼彻斯特_码序列。由于H4001在电磁场中是连续循环地输出它的信息的,为了确保完全读入卡上64位的信息,我们每张卡都读128位,波形图如下:




解码程序范例及分析如下:

解码程序结果放在 

unsigned long Id[2]={0,0};    //存放ID内码 共64 BIT
没有做检验,因为最终目标是复制用,所以所有数据全部读进来共64BIT,包括前面那9个1。 由于2270芯片,没卡时也会一直有杂波,所以正好下面的函数不需要做错误退出延时处理了, 如果没有杂波,那就说明读卡电路不正常程序经过逻辑分析仪分析,速度一流,载波使能后第一个完整周期就能够正确捕获。 也就是说,平时将2270的CFE置0,要读卡时再置1,再调用该函数就行。 商业的好象半秒读一次。这样省电。

#define Manchester_IN (PIND&(1<<PD2))   //曼彻斯特_码输入端
#define DELAYVALUE 350     //RF64 一个位=512us * 0.75 不用很严格,大于半个周期,小于一个周期就行。
                           //跟实际的读卡器的125K载波精确度相关,也与卡本身相关
unsigned long Id[2]={0,0};    //存放ID内码 共64 BIT
int ReadAllCode(unsigned long iid[]){    //读所有数据 读到正确号 返回1 
    int k,i,j;
    for(k=0;k<200;k++){    //找01 找200次,不能小于100,再大无意义
        while(Manchester_IN);     //找下降
        while(!Manchester_IN);    //找上升
        delayMicroseconds(DELAYVALUE);    //等 T 
            //digitalWrite(TPin, HIGH); 
            //digitalWrite(TPin, LOW); 
        if(Manchester_IN){   //是否找到01
            //Serial.println("Found 01");
               // digitalWrite(TPin, HIGH); 
               // digitalWrite(TPin, LOW); 
            for(i=0;i<8;i++){    //再找8次1
                while(Manchester_IN);     //找下降
                delayMicroseconds(DELAYVALUE);    //等 T 
                //digitalWrite(7, HIGH); 
                //digitalWrite(7, LOW); 
                if(!Manchester_IN)   //不是1就重找01
                    break;    
            };
            if(i==8)
                break;     //退出01循环,解数据体
        };
        
    }
    if(k>=200)           //未找到01与9个1
        return 0;
    //以上找数据头
   
      
    digitalWrite(TPin, HIGH); //测试用,这样用逻辑分析仪就能看到我的程序运行到哪儿了,找到了什么波形 分析起来很方便。
    
    //以下为读真正的数据共  64-9=55bit
    //9个1
    iid[0]=0x1ff;    //9个1
    iid[1]=0x0;
    
    while(Manchester_IN);     //找下降
    for(i=0;i<2;i++) {   //共找2 长整型(32bit)  实际是找 55 bit
        for( j=0;j<32;j++){    //找32位
            if((i==0) && (j==23)) //第一位只要读23位,前面是9个1
               break ; 
               
            delayMicroseconds(DELAYVALUE);    //等 T 
            iid[i]<<=1;            
            if(Manchester_IN) {  //是1
                iid[i]|=1;  
                while(Manchester_IN);    //等下降
            }else{                 //是0
                while(!Manchester_IN);     //等上升   
            };   
        };
        //digitalWrite(7, HIGH);
        //digitalWrite(7, LOW);
    } ;
    //delayMicroseconds(5);  
    digitalWrite(TPin, LOW);        
    return 1;
    
}  //ReadAllCode()


实验的测试结果如下:

1.没放4001卡时用示波器实测的波形如下:


    

2.放4001卡时实测的波形:



实验OK!现在说得好象很轻松,俺开始因为对时序理解有偏差,调试好几天失败后才研究时序问题,解决问题后的那种因成就快乐感觉不是金钱能能买到的,感谢网友们的支持,没有你们支持俺或者没有这么大的工作激情!大笑大笑值得庆祝一下吧,咱们干杯!


3.酒店智能门锁管理软件的开发

上位机开发俺并不是高手,如果有说错的,大家给俺指出来。

参照网上有关电子门锁的建议和实例,和上位机的程序员商量用何种语言编写,最后决定用VS2008和SQL2005来完成,当然软件功能的实现应该由软件工程师来完成。但要注意通常PC机编程人员对硬件不太了解,因此酒店门锁管理接口需要硬件开发人员来完成通信接口的设计,和软件开发人员协商确定通信协议,此接口在很多星级酒店中需要和他们的酒店管理软件对接,如果不能提供此接口,相信大多数星级酒店会让你损失订单。在酒店方向门锁厂商索要接口开发包后,并会让自己的技术人员自行测试接口开发包是否与门锁系统匹配,详见《制作门锁接口注意事项》。

    如果接口开发包没有问题,厂商会根据该接口开发包制作接口安装包。在酒店方安装好我方实现的接口后,还需按以下步骤进行设置和测试:

   通过[系统管理->系统参数设置]菜单打开“系统参数设置窗口”(下图1)。洗浴管理系统然后门锁接口选择“仅启用门锁接口” 选项,门锁类型选择“雅洁门锁”,再单击旁边的按钮打开门锁设置窗口。 
注意:如果要严格门卡控制,请选中“客人登记保存时才允许制卡”和“结帐退房时需注销门卡”选项。


                                                图1 系统参数设置

2.在电子门锁参数设置窗口(图2)中, 选择串口号,然后打开串口。
打开串口成功后,读授权卡,然后测试读卡和制卡。
测试读卡时应该拿一张事先制好的、能够正常开门的宾客卡来测试。
读卡测试成功后再测试制卡。测试时,可调整结束时间,门锁管理系统下载其他参数保持不变。制卡成功后应开门试试,确保能正常开门。(例如酒店使用雅洁的电子门锁,有时酒店选择酒店管理软件供应商和电子锁的供应商不是同一供应商)
需要注意的是:测试时如果门锁系统在运行,必须先退出,否则会测试不成功。


3.门锁测试成功后,还需建立房号对应关系。

  1. 打开酒店管理系统安装目录下的Rooms.ini,按如下格式建立对应关系:
    [Rooms] 
    A1=B1,F1,R1
    A2=B2,F2,R2
    … 
    An=Bn,Fn,Rn
    其中, Ai为酒店管理系统的房号; 
           Bi为Ai在门锁系统中对应的楼栋号;
           Fi为Ai在门锁系统中对应的楼层号;
           Ri为Ai在门锁系统中对应的房号。

     在完成上述步骤后,门锁接口设置工作才算完成。保存设置并退出系统,然后重新登录,就可在酒店管理系统中读卡和制卡了。


  1. 开发酒店智能门锁系统软件时需要先做好软件系统的架构规划,将基本功能实现以后,再做一些扩展功能,来增强软件的功能。因文章太长,要花费很多时间整写作,各位也可能感觉太烦,本人有空时另外再写。


 4.卡片知识T5557/T5567/T5577

网上资料很多,大家找一下吧,这里不介绍拉。



原创粉丝点击