LKY蓝客云开放平台11.21更新显示LKY蓝客云酒店管理系统已对接得安智能门锁LockSDK,各位开发者可参考以下内容:
LockSDK 智能门锁管理系统开发包说明文档
请仔细阅读下面的每一条说明, 这样对接就能事半功倍 !!!!!!!!!!
一、重要说明
- 本接口支持各种开发语言, 包括:C#、VC、Delphi7、Delphi2000、0、PB10、VB.net、VB6.0等(每种语言一个文件夹),请选择自己常用的语言的演示程序(Demo)进行测试和开发。
- 接口文件为dll, 而这个接口又会调用底层各种动态库. 酒管软件对接时, 对接到LockSDK.dll上就可以了.
- 请把exe放入发布包, 会自动处理注册, 读取授权卡等操作.
- Demo:测试的时候,请打开任何一种语言的文件夹,找到exe, 双击运行→选择RF57(T5557卡)或者RF50(Mifare卡)门锁类型,点击“配置SDK”按钮,然后就可以进行发卡测试了。一般建议如下图进行设置。
- 新卡顶替旧卡:同一个客房, 入住时间(checkin_time)靠后的宾客卡会使之前的宾客卡失效。例如一张宾客卡的入住时间是12:00,本来可以开门的,但是另外一张的入住时间为12:05的宾客卡刷卡开门后,之前的宾客卡就不能再开门了。 所以如果要允许多张宾客卡同时能开一个房间, 则其入住时间必须相同,或者后发的卡片设置不顶替前卡标志。
如果用几个软件(例如Demo, 酒管软件, 门锁管理软件)交替发卡,因为入住时间不同,很可能只有入住时间靠后的那张宾客卡能开门。在门锁上刷一次授权卡或者校时卡,则被顶替掉的宾客卡就又可以使用了。 碰到问题时,请查看一下几张宾客卡的入住时间是否一致。
- 允许开反锁:要设置允许开反锁标志,宾客卡才能在打了反锁的时候开锁。
- 检查入住时间:为了防止门锁时间不太精确而导致宾客卡不能开门,所以默认情况下是不检查宾客卡的入住时间的。如果启用,则对门锁的时钟精度要求比较高,需要经常对门锁校时。制卡时,入住时间总是会被强制设为电脑当前时间.
- 门锁号的格式: 1.2.8203, 如果是套间房, 则后面再加一个字母, 例如: 1.2.8203.A。注意, 在早期DLock 管理软件中, 门锁号的格式类似这样: 102 或者 20105A 或者 A0203 等;如果早期的DLock软件没有门锁号,那么请直接输入房号(门锁管理软件有门锁号的,必须输入门锁号);具体请查看门锁管理软件的”客房设置->房间信息”窗口!!!
- 因为门锁时钟是有误差的, 请把预离时间往后推30分钟. 例如如果预离时间为第二天12:00, 那么最好把预离时间设为12:30。
- 入住时间和预离时间的格式: 2012-01-01 12:30:00 , 请务必按此格式输入, 必须跟电脑的日期格式设置无关(可以调整一下电脑的日期格式, 然后发卡试试看)
- 必须用在门锁管理系统里面能正常发卡的发卡器, 否则就算能发卡, 发出来的卡片也不一定能开门(可能因为授权卡信息不正确)!!!这种情况下, 可以尝试关闭软件,然后把授权卡放在发卡器上,再打开软件, 这样授权卡信息会被自动读取。
- 如果发的宾客卡不能开门, 可以用门锁管理软件查看卡片信息, 看看跟门锁管理系统发出来的卡片有什么不同(特别注意门锁号和入住时间,以及是否顶替前卡)。
- 制卡记录保存在cardRecord.ini, 其中remark=new表示新卡;remark=copy表示复制卡。也可以用随带的小工具查询制卡记录(注意把RMCRecords.exe和语言包Languages(RMC)放到PMS所在目录才能查询)。
- 门锁常见错误提示(把卡片放到门锁上刷一下, 然后马上拿开, 听响几声)
1短声: 时间错误
2短声: 打了反锁
3短声: 楼栋、楼层、门锁号不对
4短声: 卡片被挂失了
5短声: 卡片密码错误
6短声: 客户码错误
7短声: 没有刷设置卡引导(门锁里已有房号)
二、返回值说明
enum ERROR_TYPE
{
OPR_OK = 1, // 操作成功
NO_CARD = -1, // 没检测到卡片
NO_RW_MACHINE = -2, // 没检测到读卡器
INVALID_CARD = -3, // 无效卡
CARD_TYPE_ERROR = -4, // 卡类型错误
RDWR_ERROR = -5, // 读写错误
PORT_NOT_OPEN = -6, // 端口未打开
END_OF_DATA_CARD = -7, // 数据卡结束
INVALID_PARAMETER = -8, // 无效参数
INVALID_OPR = -9, // 无效操作
OTHER_ERROR = -10, // 其它错误
PORT_IN_USED = -11, // 端口已被占用
COMM_ERROR = -12, // 通讯错误
ERR_CLIENT = -20, // 客户码错误
ERR_NOT_REGISTERED = -29, // 未注册
ERR_NO_CLIENT_DATA = -30, // 无授权卡信息
ERR_ROOMS_CNT_OVER = -31, // 房数超出了可用扇区
};
三、接口函数说明
/*=============================================================================
函数名: TP_Configuration
;
功 能:动态库初始化配置, 完成门锁类型选择/发卡器连接等
输 入:lock_type — 门锁类型(也就是使用的卡片类型): 4-RF57门锁; 5-RF50门锁
输 出: 无
返回值:错误类型
=============================================================================*/
int __stdcall TP_Configuration(int lock_type);
/*=============================================================================
函数名: TP_MakeGuestCardEx
;
功 能:制作宾客卡
输 入:room_no — 门锁号: 字符串, 例如 “1.2.8102”等
checkin_time — 入住时间: 预留. 制卡时入住时间被强制为当前时间!!!
checkout_time — 预离时间: 年月日时分秒, 字符串格式 “YYYY-MM-DD hh:mm:ss”
iflags — 宾客卡选项, 一般置0. iflags的各种赋值解释如下:
1: 表示允许开反锁
8: 表示复制卡, 不顶替前卡(可以跟之前发的卡片一起用, 允许一个房间发多张卡片)
32: 表示一次性开门, 开门后失效
128: 表示检测卡片的入住时间(如果卡片入住时间 > 门锁当前时间, 则不能开门, 不建议用这个选项)
上述各属性值可以相加进行组合.
如果iflags ==0, 表示会顶替前卡,刷卡后之前的卡片失效; 不是一次性开门卡; 不检测卡片的入住时间
输 出: card_snr — 卡号: 字符串, 至少预分配20字节
例 子1: room_no=”1.2.8102″, SDateTime=””, EDateTime=”2008-06-07 12:00:00″
iFlags=8 !!!!!!!!(复制卡)
返回值:错误类型
说明: Room要输入 门锁号!! 其格式视门锁管理软件而定, 请查看门锁管理软件的”客房设置”界面. 如果门锁管理软件中没有门锁号,
则请输入房号.
=============================================================================*/
int __stdcall TP_MakeGuestCardEx(char *card_snr, char *room_no, char *checkin_time,char *checkout_time, int iflags);
/*=============================================================================
函数名: TP_ReadGuestCardEx
;
功 能:读宾客卡信息
输 入:无。
输 出: card_snr — 卡号: 字符串, 至少预分配20字节
room_no — 房号: 字符串, 至少预分配20字节
checkin_time — 入住时间: 年月日时分秒, 字符串格式 “YYYY-MM-DD hh:mm:ss”, 至少预分配30字节
checkout_time — 预离时间: 年月日时分秒, 字符串格式 “YYYY-MM-DD hh:mm:ss”, 至少预分配30字节
iFlags — 卡片标志字节
返回值:错误类型
=============================================================================*/
int __stdcall TP_ReadGuestCardEx(char *card_snr,char *room_no, char *checkin_time, char *checkout_time, int *iFlags);
/*=============================================================================
函数名: TP_CancelCard
;
功 能:注销卡片/卡片回收
输 入: 无
输 出:
输 出: card_snr — 卡号: 字符串, 至少预分配20字节
返回值:错误类型
=============================================================================*/
int __stdcall TP_CancelCard(char *card_snr);
/*=============================================================================
函数名: TP_GetCardSnr
;
功 能:读取卡号(卡片的唯一的序列号)
输 入: 无
输 出: card_snr — 卡号: 字符串, 至少预分配20字节
返回值:错误类型
=============================================================================*/
int __stdcall TP_GetCardSnr(char *card_snr);
////////////////////// 以下函数供酒管软件进行会员卡管理 ///////////////////////
/*=============================================================================
函数名: TP_M1Active
功 能:卡片激活(读取卡号)
参 数:无
输 出: card_snr — 卡号, 4字节(字符串表示为8个字符)
返回值:错误类型
描 述:卡片激活
=============================================================================*/
int __stdcall TP_M1Active(char *card_snr);
/*=============================================================================
函数名: TP_M1AuthKey
功 能:验证卡片密钥
参 数:keyA: 密钥, 六字节, 卡片的默认密钥是 “ffffffffffff”
sector_no: 扇区号, 1~40
返回值:错误类型
描 述:验证卡片的相应扇区的密钥, 验证过后才可以读写
例 子:keyA = “ffffffffffff”, sector_no = 3
=============================================================================*/
int __stdcall TP_M1AuthKey(char *keyA, UINT sector_no);
/*=============================================================================
函数名: TP_M1SetKeyA
功 能:修改密钥A
参 数:NewKeyA: 新密钥A, 六字节, 用字符串表示(12个字符)
sector_no: 扇区号
返回值:错误类型
描 述:修改卡片密钥A, 注意要先用AuthKey验证原密钥. 注意函数调用顺序:
TP_M1Active → TP_M1AuthKey → TP_M1SetKeyA
例 子:newKeyA = “ffffffffffff”, sector_no = 3
=============================================================================*/
int __stdcall TP_M1SetKeyA(char *newKeyA, UINT sector_no);
/*=============================================================================
函数名: TP_M1WriteBlock
功 能:写数据
参 数:block_no: 块号(一般是扇区号*4 + 扇区内块号)
data: 要写入的16字节数据, 用字符串表示(32个字符,只能是0~9和A~F, a~f )
返回值:错误类型
描 述:写一块数据. 必须先用TP_M1AuthKey验证密钥
; 例如, 扇区9可以读写的块号包括: 9×4 9×4+1 9×4+2, 即: 36 37 38块. 注意函数调用顺序:
TP_M1Active → TP_M1AuthKey → TP_M1WriteBlock
例 子:block_no = 3×4 = 12, data = “112233445566778899AABBCCDDEEFF”
=============================================================================*/
int __stdcall TP_M1WriteBlock(UINT block_no, char *data);
/*=============================================================================
函数名: TP_M1ReadBlock
功 能:读数据
参 数:block_no: 块号(一般是扇区号*4 + 扇区内块号)
输 出: data: 16字节数据, 用字符串表示(32个字符)
返回值:错误类型
描 述:读取一块. 必须先用TP_M1AuthKey验证密钥. 注意函数调用顺序:
TP_M1Active → TP_M1AuthKey → TP_M1ReadBlock
=============================================================================*/
int __stdcall TP_M1ReadBlock(UINT block_no, char *data);
关于M1卡的简单说明:
- 卡片有16个扇区,编号从0~15;每个扇区可以设置独立的密码;
- 每个扇区里面有4个块,编号从0~3, 只可以读写0~2块。
- 读卡和写卡时要用 “扇区号x4 + 扇区内块号”, 扇区9可以读写的块号包括: 9×4 9×4+1 9×4+2, 即: 36 37 38块.
- 要避开门锁使用的扇区,门锁一般使用扇区1、扇区11、扇区15等, 具体可咨询门锁厂家;