门锁接口资料大放送
今天是在公司的最后一天了,在金融危机爆发的时候我向公司提出了辞职,想想我也感觉到自己太不知天高地厚了。本身自己是08年才毕业,只工作了一年的人,很多人都建议我好好干先,不要急,但人啊,都是过不了自己那一关!明天我将要失业了,慢慢来,给自己鼓气。在广州这间公司我做了半年多了,一直做酒店管理系统的开发,而我又最主要负责门锁接口的开发。算积累了少少这方面的东西吧,在这最后的一天与大家分享下。也希望大家给我指明条方向,我还是想在信息管理系统,ERP这方向发展的,自己也做过小型的ERP系统,酒店系统(包括门锁,公安接口),广州啊,人多车多的地方,总会有容我之处吧!
1.门锁基本知识:
给酒店做的门锁接口主要是做宾客卡的读写操作。
2使用门锁接口的一般步骤
1.设置参数(串口号,密码,标识,门锁类型等)
2.连接设备(打开串口或端口,)
3.调用读卡制卡函数
4.断开连接
3.宾客卡开门条件:
不同的门锁厂商,因其提供的接口的不同,宾客卡的开门条件也不一样。这要求开发人员仔细阅读厂商提供的门锁接口说明书.开门的有效条件大体有如下:
1)卡上房间号和锁内房间号一致
2)卡上开始时间不早于锁内宾客卡开始时间。
3)锁内当前时间在卡上有效时间段内。
4)酒店标识或密码是否正确。
5)遇门锁反锁时,卡上允许开反锁。
4.开不了门的情况:
*最基本情况:
1.参数是否设置正确(包括com口,卡类型,宾馆号,密码等等),注意大小写也要一样
2.接口系统的门锁编号是否设置与厂家的系统的房号对应。
3.时间是否已过了有效期。
*有些品牌的特殊情况:
1.制相同房号的不同卡,后发的卡可能会取代先发的卡,先发的卡开不了门
即:客人的开始时间在后的开门后,客人的开始时间在前的就不能开门。
2.接口门锁系统与厂家的系统不能同时使用做客人卡。做出来的卡会互相干扰,因为所做的客人卡的开始时间会不一致的而导致开不了门,或卡的密码不同。
3.相同房间的,卡号大的取代卡号小的,卡号小的开不了门,
5.门锁接口开发技术说明:
1)门锁API调用
各种语言之间数据类型的转换,这是首先要熟悉的。
C/C++PBDelphiVBVB.NET
bytebytebytebyte
intintintegerlonginteger
longlonglongintlong
stringcharstringstring
boolbooleanbooleanbooleanboolean
char *Pcharstringstring
HANDLElonginteger
unsigned char stringstring
LPSTRPCharstringstring
API与C#的数据类型对应关系表
API数据类型类型描述C#类型API数据类型类型描述C#类型
WORD16位无符号整数ushortCHAR字符char
LONG32位无符号整数intDWORDLONG64位长整数long
DWORD32位无符号整数uintHDC设备描述表句柄int
HANDLE句柄,32位整数intHGDIOBJGDI对象句柄int
UINT32位无符号整数uintHINSTANCE实例句柄int
BOOL32位布尔型整数boolHWM窗口句柄int
LPSTR指向字符的32位指针stringHPARAM32位消息参数int
LPCSTR指向常字符的32位指针StringLPARAM32位消息参数int
BYTE字节byteWPARAM32位消息参数int
接口提供的API一般都是C/C++,delphi的多,上面列出的是常用的,
开发过程中要注意的问题有:
1)c/c++的指针转换问题,vb,vb.net没有指针,应怎转换
2)按值传值,按址传值。
2)门锁提供接口特殊情况
一般的门锁厂家都是提供标准的API接口,但也有特殊的
(1)把各个单独的功能做成独立的exe,在后台调用
(2)Com组件,不用管数据类型的转换。
一个调用api的简单例子:vb.net Code
Public Module mMF1RF
#Region " 公共变量"
Public nBlock As Integer = 1 '为卡片的工作块号,默认1,个别用户的有改变
Public LEVEL_AD As Integer = 0 '开门卡校验的地址级别,填0。(0为房间级)
Public LEVEL_Cipher As Integer = 3 '校验的密码地址级别,填3
Public alwaysOpen As Integer = 0 '为1则该卡为通道卡,一般填0
#End Region
#Region " 写卡"
'1、宾客卡:客人开门卡。
'EXTERN_API int WINAPI KeyCard(int ComNumber,int nBlock,char* CardPassword,char* HotelCode,int Building,int Floor,int Room,
'int Door,int LEVEL_AD,char* Cipher,int LEVEL_Cipher,char* SD,char* ST,int AlwaysOpen,int OpenInner,int NewCard)
''' -----------------------------------------
''' <summary>
''' 宾客卡:客人开门卡。
''' </summary>
''' <param name="comNO">为发卡机与计算机所连接的串口号 </param>
''' <param name="nBlock">为卡片的工作块号,默认1,个别用户的有改变 </param>
''' <param name="cardPW">卡片工作块所在扇区的密钥 </param>
''' <param name="hotelCode">来自数据库msc表的HotelCode,数据库默认路径为C:\HUNELOCK\TDATA,需厂家打开数据库 </param>
''' <param name="building">来自楼栋,楼栋号 <=7 </param>
''' <param name="floor">来自楼层编号的后2位,楼层号 <=63 </param>
''' <param name="room">来自房间编号,房间号 <=99 </param>
''' <param name="door"来自内间号> </param>
''' <param name="LEVEL_AD">开门卡校验的地址级别,填0。(0为房间级) </param>
''' <param name="cipher">房间密码 </param>
''' <param name="LEVEL_Cipher">校验的密码地址级别,填3。(3为房间级) </param>
''' <param name="SD">终止日期,格式“yy-mm-dd”,不能用“yyyy-mm-dd” </param>
''' <param name="ST">终止时间,格式“hh:nn:ss” </param>
''' <param name="alwaysOpen">为1则该卡为通道卡,一般填0 </param>
''' <param name="openInner">为1则该卡可开反锁,一般填0 </param>
''' <param name="newCard">适用于退房卡功能版本的系统,1 为新发卡,0为重发卡 </param>
''' <returns> </returns>
''' <remarks>
''' </remarks>
''' <history>
''' [***]2008-10-11Created
''' </history>
''' -----------------------------------------
Public Declare Function KeyCard Lib "HUNEMF.dll" (ByVal comNO As Integer, ByVal nBlock As Integer, ByVal cardPW As String, _
ByVal hotelCode As String, ByVal building As Integer, ByVal floor As Integer, ByVal room As Integer, ByVal door As Integer, _
ByVal LEVEL_AD As Integer, ByVal cipher As String, ByVal LEVEL_Cipher As Integer, ByVal SD As String, ByVal ST As String, _
ByVal alwaysOpen As Integer, ByVal openInner As Integer, ByVal newCard As Integer) As Integer
#End Region
#Region " 读卡"
'2、获取卡片的卡号。成功则返回0。
'int (*GetCardNumber)(int ComNumber,int* CardNumber) ;
''' -----------------------------------------
''' <summary>
''' 获取卡片的卡号。成功则返回0
''' </summary>
''' <param name="comNo">为发卡机与计算机所连接的串口号 </param>
''' <param name="cardNo">卡号从变量CardNumber返回 </param>
''' <returns> </returns>
''' <remarks>
''' </remarks>
''' <history>
''' [***]2008-10-11Created
''' </history>
''' -----------------------------------------
Public Declare Function GetCardNumber Lib "HUNEMF.dll" (ByVal comNo As Integer, ByRef cardNo As Integer) As Integer
#End Region
#Region " 新发卡的密码生成算法"
''' -----------------------------------------
''' <summary>
''' 新发卡的密码生成公式
''' </summary>
''' <param name="dt">dt=now </param>
''' <returns> </returns>
''' <remarks>
''' 由时间生成密码字符串
''' </remarks>
''' <history>
''' [***]2008-10-11Created
''' </history>
''' -----------------------------------------
Public Function ComPactCipherTime(ByVal dt As DateTime) As String
Dim scipher As String
Dim buffer As String
Dim dw As Integer
Dim year, month, day, hour, min, sec, msec As Integer
year = dt.Year
month = dt.Month
day = dt.Day
hour = dt.Hour
min = dt.Minute
sec = dt.Second
msec = dt.Millisecond '用不上
' < <为向左移位;向左移5位的意义就是乘于2的5次方;
' >>为向右移位;向右移1位的意义就是整除2的1次方;
dw = (sec >> 1) + (min < < 5) + (hour < < 11) + (day < < 16) + (month < < 21) + (((year Mod 1000) Mod 127) < < 25)
'将10进制的数转换位16进制的字符串
buffer = DEC_to_HEX(dw) '或用hex(dw)
Return buffer
End Function
''' -----------------------------------------
''' <summary>
''' 新发卡的密码生成公式C++ Code
''' </summary>
''' <param name="dt">dt=now </param>
''' <returns> </returns>
''' <remarks>
''' 注释:
''' DWORD 为双字节;
''' < <为向左移位;向左移5位的意义就是乘于2的5次方;
''' >>为向右移位;向左移1位的意义就是整除2的1次方;
''' %为求模符号;
''' itoa,将10进制的数转换位16进制的字符串;
''' UpCase,将字符串中的字符转换为大写字母;
''' </remarks>
''' -----------------------------------------
' String CompactCipherTime(TDateTime DT) //新发卡的密码生成公式
'{
' String Scipher;
' char Buffer[16];
' DWORD dw;
' Word Year, Month, Day, Hour, Min, Sec, MSec;
' DecodeDate(DT, Year, Month, Day);
' DecodeTime(DT, Hour, Min, Sec, MSec);
' dw=(Sec>>1)+(Min < <5)+(Hour) < <11}+(Day < <16)+(Month < <21)+(((Year % 1000)%127) < <25);
' itoa(dw,Buffer,16);
' for(int i=0;i <8;i++)
' Buffer[i]=UpCase(Buffer[i]);
' Scipher=Buffer;
' return(Scipher);
'}
#End Region
End Module