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++ PB Delphi VB VB.NET
byte byte byte byte
int int integer long integer
long long longint long
string char string string
bool boolean boolean boolean boolean
char * Pchar string string
HANDLE long integer
unsigned char string string
LPSTR PChar string string
API与C#的数据类型对应关系表
API数据类型 类型描述 C#类型 API数据类型 类型描述 C#类型
WORD 16位无符号整数 ushort CHAR 字符 char
LONG 32位无符号整数 int DWORDLONG 64位长整数 long
DWORD 32位无符号整数 uint HDC 设备描述表句柄 int
HANDLE 句柄,32位整数 int HGDIOBJ GDI对象句柄 int
UINT 32位无符号整数 uint HINSTANCE 实例句柄 int
BOOL 32位布尔型整数 bool HWM 窗口句柄 int
LPSTR 指向字符的32位指针 string HPARAM 32位消息参数 int
LPCSTR 指向常字符的32位指针 String LPARAM 32位消息参数 int
BYTE 字节 byte WPARAM 32位消息参数 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-11 Created
''' </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-11 Created
''' </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-11 Created
''' </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
6.总结
刚进公司时我接了新的任务,那是我以前从没接触到,也一点都不了解的门锁接口开发,项目经理给我指明了方向后就靠我自己去学习,去熟悉。一做就是做了半年,为20多个客户,差不多二十个门锁品牌做了门锁接口开发。刚开始时的压力只有我自己才知道,现在的熟练是建立在一次一次的摸索基础上。当然我不敢说我是做得最牛的(虽然项目经理是这样说我,哈哈),但我觉得我真的学到很多东西,这也是我认为最重要的,做软件这一行,要学的东西实在太多了。我感觉到以后我可能再没有机会做门锁接口开发了,在这知识共享的世界里,我也拿出一点点与大家分享,也算给自己留个纪念。哈,也应经理所说的:走后也留下一点光和热!
11 个解决方案
#1
ERP系统关键在业务流程,应该进行一定的知识积淀
#2
up
#3
up
#4
顶楼主。
#5
顶,虽然现在用不到。
#6
我最近要做门锁接口,朋友加我QQ,QQ号码:89358767
#7
个人觉得CODER是最基本的功底,但到高处还得能把握全局才行啊。
#8
UP!
#9
我在公司也接到了这个任务,楼主可以交流下吗?QQ 75189043
#10
好久没有回来看过这贴了,挺怀念做门锁接口。
#11
想一起探讨技术的,请加我QQ:389849837
#1
ERP系统关键在业务流程,应该进行一定的知识积淀
#2
up
#3
up
#4
顶楼主。
#5
顶,虽然现在用不到。
#6
我最近要做门锁接口,朋友加我QQ,QQ号码:89358767
#7
个人觉得CODER是最基本的功底,但到高处还得能把握全局才行啊。
#8
UP!
#9
我在公司也接到了这个任务,楼主可以交流下吗?QQ 75189043
#10
好久没有回来看过这贴了,挺怀念做门锁接口。
#11
想一起探讨技术的,请加我QQ:389849837