JL-IDD-Z4综合门禁控制器开发说明书3
JL-IDD-Z4综合门禁控制器
开发说明书-通过TCP或UDP协议交互
目录
1 文档内容简介
通过协议直接操作设备,不使用开发包。
参考第4章相关描述,对开发技能有较高的要求。只开放部份功能,不提供技术支持,不保证后续设备及开发包与当前情况兼容。
1.1 特别情况说明
控制器使用一些特殊卡号
ü 小于255的卡号用于表示事件,因此系统中不能使用小于255的IC/ID卡
ü 卡号666666表示模拟刷卡,可以配置指定信号被触发后,系统将此信号转换成卡号为666666刷卡
ü 卡号7777777表示过闸超时,用于实时上报表示刷卡后指定时间范围内没有通过闸机(需要在信号配置中指定哪一路信号连接的过闸红外检测信号)
ü 卡号111111111111111110表示所有身份证,使用此号授权后,所有身份证即可有此权限
2 API操作函数接口说明
略
3 框架内置服务
略
4 基于TCP/UDP协议交互
使用TCP/UDP协议交互,不需要使用开发包,使用任何支持网络socket通信的编程语言都可开发。
l 使用UDP协议时
UDP协议本身不需要建立连接,此时软件与设备之间通过如下方式通信
n 软件要主动向设备发起控制指令时,直接向设备的IP地址及65534端口发送指令。设备会将响应数据返回到软件的发送端口上。
n 设备上发生事件时,设备会主动向服务器的IP及50000端口上报数据(服务器的IP和端口需要预先配置)。
l 使用TCP协议时
控制器可以配置为工作在“客户端”或者“服务器”模式下
n 工作在“客户端”模式下时(通常是这种模式),控制器会主动连接到服务器IP和50000端口(服务器的IP和端口需要预先配置),如果服务器上有软件监听了此端口,就会成功建立通信连接。
n 工作在“服务器”模式下时,需要软件主动连接控制器的IP和指定端口(默认为50000),建立连接后就可以开始通信。
软件可以通过已经建立的连接向设备发送指令控制设备,设备也通过此连接返回消息。设备上发生事件时,设备也会通过已经建立的连接向服务器上报数据。
无论是使用UDP协议还是TCP客户端或者TCP服务器模式下,软件与控制器通信交互都使用同样的数据格式。前面基于SDK开发的方式中,最终SDK内部也是使用这种方式来实现与控制器通信的。
基于TCP/UDP协议交互时,可以分为设备主动向软件发起上报和软件主动向设备发起请求两种情况。控制器同时支持两种方式与软件交互。下面分别介绍“设备主动向软件发起上报”(4.1小节)和软件主动向设备发起请求(4.2小节)。
4.1 消息主动上报
消息主动上报是指对设备进行适当配置后,控制器上发生事件时,会主动向预先配置的电脑的IP和端口发送数据。电脑上的软件收到数据后进行处理,并根据情况发送返回数据去控制设备。
1. 通过综合门禁控制器配置工具,做如下配置操作:
ü 根据要使用的协议选择配置控制器的通信方式,比如UDP,如果使用TCP协议开发则选择TCP客户端。
ü 在TCP/UDP通信情况下,可勾选“08.网络连接检测”,启动控制器心跳检测功能。此时应用可以接收控制板上报的连接检测消息,来判断设备是否在线。
ü 如果只接收同步消息,则关闭选项“05允许设备自动主动上报刷卡记录”
ü 关闭选项“26.允许设备自动从计算机拉取权限记录”
ü 修改“电脑地址”为运行软件的地址,端口为软件监听的服务端口,默认为50000。
2. 对于开发应用软件的情况,编写代码监听上面配置的电脑地址的端口(默认50000),接收所有从控制器上报过来的消息。开发前也可以下载“TCPUPD测试工具”,在不编码的情况下查看一下控制器上报的数据格式。
l 对于TCP/UDP通信时,上报的数据通常以一个上报消息头开始(注意如果是TCP通信,消息头前面还有4个字节的长度信息),消息头长度为8字节,消息头后面是消息实际内容,消息头的格式如下
typedef struct RptCmdHead
{
unsigned char flag; //标志,1字节,固定为0xc8
unsigned char type; //上报消息类型,1字节(1事件,2刷卡,3身份证,4连接检测,5调试信息,6信号变化,7操作日志,8拉权限请求,9权限变更结果,10取时间)
unsigned char lenH; //数据长度高位,1字节
unsigned char lenL; //数据长度低位,1字节
unsigned int sn; //上报消息的序号,4字节。发送确认消息需要用到。
}RptCmdHead;
l 但是,当控制器上刷卡/条码/身份证时,当前刷卡数据及其处理结果会立即上报给服务器,这种上报的格式比较特殊,不以上面的RptComdHead消息头开始,其格式参考“刷卡实时上报”小节。
4.1.1 实时上报
4.1.1.1 TCP/UDP实时上报
4.1.1.1.1 TCP/UDP刷卡实时上报
控制器会在事件或者刷卡正在发生时立即上报一个同步记录给电脑,电脑分析收到的数据即可,如果网络不通或者服务器忙导致消息未被成功接收,控制器不会再次上报。
上报消息范例及各字段含义:
[4字节数据长度信息(仅TCP通信时)]0008242637|1|26419|4|2015-04-30 15:20:25|5|1|1|26419|||
对于TCP通信的情况,消息最前面有4个字节的数据长度,方便接收端确认当前消息的总长度。对于UDP通信时没有此4字节长度信息。
消息内容是以|分隔的字符串,各字段的含义为:
数据区|类型标志1表示条码或卡2表示身份证|控制器序号|控制器验证结果0表示控制器已经直接开门其它表示错误|刷卡时间|读头号|门号|方向1进2出|设备名称|记录类型|记录子类型|身份证芯片号
下面对这些字段中的关键内容进行简要说明
l 数据区
Ø 对于IC卡或者二维码的实时上报,上述数据区的数据即是IC卡号或者二维码数据。
如上述范例即表示卡号为0008242637的刷卡
Ø 对于刷社保卡读取芯片详细信息的实时上报
6214833053-张三丰-110101190001011113
以-分隔的各段的含义为
卡片的IC卡号-姓名-证件号码
Ø 对于刷银行卡扣费的实时上报,上述数据区的内容为如下格式
6214833053-000800-121109024903-20171114121109-000000000002-
F-000006
以-分隔的各段的含义为
卡号的前6后4位-凭证号-参考号-交易时间-交易金额(分)-读卡方式-批次号
Ø 对于刷身份证的上报,上述数据区的数据为如下14+256+1024+1字节数据:
ü 14字节的消息前缀,固定以AA AA AA开头,可忽略不处理,如
AA AA AA 96 69 05 08 00 00 90 01 00 04 00
ü 256字节的文字信息。文字信息以UNICODE编码,每段为固定长度,长度不足默认以空白符20 00填充(这是UNICODE格式的空格符的16进制表达)。
姓名 |
性别 |
民族 |
出生日期 |
住址 |
身份证号码 |
签发机关 |
有效日期 |
30 字节 |
2 字节 |
4 字节 |
16 字节 |
70 字节 |
36 字节 |
30 字节 |
32 字节 |
|
|
|
|
|
|
|
|
民族参考本文最后的附表:身份证民族代码
ü 1024字节的头像信息,以字符WLf开头,可以通过WltRS.dll中的解码接口解析出图片。
ü 1字节预留
l 控制器验证结果
参考本文最后的附表:控制器错误码
l 读头号
1-8,其中1-4表示板上的4个串口,5-8表示板上的4个韦根口
l 门号
1-4,表示此次刷卡控制的门(继电器)
应用软件可以监听端口并接收上报数据,分析处理数据并通过发送远程开门指令开门(参考4.2小节)
4.1.1.1.2 TCP/UDP连接检测消息
连接检测消息用于检查控制器与服务器间通信是否正常,控制器也通过此消息向服务器通报自己的设备标志(5位短标志及16位全局标志)。
控制器工作在TCP客户端模式下时,设备加电启动后或者连接断开后,会自动尝试跟服务器建立连接,如果连接建立成功则控制器会立即向服务器发送连接检测消息,消息中有控制器的短标志、全局标志等信息。
无论是在TCP客户端模式还是在UDP模式,如果配置了控制器选项中的“08.网络连接检测”,则控制器向定时向服务器发送连接检测消息。定时时间可以通过综合门禁控制器工具,配置选项-选项-设备网络超时秒数修改,点击确定后配置将存储在软件侧配置文件中,然后通过选择控制器并点击“保存配置”更新配置到控制器。定时检测消息的发送周期大致为配置的超时时间的1/4到1/2。
当打开选项08网络连接检测后,控制器会定时向电脑发送连接检测消息,表明通信正常及设备在线。消息格式为:
[4字节数据长度信息(仅TCP通信时)] +上报消息头+消息内容
例如
00 00 00 38 c8 04 00 30 00 00 00 00 32 34 38 38 34 7c 31 32 30 7c 33 33 7c 31 7c 32 34 38 38 34 7c 37 38 37 39 30 34 37 36 38 39 33 38 34 37 30 35 7c 76 30 2e 31 35 35 31 2d 31 30
其中
00 00 00 38是TCP通信时的首4字节,表示此次发送的数据总长度。对于UDP通信时,没有这4个字节。
c8 04 00 30 00 00 00 00是消息包头,格式为上述RptCmdHead,其中c8是固定标志,04表示上报类型是连接检测,00 30是消息包体中可见字符的数据长度,00 00 00 00是sn,连接检测时sn值固定为0,如果是日志上报则sn是日志的序号)
消息头后面是消息内容,消息内容是可见字符,格式为
控制器标志|超时配置时间|超时余时|已超时次数|控制器名称|控制器全局标志|固件版本
应用收到消息后应该向控制器发送如下数据进行确认,如果应用在指定时间内未进行确认,并且也没有与控制器进行其它通信,则控制器根据配置可能会复位网络或者尝试重新启动控制器。应用向控制器发送的连接确认消息如下:
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff ff ff 70 00 00 00 70
4.1.1.1.3 TCP/UDP信号变化消息
信号变化消息与连接检测消息类似,其消息头中的上报消息类型为6,上报的数据中表明了控制器S1-S8端子的短接状态变化。
信号变化消息不需要确认。
信号是指控制器S1-S8输入端子的状态,信号变化消息用于通知应用S1-S8端子的短接或者断开。
255;251|25138|2016-07-21 16:09:47|258|259|514|515|770|771|1026|1027|25138|192.168.0.155:50000
以|分隔的各字段的含义为:
变化前信号总值: 变化后信号总值|控制器标志|时间|信息配置1|信息配置2|信息配置3|信息配置4|信息配置5|信息配置6|信息配置7|信息配置8|设备名称|对端通信地址
变化前信号值255(二进制11111111)表示8个信号端子都是断开的
变化后信号值251(二进制11111011)表示除第3个端子(S3)是闭合的,其它都是断开的
因此此事件表示第3端子(S3)由断开状态切换为闭合状态了
注意:控制器启动时,系统默认信号值为0,因此会出现一个信号值从0变为某实际值的事件通知。比如假定所有端子都是断开的,此时如果控制器加电启动,就会生成一个从0变到255的事件通知。
4.1.2 异步日志上报
4.1.2.1 TCP/UDP异步日志上报
4.1.2.1.1 异步日志上报处理
控制器上发生刷卡或者其它事件后默认会在控制器上生成的对应的日志记录,如果“选项05-允许设备自动主动上报刷卡记录”启用,则控制器会将历史日志以异步记录的方式上报给软件,异步记录上报会按顺序逐条进行,如果操作失败将不停的重试,直到成功才进行下一条记录的上报。
异步记录以上报消息头开始,消息头后是消息内容。消息内容格式介绍如下:
ü 对于普通刷卡消息,消息内容为以|分隔的字符串,各字段含义为
n 卡号/数据
n 日志类型
n 应用标志
n 日志结果
n 时间
n 读头号
n 门号
n 方向
n 设备名称
n 日志类型
n 日志子类型
n 身份证芯片号
n 设备全局标志
n 身份证信息Base64编码数据(专用接口,默认情况为空)
n 身份证头像Base64编码数据(专用接口,默认情况为空)
ü 对于身份证记录,如果控制器中有此身份证的详细信息,则上报内容为
n 身份证详细信息(14+256+1024+1字节)
n 日志类型
n 应用标志
n 日志结果
n 时间
n 读头号
n 门号
n 方向
n 设备名称
n 日志类型
n 日志子类型
n 身份证芯片号
n 设备全局标志
n 身份证信息Base64编码数据(专用接口,默认情况为空)
n 身份证头像Base64编码数据(专用接口,默认情况为空)
否则当成普通刷卡上报,即卡号数据区只上报身份证号码。
4.1.2.1.2 异步记录接收成功的确认消息
接收到异步日志上报消息后,需要向消息的来源地址(或者向设备IP地址,UDP端口65534)发送如下指令,表示应用已经成功接收消息,指示控制器开始发送下一条日志记录。
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff 67 33 04 00 44 00 00 04 00 00 00 00 48
分段解释如下:
l 固定前缀
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff
l 控制器序号,0x6733即26419,运行在兼容模式下的板直接填充0xffff即可
67 33
l 消息序号,由消息请求者分配的值,设备返回消息此值与请求消息一致
04 00
l 请求命令字,消息确认为0x44
44
l 操作结果,请求时固定填充为0x00
00
l 消息数据长度,0x04表示后面有4字节
00 04
l 消息数据。4字节表示上报消息的序号,必须按实际值填充,数据来源于上报消息的序号(异步上报消息的5-8字节,参考前面RptCmdHead定义中的sn)。
00 00 00 00
l 校验位节。从请求命令字开始到消息数据的和。即44 00 00 00 04 00 00 00 00=48。(注意是16进制格式)
48
4.1.3 连接超时问题
对于服务器与控制器使用TCP或者HTTP协议交互的情况,为了判断控制器与服务器间的连接状况,控制器(v1868后的版本,不含v1868)可启用了TCP内置的Keep-alive机制(默认启用或者配置选项57启用),在连接成功建立并进行过一次收发数据后,控制器的网络芯片会在最后一次数据交互后的120秒(由配置的设备网络超时秒数决定,最大支持255*5=1275秒)后,发送Keep-alive包,对端服务在线则会自动回应ACK包(tcp内部自动实现不需要编写代码),控制器网络芯片会自动检测对端是否有回应包来判断网络连接是否正常。如果检测到网络连接异常,控制器会断开当前连接并尝试重连。超时时长配置值小于NAT的tcp连接超时时间时,启用此开关可用于防止NAT设备在连接未活动时主动清除连接信息。
n 对于一般TCP服务器,建议实现为长连接,并且在服务器scoket上启用TCP协议内置的Keep-Alive处理,从而实现:
u 防止网络中的NAT设备要连接没有活动时断开连接
u 防止异常断开的客户端占用服务器侧的端口
u 同时避免客户端端口重用后不能连接到服务器(服务器不知道客户端已经断开,认为当前已经存在与客户端指定端口的连接,这种情况下可能连接不上,或者连接上以后服务器主动断开连接,需要等待、或者客户端换其它端口连接、或者重新启动服务器才能正常连接)。v1883后的控制器会尝试以随机端口来连接服务器以规避此问题。
n 对于WEB服务器(常用的都是HTTP1.1,默认都是长连接,但服务器在指定时间内未收到请求数据则会自动断开连接),因此建议配置连接超时时间为120-3600秒,同时在控制器上启用“选项08.网络连接检测”,此选项启用后,控制器会定时发送HTTP的连接检测消息到服务器,在发送间隔小于服务器连接超时时间的情况下(同时也小于网络中所有NAT超时时间时),即可长期保持连接。控制器修改“网络连接检测发送时间间隔”的步骤如下:
ü 配置工具中点击“配置选项”,修改“网络”-“设备网络超时秒数”
ü 选择控制器后,点“保存配置”,新的配置值即会下发到控制器。
n 对于服务压力比较大的服务器,连接超时时间过大将影响性能,此时建议使用单独的websocket长连接来处理与控制器的数据交互。
4.2 软件请求指令接口
指令接口是使用原始底层通信协议来实现与控制器交互,通信方式默认是UDP协议(使用TCP协议时通信数据格式也是完全一样的)。
注意:所有控制器操作指令的格式都是统一的,不同指令间有变化只是命令字(返回命令字对应为请求命令字加1)和数据内容(根据每种命令字而不同,长度从0-N不等)。
使用第2章描述的方式来“通过API使用开发包”可以实现本小节一样的效果甚至更多的功能,通常是在不能使用windows系统的环境下或者非PC端软件的情况才会使用到本小节的方式来开发。
一个完整的请求或者返回指令包含如下部分(请求消息和返回消息类似,注意数据是16进制格式):
l 消息固定前缀。
请求消息固定前缀为
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff
返回消息固定前缀为
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff
l 控制器的组号序号,0x6733即26419,运行在兼容模式下的板在请求时可以直接填充0xffff即可。返回消息此值为0xffff
67 33
l 消息序号,由请求时应用分配的任意值(通常按顺序递增分配),返回消息的此值会保持与请求消息一致,如
04 00
l 请求命令字,各种不同的功能的命令字不同,开门为0x10。返回命令字的值是请求命令字+1,如开门返回的命令字为0x11
10
l 操作结果,请求时固定填充为0x00。返回时0x01表示操作成功。其它表示失败。
00
l 消息数据长度,0x03表示后面有3字节。不同命令字消息数据长度不同。
00 03
l 消息数据内容。不同命令字消息数据内容不同。如远程开门,首字节0x01表示第1号门,后面0x012c表示开门时长300(单位为10ms)即3000毫秒,即3秒。
01 01 2c
l 校验位节。从请求命令字开始到消息数据的和,需要根据实际消息进行计算。即10 00 00 03 01 01 2c=41。(注意是16进制格式)
41
后面将对现在已经开放给开发人员的命令字做详细介绍。
4.2.1 远程开门
远程控制继电器动作
4.2.1.1 通信方式
向已知的控制器的IP:PORT(或者收到的实时消息的来源IP地址),目标端口65534发送如下开门指令(使用UDP协议)。
4.2.1.2 请求消息格式
请求消息范例(注意数据是16进制格式)
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff 67 33 04 00 10 00 00 03 01 01 2c 41
分段解释如下:
l 固定前缀
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff
l 控制器序号,0x6733即26419,运行在兼容模式下的板直接填充0xffff即可
67 33
l 消息序号,由消息请求者分配的值,设备返回消息此值与请求消息一致
04 00
l 请求命令字,开门为0x10
10
l 操作结果,请求时固定填充为0x00
00
l 消息数据长度,0x03表示后面有3字节
00 03
l 消息数据。首字节0x01表示第1号门,后面0x012c表示开门时长300(单位为10ms)即3000毫秒,即3秒。
01 01 2c
l 校验位节。从请求命令字开始到消息数据的和。即10 00 00 03 01 01 2c=41。(注意是16进制格式)
41
请根据需要修改门号,时长,重新计算校验位,即生成了合法的请求消息。
4.2.1.3 返回消息格式
开门操作完成后控制器向请求端口发送返回消息,范例数据如下(注意数据是16进制格式):
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff 04 00 11 01 00 00 12
分段解释如下:
l 固定前缀
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff
l 消息序号,与请求消息此值一致
04 00
l 开门返回命令字0x11
11
l 操作结果,0x01表示操作成功,其它失败
01
l 消息数据长度,0x0000表示后面有0字节
00 00
l 校验位节。从请求命令字开始到消息数据的和。即11 01 00 00=12。
12
4.2.1.4 常用继电器控制消息
要控制门禁或者闸机开门,向目标控制器的IP的65534端口发送如下UDP消息即可。对于门,通常开门时长为3秒或者5秒,对于闸机通常300毫秒即可,一般情况下闸机的进使用1号继电器控制,出使用2号继电器控制。
对4个继电器开门0秒(0表示使用继电器默认开门时长),向控制器发送的16进制消息内容如下:
ü 开1号门:
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 01 00 00 04
开5秒最后3字节换成01 f4 09
开3秒最后3字节换成01 2c 41
开300毫秒最后3字节换成00 1E 32
ü 开2号门:
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 02 00 00 05
开5秒最后3字节换成01 f4 0A
开3秒最后3字节换成01 2c 42
开300毫秒最后3字节换成00 1E 33
ü 开3号门:
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 03 00 00 06
开5秒最后3字节换成01 f4 0B
开3秒最后3字节换成01 2c 43
开300毫秒最后3字节换成00 1E 34
ü 开4号门:
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 04 00 00 07
开5秒最后3字节换成01 f4 0B
开3秒最后3字节换成01 2c 44
开300毫秒最后3字节换成00 1E 34
要进行特殊控制,可以通过发送特定开门时长的开门指令来实现。开门时长(单位为毫秒)指定为650010表示恢复自主控制(可刷卡开门或者远程指令开门),650020表示保持继电器断开直到恢复自主控制,650030表示保持继电器闭合直到恢复自主控制。650040表示只闭合继电器,650050表示只断开继电器,0表示使用继电器默认时长开门(默认时长可通过工程工具在继电器配置页面中指定)。
ü 恢复正常控制继电器1/2/3/4的指令分别如下(使用开门650010毫秒达到此效果) 。注意常开常闭后发开门指令将不能成功,必须先恢复正常控制。
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 01 fd e9 04
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 02 fd e9 05
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 03 fd e9 06
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 04 fd e9 07
ü 常开(继电器断开)1/2/3/4的指令分别如下(使用开门650020毫秒达到此效果)。注意常开常闭后发开门指令将不能成功,必须先恢复正常控制。
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 01 fd ea 05
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 02 fd ea 06
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 03 fd ea 07
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 04 fd ea 08
ü 常闭(继电器闭合)1/2/3/4的指令分别如下(使用开门650030毫秒达到此效果) 。注意常开常闭后发开门指令将不能成功,必须先恢复正常控制。
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 01 fd eb 06
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 02 fd eb 07
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 03 fd eb 08
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 04 fd eb 09
ü 只闭合继电器1/2/3/4的指令分别如下(使用开门650040毫秒达到此效果)。
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 01 fd ec 07
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 02 fd ec 08
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 03 fd ec 09
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 04 fd ec 0a
ü 只断开继电器1/2/3/4的指令分别如下(使用开门650050毫秒达到此效果)
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 01 fd ed 08
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 02 fd ed 09
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 03 fd ed 0a
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff ff ff 04 00 10 00 00 03 04 fd ed 0b
4.2.2 授权
添加权限记录到控制器,用于脱机自主验证
4.2.2.1 通信方式
向已知的控制器的IP:PORT(或者收到的实时消息的来源IP地址),目标端口65534发送如下指令(使用UDP协议)。
4.2.2.2 请求消息格式
请求消息范例(注意数据是16进制格式)
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff 68 33 04 00 12 00 00 18 00 00 00 00 d2 02 96 49 bf 20 00 00 21 3c 7d bf 00 ff ff ff 00 00 00 00 52
分段解释如下:
l 固定前缀
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff
l 控制器序号,0x6833即26675,运行在兼容模式下的板直接填充0xffff即可
68 33
l 消息序号,由消息请求者分配的值,设备返回消息此值与请求消息一致
04 00
l 请求命令字,授权为0x12
12
l 操作结果,请求时固定填充为0x00
00
l 消息数据长度,0x18表示后面有24字节
00 18
l 消息数据。
00 00 00 00 d2 02 96 49 bf 20 00 00 21 3c 7d bf 00 ff ff ff 00 00 00 00
参考附录“控制器权限结构”
l 校验位节。从请求命令字开始到消息数据的和。
52
4.2.2.3 返回消息格式
操作完成后控制器向请求端口发送返回消息,范例数据如下(注意数据是16进制格式):
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff 04 00 13 01 00 00 14
分段解释如下:
l 固定前缀
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff
l 消息序号,与请求消息此值一致
04 00
l 操作返回命令字0x13
13
l 操作结果,0x01表示操作成功,其它失败
01
l 消息数据长度,0x0000表示后面有0字节
00 00
l 校验位节。从请求命令字开始到消息数据的和。
14
4.2.3 回收权限
删除控制器上的权限记录
4.2.3.1 通信方式
向已知的控制器的IP:PORT(或者收到的实时消息的来源IP地址),目标端口65534发送如下指令(使用UDP协议)。
4.2.3.2 请求消息格式
请求消息范例(注意数据是16进制格式)
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff 68 33 08 00 14 00 00 08 00 00 00 00 d2 02 96 49 cf
分段解释如下:
l 固定前缀
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff
l 控制器序号,0x6833即26675,运行在兼容模式下的板直接填充0xffff即可
68 33
l 消息序号,由消息请求者分配的值,设备返回消息此值与请求消息一致
08 00
l 请求命令字,回收权限为0x14
14
l 操作结果,请求时固定填充为0x00
00
l 消息数据长度,0x08表示后面有8字节
00 08
l 消息数据。8字节的卡号数据
00 00 00 00 d2 02 96 49
unsigned int high; //卡号高位,对于普通ic卡,此值为0
unsigned int low; //卡号低位
l 校验位节。从请求命令字开始到消息数据的和。
cf
4.2.3.3 返回消息格式
操作完成后控制器向请求端口发送返回消息,范例数据如下(注意数据是16进制格式):
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff 08 00 15 01 00 00 16
分段解释如下:
l 固定前缀
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff
l 消息序号,与请求消息此值一致
08 00
l 操作返回命令字0x15
15
l 操作结果,0x01表示操作成功,其它失败
01
l 消息数据长度,0x0000表示后面有0字节
00 00
l 校验位节。从请求命令字开始到消息数据的和。
16
4.2.4 查询权限
查询控制器上的权限记录
4.2.4.1 通信方式
向已知的控制器的IP:PORT(或者收到的实时消息的来源IP地址),目标端口65534发送如下指令(使用UDP协议)。
4.2.4.2 请求消息格式
请求消息范例(注意数据是16进制格式)
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff 61 36 08 00 34 00 00 08 01 00 00 00 01 00 00 00 3e
分段解释如下:
l 固定前缀
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff
l 控制器序号,0x6136即24886,运行在兼容模式下的板直接填充0xffff即可
61 36
l 消息序号,由消息请求者分配的值,设备返回消息此值与请求消息一致
08 00
l 请求命令字,查询权限为0x34
34
l 操作结果,请求时固定填充为0x00
00
l 消息数据长度,0x08表示后面有8字节
00 08
l 消息数据。8字节的卡号数据
01 00 00 00 01 00 00 00
unsigned int high; //权限位置,从1开始。下次使用上回查询的返回位置+1继续查。
unsigned int low; //固定为1
l 校验位节。从请求命令字开始到消息数据的和。
3e
4.2.4.3 返回消息格式
权限结构与授权一致,参考附录“控制器权限结构”
4.2.5 清空权限
清除控制器上的所有权限记录
4.2.5.1 通信方式
向已知的控制器的IP:PORT(或者收到的实时消息的来源IP地址),目标端口65534发送如下指令(使用UDP协议)。
4.2.5.2 请求消息格式
请求消息范例(注意数据是16进制格式)
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff 61 36 02 00 18 00 00 00 18
分段解释如下:
l 固定前缀
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff
l 控制器序号,0x6136即24886,运行在兼容模式下的板直接填充0xffff即可
61 36
l 消息序号,由消息请求者分配的值,设备返回消息此值与请求消息一致
02 00
l 请求命令字,清空权限为0x18
18
l 操作结果,请求时固定填充为0x00
00
l 消息数据长度,0x00表示后面有0字节
00 00
l 校验位节。从请求命令字开始到消息数据的和。
18
4.2.5.3 返回消息格式
操作完成后控制器向请求端口发送返回消息,范例数据如下(注意数据是16进制格式):
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff 02 00 19 01 00 00 1a
分段解释如下:
l 固定前缀
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff
l 消息序号,与请求消息此值一致
02 00
l 操作返回命令字0x19
19
l 操作结果,0x01表示操作成功,其它失败
01
l 消息数据长度,0x0000表示后面有0字节
00 00
l 校验位节。从请求命令字开始到消息数据的和。
1a
4.2.6 主动监控及提取日志
主动发指令获取控制板运行信息,控制运行状态和指定位置的日志记录
4.2.6.1 通信方式
向已知的控制器的IP:PORT(或者收到的实时消息的来源IP地址),目标端口65534发送如下指令(使用UDP协议)。
4.2.6.2 请求消息格式
请求消息范例(注意数据是16进制格式)
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff 61 36 08 00 38 00 00 04 01 00 00 00 3D
分段解释如下:
l 固定前缀
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff
l 控制器序号,0x6136即24886,运行在兼容模式下的板直接填充0xffff即可
61 36
l 消息序号,由消息请求者分配的值,设备返回消息此值与请求消息一致
08 00
l 请求命令字,运行监控为0x38
38
l 操作结果,请求时固定填充为0x00
00
l 消息数据长度,0x04表示后面有4字节
00 04
l 消息数据。4字节的记录索引位置,全0表示取最新记录,其它值表示取指定位置的日志记录。低位在前,如下面数据表示取第1条记录。
01 00 00 00
l 校验位节。从请求命令字开始到消息数据的和。
3D
4.2.6.3 返回消息格式
操作完成后控制器向请求端口发送返回消息,范例数据如下(注意数据是16进制格式):
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff 08 00 39 01 00 30 01 00 00 00 e2 00 00 00 01 00 00 00 9c 24 c7 1a 01 00 0c 0e 02 00 00 00 00 00 00 00 18 04 28 11 18 00 00 00 00 00 00 59 61 7a 82 30 30 32 35 35 2b
分段解释如下:
l 固定前缀
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff
l 消息序号,与请求消息此值一致
08 00
l 操作返回命令字0x39
39
l 操作结果,0x01表示操作成功,其它失败
01
l 消息数据长度,0x0030表示后面有48字节
00 30
l 监控返回控制板状态数据和指定位置的日志记录
01 00 00 00 当前记录序号,如果请求参数为全0,则这里就是最新记录序号即记录总数
e2 00 00 00 01 00 00 00 9c 24 c7 1a 01 00 0c 0e 记录详细信息,参考附表日志结构说明
02 00 00 00 控制器现有日志数量,2
00 00 00 00 控制器现有权限数量,0
18 04 28 11 18 00 00 控制器当前时间,bcd码,表示18年4月28日11点18分00
00 00 00 00 59 61 7a 82 读头方向及对应继电器
30 30 32 35 35 设备标志,5位ascii码值,本示例表示对应5位控制器标志为00255
l 校验位节。从命令字开始到消息数据的和。
2b
4.2.6.4 其它说明
请求参数中的消息数据是一个日志的位置值,此值需要调用者根据需要来指定,通常
1. 如果要读取完整的日志数据。软件先以参数1开始读取记录,成功后参数递增,并且运行时需要保存好已经读取到的位置,下次启动时从上次的位置开始继续读取,直到没有记录为止(返回记录详细信息为全0),然后定时检测此位置直到有数据返回,再继续读取下一位置。
2. 如果只是监控当前最近的刷卡,则在软件启动时可以先以参数为0请求一次,取得最近的刷卡记录序号,然后以其记录序号+1取下一条刷卡记录,如果没有数据(记录详细信息为全0)则暂停一小段时间后再尝试获取,如果有数据表示控制器上有新的刷卡并且已经取到了,则下次将参数+1再继续调用。
4.2.7 设置时间
修改控制器的系统时间
4.2.7.1 通信方式
向已知的控制器的IP:PORT(或者收到的实时消息的来源IP地址),目标端口65534发送如下指令(使用UDP协议)。
4.2.7.2 请求消息格式
请求消息范例(注意数据是16进制格式)
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff 61 36 08 00 26 00 00 07 18 05 04 13 30 01 05 97
分段解释如下:
l 固定前缀
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 ff ff ff ff ff ff ff ff
l 控制器序号,0x6136即24886,运行在兼容模式下的板直接填充0xffff即可
61 36
l 消息序号,由消息请求者分配的值,设备返回消息此值与请求消息一致
08 00
l 请求命令字,设置时间为0x26
26
l 操作结果,请求时固定填充为0x00
00
l 消息数据长度,0x07表示后面有7字节
00 07
l 消息数据。时间格式的数据,bcd编码,其中星期为SYSTEMTIME.wDayOfWeek,取值0=星期日,1=星期一,2=星期二…
18 05 04 13 30 01 05表示18年05月04日13点30分01,星期五
l 校验位节。从请求命令字开始到消息数据的和。
97
4.2.7.3 返回消息格式
操作完成后控制器向请求端口发送返回消息,范例数据如下(注意数据是16进制格式):
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff 08 00 27 01 00 00 28
分段解释如下:
l 固定前缀
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ff ff ff ff ff ff ff ff ff ff
l 消息序号,与请求消息此值一致
08 00
l 操作返回命令字0x27
27
l 操作结果,0x01表示操作成功,其它失败
01
l 消息数据长度,0x0000表示后面没有数据
00 00
l 校验位节。从命令字开始到消息数据的和。
28
4.2.8 运行文本指令
向控制器发送文本指令来对其进行控制或者配置
格式同上。请求命令字为0x94,返回命令字为0x95。消息内容(就是消息数据长度后面,校验位前面的所有内容)为520字节,前8字节固定为0x00,后面512字节是指令字符串。不足512字节后面填0补齐512字节。
指令文本字符串的内容可以参考《JL-IDD-Z4二次开发说明书-通过HTTP协议交互》中的 HTTP刷卡实时上报 小节对返回内容的描述,所有支持的文本指令可以在《JL-IDD-Z4二次开发说明书-使用SDK开发包》中的 支持的文本指令集 小节找到。
5 定制开发
我们提供设备及软件按客户要求定制的。如果有其它特殊要求,可以通过代理商或者直接联系我们。
6 附表
6.1 身份证民族代码
身份证民族代码
01=汉族,02=蒙古族,03=回族,04=藏族,05=维吾尔族,06=苗族,07=彝族,08=壮族,09=布依族,10=朝鲜族,11=满族,12=侗族,13=瑶族,14=白族,15=土家族,16=哈尼族,17=哈萨克族,18=傣族,19=黎族,20=傈僳族,21=佤族,22=畲族,23=高山族,24=拉祜族,25=水族,26=东乡族,27=纳西族,28=景颇族,29=柯尔克孜族,30=土族,31=达斡尔族,32=仫佬族,33=羌族,34=布朗族,35=撒拉族,36=毛难族,37=仡佬族,38=锡伯族,39=阿昌族,40=普米族,41=塔吉克族,42=怒族,43=乌孜别克族,44=俄罗斯族,45=鄂温克族,46=崩龙族,47=保安族,48=裕固族,49=京族,50=塔塔尔族,51=独龙族,52=鄂伦春族,53=赫哲族,54=门巴族,55=珞巴族,56=基诺族,97=其他,98=外国血统
6.2 控制器错误码
控制器错误码,是用于实时上报消息或者刷卡日志中的错误码。
0=成功,2=时段错误,3=超次,4=无权限,5=读头错误,6=过期,7=工作模式禁止,8=内部错误,9=解析号码失败,10=过闸超时,11=反潜回,12=不支持,13=未知错误,14=失败,16=未注册或者注册过期,17=密码错误,18=错误的同步类型,19=错误的同步消息格式,20=同步数据限制,21=同步数据数量或者序号不规范,22=网络状态未知,23=网络断开,24=网络恢复,25=网络检查重启设备,26=网络检查重启芯片,27=防冲撞,28=门禁人工锁定,29=多门互锁,30=读写卡失败,31=组号错误,32=系统状态详情,33=黑名单,34=存储错误,35=未授权,36=在内人数过多,37=年龄限制,38=证件过期
6.3 控制器日期及时间结构
控制器存储及接口协议中,日期和时间分别各使用2个字节来存储,以xDate表示日期,xTime表示时间,下面介绍其各存储结构。
xDate和xTime各占用2字节,用于表示日期和时间,其内存存储方式如下
日期(YMD) /*年月日*/
位置 |
高位 低位 |
||
长度 |
7位 |
4位 |
5位 |
内容 |
Year(年) |
Month(月) |
Day(日) |
取值范围 |
0–119(relative to 2000) |
1–12 |
1–31 |
如B3 02 = 2018年4月16日
=>年=2018-2000=18,月=4,日=16,计算如下(其中<<?表示向高位移?位,即2进制时在原来的值后面补?个0)
=>18<<(5+4) + 4<<5 + 16 ,将数据转2进制表示为
=>10010<<9 + 100<<5 + 10000 ,移位后为
=>10010000000000 + 10000000 + 10000 ,计算三个二进制数据的算术和为
=>10010010010000,转成16进制为
=> 0x2490
=>我们要求低位在前,即实际按字节传输数据时,实际发送的两字节为90 24
上述步骤是为了方便理解,简单的说,照如下方式计算即可
=>(年-2000)* 512+月*32+日 算出来的值为9360,就是16进制0x2490,实际发送的两个字节为90 24
时间(HMS) /*时分秒*/
位置 |
高位 低位 |
||
长度 |
5位 |
6位 |
5位 |
内容 |
Hours(时) |
Minutes(分) |
2-second increments(2秒) |
取值范围 |
0–23 |
0–59 |
0-29 in 2-second intervals |
如0D 5D= 11时40分26秒,计算如下(其中<<?表示向高位移?位)
=>时11,分40,秒26/2=13
=>11<(5+6) + 40<<5 + 13 ,将数据转2进制表示为
=>1011<<11 + 101000<<5 + 1101,移位后为
=>101100000000000 + 10100000000 + 1101,计算
=>101110100001101,转16进制为
=> 0x5D0D
=>我们要求低位在前,即实际按字节传输数据时,实际发送的两字节为0D 5D
同样,上面的步骤实际照如下方式计算即可
=>时* 2048+分*32+秒/2 算出来的值为23821,就是16进制0x5D0D,实际发送的两个字节为0D 5D
6.4 控制器日志结构
typedef struct xLog
{
unsigned int high; //如果是刷卡记录,这里存的卡号高位
unsigned int low; //如果是刷卡记录,这里存的卡号低位
xDate rDate; //刷卡日期,参考附表日期的结构说明
xTime rTime; //刷卡时间,参考附表时间的结构说明
unsigned char door:3; //刷卡对应门号,值为1-4
unsigned char reader:5; //刷卡读头,值为1-4串口,5-8韦根
unsigned char result; //控制器验证结果。参考附表控制器错误码
unsigned char dir:2; //刷卡方向1进2出0未知
unsigned char type:6; //1事件,2刷卡日志,3操作日志。应用重点处理2
unsigned char isName:1;
unsigned char subType:5;
unsigned char extReader:2;
}xLog;
比如日志数据00 00 00 00 20 fb 6e 20 9c 24 37 5d 29 04 09 00
可以分析可以得知其对应记录信息为
卡号=00 00 00 00 20 fb 6e 20 =>0544144160
时间=9c 24 37 5d =>参考日期及时间结构,得出9c 24为2018-04-28 ,37 5d为11:41:46
门号=29转二进制00101001,低3位为001,表示门1
读头=29转二进制00101001,高5位为00101,表示读头5
控制器验证结果=04,参考控制器错误码得知其为,无权限
方向=09转二进制00001001,低2位01表示进入
类型=09转二进制00001001,高6位00010即2表示刷卡日志
6.5 控制器权限结构
控制器权限的c语言结构体如下
typedef xRight {
unsigned int high; //卡号高位,对于普通ic卡,此值为0。对应上面数据的00 00 00 00。如果是身份证此值为身份证号码前8位的值(不算18位身份证号码的最后一位校验位),32位整数,低位在前,如身份证123456789012345677,high就是12345678,按顺序4个字节为4E 61 BC 00。
unsigned int low; //卡号低位,对应上面数据的d2 02 96 49。如果是身份证此值为后9位的值(不算18位身份证号码的最后一位校验位),32位整数,低位在前,如身份证123456789012345677,low就是901234567,按顺序4个字节为87 BF B7 35。
xDate bDate; //生效日期。对应上面数据的bf 20。格式见附表“控制器日期及时间结构“。
xTime bTime; //生效时间。对应上面数据的00 00。格式见附表“控制器日期及时间结构“。
xDate eDate; //失效日期。对应上面数据的21 3c。格式见附表“控制器日期及时间结构“。
xTime eTime; //失效时间。对应上面数据的7d bf。格式见附表“控制器日期及时间结构“。
unsigned char tz; //时段,默认为0。对应上面数据的00。0表示任意时段都可以通过,其它数值按位表示8个时段。
unsigned char reader; //可用读头,默认为255。对应上面数据的ff。其中由低到高共8位,分别表示串口1-4和韦根1-4共8个读头的可用状态,每位取值为1表示可用,0表示不可用。即reader取值为255表示全部读头可用,0表示全部读头不可用。reader取值为4表示仅串口3可用其它不可用。使用综合门禁控制器工具的权限配置中的读头号后面的按钮,可以选择可用读头并计算此值。
unsigned short remain; //次数余额,默认为65535表示不限次。对应上面数据的ffff。0表示无权限;1-59999表示不分方向的总次数余额;60000到65050表示按方向限次,其中6ABCD中的AB表示进入限次值,CD表示外出限次值。如60102表示允许进1次出2次。注意,限次功能需要控制板选项19及选项(21或/和25)
unsigned int isName:1; //表示是否使用姓名替代卡号授权,默认为0。一般不使用,仅适用于刷身份证开门和车牌识别开门时,使用姓名和车牌号码当卡号使用。
unsigned int hasPackage:1; //是否有邮件,默认为0
unsigned int hasDebt:1; //是否有欠款,默认为0
unsigned int hasFlag1:1; //自定义标志,默认为0
unsigned int hasFlag2:1; //自定义标志,默认为0
unsigned int hasFlag3:1; //自定义标志,默认为0
unsigned int hasAntiback:1; //反潜回标志,默认为0
unsigned int reserved:16; //预留,默认为0
unsigned int grp:3; //人员分组,默认为0
unsigned int pos:2; //人员位置,默认为0
unsigned int manType:4; //人员类型,默认为0
}
例如:
如下控制器权限数据
00 00 00 00 d2 02 96 49 bf 20 00 00 21 3c 7d bf 00 ff ff ff 00 00 00 00
根据其结构分析可以得知其对应信息为
卡号=00 00 00 00 d2 02 96 49 =>1234567890
生效日期时间=bf 20 00 00,表示
日期0x20bf= 二进制0010000-0101-11111=16年5月15日。
时间0x0000=0点
失效日期时间=21 3c 7d bf,表示
日期0x3c21=0011110-0001-00001=30年1月1日
时间0xbf7d=10111-111011-11101=23点59分58(29*2)秒