版本明细

日期 版本 说明 作者
2019-08-05 v0.1.0 初稿,待评审 林惠武
2019-08-13 v0.2.0 1. 初始化流程完善
2. 新增设备恢复出厂设置协议
3. 新增获取服务端时间协议
4. 新增服务端通用错误码
5. 业务心跳协议修改
6. 其他细节描述完善
林惠武、梁贤森、李仙平
2019-08-26 v0.3.0 1. 优化设备信息参数命名规范
2. 去掉固件升级协议
林惠武、梁贤森
2019-12-25 v0.4.0 1. 新增门禁、访客相关协议;
2. 完善设置客户端选项协议;
林惠武
2020-02-12 v0.4.1 1. 新增常开时间段门禁属性;
2. 【更新门禁组】参数命名规范优化;
3. 【更新人员门禁权限】参数命名规范优化;
4. 【删除门禁时间段】参数命名规范优化;
5. 【删除门禁组】参数命名规范优化;
6. 【删除节假日】参数命名规范优化;
7. 【删除访客信息】参数命名规范优化;
林惠武
2020-02-14 v0.4.2 统一best系列命名规范
1. 【设备信息】命名规范整改;
2. 【上传设备特性】命名规范整改;
3. 【设置客户端的选项】命名规范整改
4. 【获取客户端的选项】命名规范整改;
3. 【节假日】相关协议命名规范整改
林惠武
2020-04-13 v0.4.3 【更新人员门禁权限】、【上传打卡记录】新增规则类别 林惠武
2020-05-08 v0.4.4 1. 新增上传文件协议;
2. 新增上传打卡照片协议;
林惠武
2020-05-28 v0.4.5 新增设置打卡照片参数协议 林惠武
2020-07-13 v0.4.6 【更新人员门禁权限】新增验证方式类型属性 林惠武
2020-07-27 v0.4.7 1. 新增【上传门实时状态】、【上传设备实时状态】协议
2. 【设置门禁参数】新增本地报警参数
林惠武
2020-12-15 v0.5.1 新增远程登记生物特征协议 林惠武
2021-04-06 v0.6.1 新增(门禁)二维码参数配置协议 林惠武
2021-04-13 v0.6.2 设备上报新增门禁二维码相关参数 林惠武
2021-06-02 v0.6.3 设备上报门禁二维码相关参数修改 蔡火添
2021-07-05 v0.7.1 1. 新增【设备上报】辅助输入功能参数
2. 新增【设置门禁参数】辅助输出相关参数
林惠武
2021-09-06 v1.1.0 1. 修改【上传门实时状态】协议,新增辅助输出状态
2. 修改【更新访客信息】协议,修改访客密码信息、有效期等信息标准
3. 新增【更新访客照片】协议
4. 新增【更新开门密码】协议
林惠武
2021-09-17 v1.1.1 1. 新增【删除开门密码】协议
2. 新增【清除开门密码】协议
林惠武
2021-12-27 v1.2.1 1. 新增【重置设备参数】协议,包括人脸、门禁、音量等系统参数重置指令
2. 设备上报新增门禁、人脸相关参数
林惠武
2022-05-08 v1.2.2 设备上报时新增funcIds参数 林惠武
2022-07-20 v1.3.0 1.新增【获取代理服务器信息
2. 设备上报新增支持自动注册参数
林惠武

协议说明

背景

目前市场上ZKTeco的产品使用的通讯协议大部分是基于http/https的PUSH协议,短连接数据协议,经过多年的使用,发现了一些不足,主要是性能方面的,包括:

  • HTTP的连接问题,HTTP客户端和服务器之间的交互是采用请求/应答模式,在客户端请求时,会建立一个HTTP连接,然后发送请求消息,服务端给出应答消息,然后连接就关闭了。(后来的HTTP1.1支持持久连接)因为TCP连接的建立过程是有开销的,如果使用了SSL/TLS开销就更大。
  • HTTP消息头问题,现在的客户端会发送大量的HTTP消息头。
  • HTTP通信方式问题,HTTP的请求/应答方式的会话都是客户端发起的,缺乏服务器通知客户端的机制,设备想要获取服务器命令,就需要不断地轮询服务器

综上为解决各种性能问题,由此引进面向长连接数据协议的ZKTeco BEST数据协议。

BEST 简介

BEST协议是Biometric Exchange Synchronization Transmission Protocol缩写,应用于ZKTeco相关产品,其强调的是数据协议,可应用于各种网络传输协议,如mqtt、websocket等

BEST-T 简介

BEST-T,即Best over tencent,表示基于腾讯IoT Hub 的BEST协议,采用mqtt协议通讯,,本文档只说明关于通道建立之后的数据通讯协议,关于设备端如何接入请直接参考腾讯IoT签名认证接入指引

特别注意:BEST系列协议,如BEST-T,与主流BEST协议,其除了初始化(鉴权)流程多了一步腾讯的签名认证,其余数据格式均一致。

Broker声明

腾讯IoT Hub分为公有云及ZKTeco专有云,对应的Mqtt Broker Address如下:

服务端 地址 端口 备注
腾讯公有云 iotcloud-mqtt.gz.tencentdevices.com 8883 公有云取决于账号所指定节点,此处为广州
ZKTeco专有云 zk-iotcloud-mqtt.gz.tencentdevices.com 8883 专有云目前建设的只提供广州节点

注:从v1.3.0开始,提供broker信息动态获取操作

Topic声明

以腾讯IoT Hub鉴权为基础,以下相关数据交互与Topic关系:

  • ${productId}/${deviceName}/event

对设备而言属于消息发布topic,凡是设备主动上报的消息,包含数据上传、命令回复、心跳、登录等,都固定发布到此topic。

  • ${productId}/${deviceName}/control

对设备而言属于消息订阅topic,凡是服务端主动下发的消息,包含命令下发、设备消息回复等,都固定发布到此topic。

设备初始化流程

获取代理服务器信息

此步骤为http/https请求,在获取不到通讯服务器地址时,默认一直请求,直到获取到通讯服务器地址为止,请求时间间隔默认30秒。

Request:

URL: https://${ServerAddress}/v3/device/getBrokerServer?sn={SN}&type={TYPE}&nonce={NONCE}&timestamp={timestamp}&sign={SIGN}
Method: Get
参数 是否必须 描述
sn 设备序列号
type 通讯协议类型,取值范围(全小写):
push:表示获取push通讯地址;
best-w:表示获取best over websocket 通讯服务器地址
best-t:表示获取best over tencent broker地址
best-m:表示获取best over mqtt()
best-a:表示获取best over aws iot core

ZKTeco+ 此处暂时固定best-t即可
nonce 随机数,不得超过32位,随机数不得重复
timestamp 时间戳,精确到毫秒,服务端结合nonce一起做防重放攻击
sign 数字签名,{SN}+{nonce}+{timestamp}+{secretKey} 经32位小写md5摘要之后得到的签名,如SN=abcd, nonce=123456, timestamp=1646102871000, secretKey=aabbcc, 则sign的值为字符串“abcd1234561646102871000aabbcc”的32位md5摘要内容,即bdd58420c142a11569ff3eb8a9ec535c,注意secretKey是在生产时由生产系统调用ZKTeco+预注册时返回,并写入到设备的,此处不会直接明文传输
  • 正常回复:
{
    "code": "00000000",
    "message": "success",
    "payload": {
        "results": {
            "url": "mqtts://xxxx:port",
            "tProductId":"xxxxxxxxxx",
            "tSecretKey":"xxxxxxxx"
        }
    }
}
参数 必填 描述
url 通讯(代理)服务器地址
tProductId 该设备所属腾讯iot的产品id
tSecretKey 该设备在腾讯iot的设备密钥,用于密钥模式下的安全认证
  • 异常回复:

设备没权限或服务异常时回复

{
    "code": "其他不等于00000000的错误码",
    "message": "错误描述"
}

设备注册

设备注册,主要是为了获取授权码。
当设备Flash中不存在授权码,或者设备登录失败时调用。

若设备注册成功,则继续请求设备授权;
若设备注册失败,则60秒之后重新请求设备注册;

设备请求:

{
    "funcId": "dev.register",
    "sn": "xxxx", 
    "mid": "xxxx",
    "payload": {
        "params": {
            "protType": "best-t",
            "protVer": "1.0.0",
            "devKey": "xxxx",
            "devType": "att"
        }
    }
}

参数描述:

参数名 是否必须 描述
protType 协议名称,取值:
best-w: 基于主流websocket;
best-m:基于主流mqtt
best-t:基于腾讯IoT Hub
protVer 协议版本
devType 设备类型, 取值:
att:考勤/简单门禁/高级门禁业务
acc:专业门禁业务
elev:梯控业务
devKey 约定的设备key,代表ZKTeco设备

服务端响应:

{
    "funcId": "cmd.dev.response",
    "code": "00000000", 
    "message": "消息内容", 
    "mid": "xxxxxxxx",
    "payload": {
        "results": {
            "authCode": "xxxxx"
        }
    }
}
参数名 必填 描述
authCode 授权码

设备授权

设备请求:

授权是为了获取登录密码。
设备注册成功后调用,若授权失败,则需重新注册,获取授权码。
{
    "funcId": "dev.accredit",
    "sn": "xxxx",
    "mid": "xxxx",
    "payload": {
        "params": {
            "devKey": "xxxx",
            "authCode": "xxxx"
        }
    }
}

服务端响应:

{
    "funcId": "cmd.dev.response",
    "code": "00000000", 
    "message": "消息内容", 
    "mid": "xxxxxxxx",
    "payload": {
        "results": {
            "secret": "xxxxxxx"
        }
    }
}
参数名 描述
secret 设备登录密码

设备登录

授权成功后走设备登录
若收到00000000成功编码,则继续走下一步流程【设备上报】;
若收到S00E0001、S00E0002、S00E0003、S00E0004等错误码,则重新走初始化流程;
若收到其他错误编码,则60秒之后继续登录;

设备请求:

{
    "funcId": "dev.login",
    "sn": "xxxx",
    "mid": "xxxx",
    "payload": {
        "params": {
            "devKey": "xxxx",
            "authCode": "xxxx",
            "secret": "xxxx"
        }
    }
}

服务端回复:

登录成功回复:

{
    "funcId": "cmd.dev.response",
    "code": "xxxxxxxx",
    "message": "消息内容",
    "mid": "xxxxxxxx"
}

设备上报

设备登录成功后,必须上报设备信息
设备信息上报仅仅在初始化流程上报,若服务端需要设备重新上报所有设备信息,则让设备重新走登录流程即可。
上报设备信息,包括设备容量、设备属性、固件信息等

设备请求:

{
    "funcId":"dev.report",
    "mid":"xxxx",
    "payload":{
        "params":{
            "devModel":"IFace302",
            "fwVer":"xxx",
            "maxUserCount":"10000",
            "userCount":"500",
            "maxAttLogCount":"50000",
            "attLogCount":"50000",
            "fpFunOn":"1",
            "fpVer":"10.0",
            "maxFpCount":"10000",
            "fpCount":"10000",
            "faceFunOn":"1",
            "faceVer":"9.0",
            "maxFaceCount":"1000",
            "faceCount":"1000",
            "visLightFunOn":"1",
            "maxVisLightCount":"5000",
            "visLightCount":"5000",
            "ip":"192.168.213.10",
            "mac":"00:17:61:10:01:26",
            "wirelessSSID":"ZKTeco-wifi",
            "lockFunOn":"0",
            "qrCodeSupport":"1",
            "qrCodeDec":"1",
            "qrCodeOn":"1",
            "auxInFunOn":"0",
            "lockOn":"1",
            "doorSensorTimeout":"10",
            "doorSensorAlarmTimeout":"5",
            "doorSensorMode":"0",
            "isHolidayValid":"0",
            "localAlarmOn":"1",
            "faceMThr":"74",
            "faceVThr":"63",
            "faceEThreshold":"70",
            "facePitchThreshold":"35",
            "faceRollYawThreshold":"25",
            "modifyClarityCond":"40",
            "faceMinThreshold":"80",
            "motionDetectSensitivity":"4",
            "grayThroldValue":"80",
            "faceLivenessThreshold":"50",
            "enableBioTest":"1",
            "IRLivenessFunOn":"0",
            "WDRStatus":"0",
            "volume" : "10",
            "funcIds": ["dev.option.upload", "dev.data.upload.user", "xxxxx"],
            "autoRegisterFunOn":"0"
        }
    }
}
参数名 必填 描述
devModel 设备型号
fwVer 固件版本号
maxUserCount 设备用户容量
userCount 当前设备用户数
maxAttLogCount 设备考勤记录容量
attLogCount 当前设备考勤记录数
fpFunOn 指纹模板功能参数,1: 支持, 0: 不支持(默认)
fpVer 指纹算法版本,当fpFunOn=1时必传
maxFpCount 设备指纹容量,当fpFunOn=1时必传
fpCount 当前设备指纹模板数,当fpFunOn=1时必传
faceFunOn 近红外人脸模板功能参数,1: 支持, 0: 不支持(默认)
faceVer 近红外人脸算饭版本,当faceFunOn=1时必传
maxFaceCount 设备近红外人脸模板容量,当faceFunOn=1时必传
faceCount 当前设备近红外人脸模板数,当faceFunOn=1时必传
visLightFunOn 可见光人脸功能参数,1: 支持, 0: 不支持(默认)
maxVisLightCount 设备可见光人脸容量,当visLightFunOn=1时必传
visLightCount 当前设备可见光人脸数,当visLightFunOn=1时必传
ip 设备ip地址
mac 设备mac地址
wirelessSSID wifi名称
lockFunOn 门禁功能参数,0:关闭(默认),1:简单门禁,15:高级门禁
multiBioEnrollSupport 设备多模态生物特征远程登记功能支持, 详见生物识别类型进行按位定义, 不同类型间用冒号隔开, 0:不支持, 1:支持, 如:0:1:1:0:0:0:0:0:0:0, 默认为0:0:0:0:0:0:0:0:0:0,即所有特征都不支持远程登记,表示支持指纹模板支持和近红外人脸远程登记功能支持
qrCodeSupport 二维码支持情况,取值如下:
0:不支持二维码功能(默认)
1:支持二维码功能
qrCodeDec 是否支持加密方式解析二维码,
0:二维码按非加密方式解析,
1:二维码按加密方式解析
qrCodeOn 二维码功能开关,若设备支持二维码,但未开启二维码功能,也不可使用,取值范围
0:关闭,
1:开启
auxInFunOn 辅助输入功能参数,1: 支持, 0: 不支持(默认)
lockOn 锁驱动时长,取值范围(单位:秒):0~10,为空时默认为0
doorSensorTimeout 门磁延时,取值范围(单位:秒):1~255,为空时默认为1
doorSensorAlarmTimeout 门磁报警延时,取值范围(单位:秒):0~999,为空时默认为0
doorSensorMode 门磁模式,0:常开型,1:常闭型,2:关闭,为空时默认为0
isHolidayValid 节假日是否有效,用于常开/常闭判断中是否增加节假日的判断,取值范围:1:有效,0:无效
localAlarmOn 本地报警,本地报警开了后,如果出现拆机情况设备会发出报警声
取值范围,1:打开本地报警(默认) 0:关闭本地报警
faceMThr 1:N阈值
在1:N模式下(iT1只有1:N模式)进行人脸比对时,超过默认值时才能比对通过
faceVThr 1:1阈值
在1:1模式下进行人脸比对时,超过默认值时才能比对通过
faceEThreshold 面部登记阀值
在进行面部登记时的匹配值
facePitchThreshold 人脸俯仰角度
人脸登记、比对时的俯视、仰视的角度,超过该值,将会被过滤
faceRollYawThreshold 人脸旋转角度
人脸登记、比对时的左右角度,超过该值,将会被算法过滤
modifyClarityCond 图像质量
人脸登记、比对时的图像质量,值越高,图像要求越清晰
faceMinThreshold 最小人脸像
登记、比对时要求的人脸大小,低于该值将会被过滤。例:本机登记时人站的远近,照片下发登记时,人脸的大小
motionDetectSensitivity 移动侦测灵敏度
从待机到唤醒比对界面的灵敏值,值越大越灵敏,越容易进入比对界面
grayThroldValue 补光灯开启灵敏度
控制补光灯开启的值,值越大,越容易开启补光灯
faceLivenessThreshold 活体检测阈值
判断可见光图像是否为活体的阈值,值越大,可见光防伪越严格
enableBioTest 活体检测开关
利用可见光图像进行活体检测
IRLivenessFunOn 近红外防伪开关
利用近红外图像进行防伪检测
WDRStatus WDR开关
宽动态,场景中特别亮的部位和特别暗的部位同时都能看得特别清楚
volume 音量
funcIds 设备端支持的funcIds列表,增加funcId交换的背景:为了解决新增功能时,设备同时支持老服务器和新服务器(服务器同时支持老设备和新设备),需要增加功能参数来标识是否支持对应数据或功能,统一funcId交换,避免一直新增功能参数来做兼容,其中dev.register、dev.accredit、dev.login、dev.report、cmd.dev.response、dev.cmd.response默认必须支持。
autoRegisterFunOn 支持自动注册,用于确认设备中的产品id和设备密钥等认证参数需不需要,可不可以动态变更
0:不支持(默认)
1:支持

服务端响应:

{
    "funcId": "cmd.dev.response",
    "code": "xxxx",
    "message": "xxxx",
    "mid": "xxxx",
    "payload": {
        "results": {
            "timezone": "+08:00",
            "supportHeartbeat": "1",
            "heartbeatInterval": "60",
            "fpFunOn": "0",
            "faceFunOn": "0",
            "visLightFunOn": "0",
            "punchPhotoFunOn": "0",
            "qrCodeDecryptType": "2",
            "qrCodeDecryptKey": "UkhGaXpuaXE2bjQ3YkxqNFhVVlpMUzF5eVFFVzhTaUo="
        }
    }
}
参数名 必填 描述
timezone 设备时区,默认为+08:00,即表示东八区北京时间
supportHeartbeat 服务端是否支持业务心跳,1:支持(默认),0:不支持
heartbeatInterval 业务心跳时间间隔,单位:秒,默认60秒
fpFunOn 服务端指纹功能参数,1:支持(默认),0:不支持,当服务端不支持时,设备不能上传指纹
faceFunOn 服务端近红外人脸参数,1:支持(默认),0:不支持,当服务端不支持时,设备不能上传近红外人脸模板
visLightFunOn 服务端可见光人脸参数,1:支持(默认),0:不支持,当服务端不支持时,设备不能上传可见光模板或照片
qrCodeDecryptType 门禁二维码解密方式。2:利用AES256算法加密;
qrCodeDecryptKey 门禁二维码加密密钥

心跳

设备登录成功才需要发送业务心跳。
此处心跳为业务心跳,主要作用是告知服务端设备当前的运行状态,以便服务端能够准确的下发设备命令;

设备请求:

{
    "funcId": "dev.heartbeat", 
    "mid": "xxxx", 
    "payload": {
        "params": {
            "isFree": "1"
        }
    }
}
参数名 是否必须 描述
isFree 是否处于空闲状态, 即没有在处理命令。
0:繁忙(设备有在处理命令),1:空闲(设备没有在处理命令)
为空时默认为1

服务端响应:

{
    "funcId": "cmd.dev.response",
    "code": "00000000", 
    "message": "xxxx", 
    "mid": "xxxx"
}

业务心跳使用约定:

  1. 长连接本身系统心跳(如ping/pong)仍然保留;
  2. 初始化流程走完才能发送业务心跳;
  3. 若设备在处理命令,可不用发业务心跳;
  4. 业务心跳的时间间隔默认60秒,可由服务端控制(初始化返回参数或者单独下发设置客户端选项命令);

为什么需要业务心跳:

业务心跳主要是补救措施,假设服务端一批命令下发了100条,设备只回复了99条,这个时候服务端没法准确的判断剩下的一条是在执行中,还是已丢失(可能网络传输丢失,也可能设备拿到数据之后因某些原因丢失),此时服务端不知道是要重新下发命令,还是继续等待设备回复。

如何关闭心跳:

服务端可以不依赖此心跳,自己内部实现解决上面描述的问题,此时设备不应该再开启业务心跳功能,会浪费流量,给服务端压力,所以可以将其关闭掉。仅需要在设备信息请求回复不支持心跳功能即可,即supportHeartbeat为0

设备上传数据

上传设备参数

上传设备参数,主要是上传设备记录数据,如人员数、指纹数、打卡记录数等等信息。
若设备数据有产生变动,则应上传相关的数据记录信息。

设备请求:

{
    "funcId":"dev.option.upload",
    "mid":"xxxx",
    "payload":{
        "params":{
            "option":{
                "optionName1":"optionValue1",
                "optionName2":"optionValue2"
            }
        }
    }
}

服务端响应:

{
    "funcId":"cmd.dev.response",
    "code":"xxxx",
    "message":"xxxx",
    "mid":"xxxx"
}

上传人员信息

上传设备上的人员信息,包含基本信息、设备密码、角色、卡号、模板信息等

设备请求

{
    "funcId": "dev.data.upload.user",
    "mid": "xxxx",
    "payload": {
        "params": {
            "users": [{
                "pin": "2956",
                "name": "luther.lin",
                "passwd": "",
                "pri": "0",
                "verifyMode": "0",
                "cards": ["4010846978"],
                "bioDatas": [{
                    "no": "0",
                    "index": "0",
                    "valid": "1",
                    "duress": "0",
                    "type": "2",
                    "majorVer": "10",
                    "minorVer": "1",
                    "fmt": "0",
                    "tmp": "xxxxxxxxxxxxxxxxxxxx"
                }]
            }]
        }
    }
}

请求参数详解:

通用部分见附录1

参数名 描述
pin 员工工号
name 员工姓名
passwd 密码
pri 用户设备上的角色,0:普通员工,14:管理员
verifyMode 验证方式,默认为0,详见验证方式说明
cards 卡号集合
no 生物具体个体编号
【指纹】编号是: 0-9。对应的手指是:左手:小拇指/无名指/中指/食指/拇指,右手:拇指/食指/中指/无名指/小拇指;
【指静脉】和指纹相同
【面部】no=0
【虹膜】no 按照 0 为左眼 1为右眼
【掌静脉】no 按照 0 为左手, 1为右手. 如果no 没有明确定义,则默认值为 0。
index 生物具体个体模板编号,如 1个手指存储多枚模板。从 0 开始计算
valid 是否有效标示, 0:无效, 1:有效,默认为 1
duress 是否胁迫标示, 0:非胁迫, 1:胁迫,默认为 0
type 生物识别类型,详见生物识别类型
majorVer 模板算法版本之主版本,如: 指纹算法版本 10.3,主版本是 10,副版本是 3
minorVer 模板算法版本之副版本,如: 指纹算法版本 10.3,主版本是 10,副版本是 3
fmt 模板格式, 如指纹有ZK\ISO\ANSI 等格式
0: ZK
1: ISO
2: ANSI
tmp 指纹、面部、手掌模板信息,需进行base64编码传输

服务端响应:

{
    "funcId":"cmd.dev.response",
    "code":"xxxx",
    "message":"xxxx",
    "mid":"xxxx"
}

响应参数详解:

通用部分见附录1

上传打卡记录

设备请求

{
    "funcId": "dev.data.upload.attLog",
    "mid": "xxxx",
    "payload": {
        "params": {
            "attLogs": [{
                "pin": "2956",
                "attState": "255",
                "verifyMode": "0",
                "workCode": "0",
                "punchTime": "2019-07-31T08:59:59+08:00",
                "type": "1"
            }, {
                "pin": "2956",
                "attState": "255",
                "verifyMode": "0",
                "workCode": "0",
                "punchTime": "2019-07-31T14:59:59+08:00",
                "type": "1"
            }]
        }
    }
}

请求参数详解:

通用部分见附录1

参数名 必填 描述
pin 员工工号
attState 考勤状态
verifyMode 验证方式
workCode 工作号码
punchTime 打卡时间,ISO标准时间格式:yyyy-MM-ddTHH:mm:ss+hh:mm
type 记录类别,1:考勤(默认);2:门禁;3:考勤+门禁;
为空时默认考勤

服务端响应:

{
    "funcId":"cmd.dev.response",
    "code":"xxxx",
    "message":"xxxx",
    "mid":"xxxx"
}

上传生物特征图片

设备请求

{
    "funcId": "dev.data.upload.bioPhoto",
    "mid": "xxxx",
    "payload": {
        "params": {
            "bioPhotos": [{
                "pin": "2956",
                "type": "9",
                "no": "0",
                "index": "0",
                "size": "95040",
                "content": "AAAA........",
                "extension": "xxxx"
            }]
        }
    }
}
参数名 必填 描述
pin 员工工号
type 生物识别类型,详见生物识别类型
no 生物具体个体编号,详见生物具体个体编号, 如果no没有明确定义, 则默认值为0
index 生物具体个体模板编号, 如1个手指存储多枚模板, 从0开始计算, index没有明确定义, 则默认值为0
size 生物特征图片base64 编码之后的长度
content 图片内容,值为原始二进制生物特征图片base64编码
extension 图片的扩展名, extension没有明确定义, 则默认值为jpg

服务端响应:

{
    "funcId":"cmd.dev.response",
    "code":"xxxx",
    "message":"xxxx",
    "mid":"xxxx"
}

上传访客记录

预约访客的来访记录

设备请求

{
    "funcId": "dev.data.upload.visitLog",
    "mid": "xxxxxxxx",
    "payload": {
        "params": {
            "logs": [{
                    "pin": "8065",
                    "verifyMode": "1",
                    "visitTime": "2019-07-31T08:59:59+08:00"
                }
            ]
        }
    }
}
参数名 必填 描述
pin 访客临时工号
verifyMode 验证方式,默认为0,详见验证方式说明
visitTime 来访时间

服务端响应:

{
    "funcId": "cmd.dev.response",
    "code": "xxxx", 
    "message": "xxxx", 
    "mid": "xxxx"
}

上传文件

此协议主要针对需上传大文件时使用,此处不强调具体文件格式,仅读取文件字节流base64进行传输,具体文件目标格式以目标业务使用时为准;

注:大数据时也可以直接使用此协议进行预先传输,然后再具体功能协议中指定大数据内容所属fileId,此时fileId可以理解为是一个大数据标识

上传开始

通知服务端要开始上传文件,指定文件的fileId、大小、checksum等文件基础信息

设备请求

{
    "funcId": "dev.file.upload.start",
    "mid": "xxxx",
    "payload": {
        "params": {
            "fileId": "e78dc2cef23d495ab4f890fe3362bee9",
            "size": "1208",
            "checksum": ""
        }
    }
}
参数名 必填 描述
fileId 设备内文件唯一标识, 由字母和数字组成, 最高不能超过64位, 建议使用32位uuid
size 整包字节长度
checksum 总和校验码,值为整包二进制字节md5摘要,服务端根据checksum是否为空进行checksum校验文件完整性

服务端响应:

{
    "funcId": "cmd.dev.response",
    "code": "xxxx", 
    "message": "xxxx", 
    "mid": "xxxx"
}

上传文件包

上传文件分包内容到服务端,其中分包内容为读取文件分包字节base64加密串

设备请求

{
    "funcId": "dev.file.upload.package",
    "mid": "xxxx",
    "payload": {
        "params": {
            "fileId": "e78dc2cef23d495ab4f890fe3362bee9",
            "offset": "215",
            "content": "xxxxxxxxxxxxxxx"
        }
    }
}
参数名 必填 描述
fileId 设备内文件唯一标识, 由字母和数字组成, 最高不能超过64位, 建议使用32位uuid
offset 上次已传输文件偏移位置
content 文件分包内容,读取二进制数据流base64加密

服务端响应:

{
    "funcId": "cmd.dev.response",
    "code": "xxxx", 
    "message": "xxxx", 
    "mid": "xxxx"
}

上传完成

设备请求

{
    "funcId": "dev.file.upload.end",
    "mid": "xxxx",
    "payload": {
        "params": {
            "fileId": "e78dc2cef23d495ab4f890fe3362bee9"
        }
    }
}

服务端响应:

{
    "funcId": "cmd.dev.response",
    "code": "xxxx", 
    "message": "xxxx", 
    "mid": "xxxx"
}

上传打卡照片

设备请求

{
    "funcId": "dev.data.upload.punchPhoto",
    "mid": "xxxx",
    "payload": {
        "params": {
            "punchPhotos": [{
                "pin": "2956",
                "punchTime": "2019-07-31T08:59:59+08:00",
                "type": "1",
                "content": "xxxxxxxxxxxxxxxxxxxxx",
                "contentFileId": "xxxxxxxxxxxxx"
            }]
        }
    }
}
参数名 必填 描述
pin 员工工号,有此内容时需填入,理论上仅有当比对失败时不用存在此内容
punchTime 打卡时间
type 比对类别,指抓拍的照片是比对成功还是比对失败的照片,取值范围,1:成功(默认),0:失败
content 照片内容,值为原始二进制打卡照片base64编码,与contentFileId不能同时为空,优先使用content
contentFileId 照片内容文件id,当上传照片超过通讯协议限制的大小时使用,将照片预先分包上传,详见(上传文件)[#file_upload],然后指定fileId,与content不能同时为空

上传门实时状态

设备上传门实时状态到服务端

设备请求:

{
    "funcId":"dev.data.upload.doorRealStatus",
    "mid":"xxxx",
    "payload":{
        "params":{
            "realStatuss":[
                {
                    "time":"2020-12-30T20:00:00+08:00",
                    "sensor":"2",
                    "relay":"0",
                    "alarm":"0",
                    "coerce":"0",
                    "auxOut":"0"
                }
            ]
        }
    }
}

请求参数详解:

参数名 必填 描述
time 时间, ISO标准时间格式:yyyy-MM-ddTHH:mm:ss±HH:mm, (yyyy-MM-ddTHH:mm:ss):设备的本地时间, (HH:mm):时区偏移量
sensor 门磁开关状态, 0:当前门无门磁, 1:当前门有门磁(门是关闭状态), 2:当前门有门磁(门是打开状态)
relay 门继电器开关状态, 0:继电器吸合, 1:继电器断开
alarm 报警状态, 0:无报警, 1:意外开门事件, 2:门磁超时报警
coerce 胁迫状态, 0:无胁迫, 1:密码, 2:指纹
auxOut 辅助输出联动状态,取值如下:
-1:未触发(默认)
0:无
1:触发开门
2:触发报警
3:触发开门和报警
此处表示有无触发联动,默认是未触发,当触发联动时将此前设置的辅助输出类型(即0、1、2、3等)上报

服务端响应:

{
    "funcId":"cmd.dev.response",
    "code":"xxxx",
    "message":"xxxx",
    "mid":"xxxx"
}

上传设备实时状态

设备上传设备实时状态到服务端

设备请求:

{
    "funcId":"dev.data.upload.devRealStatus",
    "mid":"xxxx",
    "payload":{
        "params":{
            "realStatuss":[
                {
                    "time":"2020-12-30T20:00:00+08:00",
                    "tamper":"0"
                }
            ]
        }
    }
}

请求参数详解:

参数名 必填 描述
time 时间, ISO标准时间格式:yyyy-MM-ddTHH:mm:ss±HH:mm, (yyyy-MM-ddTHH:mm:ss):设备的本地时间, (HH:mm):设备的时区
tamper 设备拆机报警, 0:正常, 1:拆机

服务端响应:

{
    "funcId":"cmd.dev.response",
    "code":"xxxx",
    "message":"xxxx",
    "mid":"xxxx"
}

设备实时请求

获取服务端时间

设备请求服务端获取当前时间,2秒之内没收到服务端的回复此同步时间无效。

设备请求:

{
    "funcId": "dev.system.sync.time",
    "imme": "1",
    "mid": "xxxx"
}

服务端响应:

{
    "funcId": "cmd.dev.response",
    "code": "xxxx",
    "message": "xxxx",
    "mid": "xxxx",
    "payload": {
        "results": {
            "time": "2019-08-12T20:01:01+08:00"
        }
    }
}
参数名 描述
time 当前ISO8601时间,格式为yyyy-MM-ddTHH:mm:ss+hh:mm,如2019-08-12T20:01:01+08:00

物理重置通知

人工手动对设备进行恢复出厂设置时触发事件,通知服务端。
恢复出厂设置之后,设备可能网络已经断开,所以设备需在下一次联网初始化成功后告知服务端。

设备请求

{
    "funcId": "dev.system.reset",
    "mid": "xxxx",
    "payload": {
        "params": {
            "time": "2019-08-12T20:01:01+08:00"
        }
    }
}
参数名 描述
time 重置时间,ISO8601格式,格式为yyyy-MM-ddTHH:mm:ss+hh:mm,如2019-08-12T20:01:01+08:00

服务端响应:

{
    "funcId":"cmd.dev.response",
    "code":"xxxx",
    "message":"xxxx",
    "mid":"xxxx"
}

指纹登记进度通知【已过时】

设备接收到服务端下发的远程登记指纹命令后,需将指纹登记进度实时通知服务端。

但远程登记指纹协议已过时,建议使用远程登记生物特征

设备请求:

{
    "funcId":"dev.data.tip.fp",
    "imme":"1",
    "mid":"xxxx",
    "payload":{
        "params":{
            "num":"xxxx",
            "code":"xxxx",
            "message":"xxxx"
        }
    }
}

请求参数详解:

参数 描述
num 第N次按手指
code 第N次按手指返回值
message 第N次按手指返回值对应的消息内容

code与message消息列表:

code message
0 成功
-1 用户不存在
-2 指纹容量已满
-3 指纹重复
-4 超时退出
-5 指纹合成失败
-6 获取数据异常
-7 添加到内存失败
-10 模板提取异常【位置不对】
-12 其他异常

服务端响应:

{
    "funcId":"cmd.dev.response",
    "code":"xxxx",
    "message":"xxxx",
    "mid":"xxxx"
}

控制命令

登记指纹【已过时】

设备接收到此命令,则自动打开登记指纹窗口,登记指定员工工号的指纹模板;

此接口已过时,建议使用远程登记生物特征

服务端请求:

{
    "funcId":"cmd.control.enter.fp",
    "imme":"1",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "pin":"xxxx",
            "no":"xxxx"
        }
    }
}

请求参数详解:

参数名 必填 描述
pin 设备员工工号
no 指纹编号, 取值范围:0-9。
对应的手指是:左手:小拇指/无名指/中指/食指/拇指,右手:拇指/食指/中指/无名指/小拇指;

设备响应:

  1. 上传指纹登记进度,见指纹登记进度通知

  2. 回复命令执行结果,见命令回复

取消登记指纹

设备收到此命令,要取消登记指纹动作,退出登记指纹窗口。

服务端请求:

{
    "funcId":"cmd.control.cancel.fp",
    "imme":"1",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx"
        }
    }
}

设备响应:

命令回复

重启客户端

重启设备

服务端请求:

{
    "funcId":"cmd.control.reboot",
    "imme":"1",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx"
        }
    }
}

请求参数详解:

设备响应:

命令回复

重新登录

设备收到此命令,重新请求设备登录

服务端请求:

{
    "funcId":"cmd.control.relogin",
    "imme":"1",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx"
        }
    }
}

设备响应:

命令回复

远程开门

Request:

{
    "funcId": "cmd.control.open.door", 
    "imme": "1",
    "mid": "xxxxxxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxxx"
        }
    }
}

设备响应:

命令回复

远程登记生物特征

服务端下发远程登记生物特征命令,固件端实时响应打开对应的登记生物特征窗口,并实时上报登记进度和结果。

服务端需根据设备上报的multiBioEnrollSupport参数来判断设备是否支持远程登记功能

服务端请求:

{
    "funcId": "cmd.control.enroll.bio",
    "imme": "1",
    "mid": "xxxx",
    "payload": {
        "params": {
            "cmdId": "xxxx",
            "pin": "2956",
            "type": "1",
            "no" : "0"
        }
    }
}
参数名 必填 描述
imme 表示该命令为紧急命令,实时性要求最高,实时响应
pin 员工工号
type 生物特征类型,详见生物识别类型,如type=1时,表示远程控制登记指纹
no 生物具体个体编号
【指纹】编号是: 0-9。对应的手指是:左手:小拇指/无名指/中指/食指/拇指,右手:拇指/食指/中指/无名指/小拇指;
【指静脉】和指纹相同
【面部】no=0
【虹膜】no 按照 0 为左眼 1为右眼
【掌静脉】no 按照 0 为左手, 1为右手. 如果no 没有明确定义,则默认值为 0。

设备响应

  • 上传生物特征登记进度/结果
{
    "funcId": "dev.data.tip.bio", 
    "imme": "1",
    "mid": "xxxx", 
    "payload": {
        "params": {
            "num":"1",
            "code": "0", 
            "message": "成功",
            "end": "1"
        }
    }
}
参数 描述
num 第N次操作结果
登记指纹时表示第N次按手指
登记手掌时表示第N次探测手掌模板
code 第N次操作结果编码
msg 第N次操作结果描述
end 表示整个登记生物特征过程是否结束,0:否,1:是(默认)
当需要上报多次执行结果时,如录制指纹,需上报此参数为0,否则认为本次上报即为此次远程登记会话的执行结果

code及message说明

code message
0 成功
-1 用户不存在
-2 指纹容量已满
-3 指纹重复
-4 超时退出
-5 指纹合成失败
-6 获取数据异常
-7 添加到内存失败
-8 手掌容量已满
-9 手掌重复
-10 模板提取异常【位置不对】
-11 手掌离摄像头距离不对
-12 容量已满
-13 数据异常
-14 添加数据库失败
-15 模板重复
-16 设备录入中
-17 人脸合成失败

取消登记生物特征

设备收到此命令,要取消登记生物特征动作,退出登记生物特征窗口

服务端请求:

{
    "funcId": "cmd.control.cancel.bio",
    "imme": "1",
    "mid": "xxxx",
    "payload": {
        "params": {
            "cmdId": "xxxx"
        }
    }
}

设备响应:

命令回复

清除命令

清除全部数据

清除设备中所有数据,包括人员信息、生物模板、打卡记录等。

服务端请求:

{
    "funcId":"cmd.data.clear.all",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx"
        }
    }
}

设备响应:

命令回复

清除用户信息

删除设备中的所有用户,包含模板等关联信息

服务端请求:

{
    "funcId":"cmd.data.clear.user",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx"
        }
    }
}

设备响应:

命令回复

清除打卡记录

删除设备中的打卡记录

服务端请求:

{
    "funcId":"cmd.data.clear.attLog",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx"
        }
    }
}

设备响应:

命令回复

清除节假日信息

删除设备中所有的节假日信息

Request:

{
    "funcId": "cmd.data.clear.holiday", 
    "mid": "xxxxxxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxxx"
        }
    }
}

设备响应:

命令回复

清除开门密码

Request:

{
    "funcId": "cmd.data.clear.doorPassword", 
    "mid": "xxxxxxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxxx"
        }
    }
}

设备响应:

命令回复

删除命令

删除人员

删除设备中人员信息

服务端请求:

{
    "funcId":"cmd.data.delete.user",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "pins":[
                "xxxx",
                "xxxx",
                "xxxx"
            ]
        }
    }
}

请求参数详解:

参数名 必填 描述
pins 员工工号

设备响应:

命令回复

删除模板

删除设备中的生物模板

服务端请求:

{
    "funcId":"cmd.data.delete.bioData",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "bioDatas":[
                {
                    "pin":"2956",
                    "type":"2",
                    "no":"0"
                }
            ]
        }
    }
}

请求参数详解:

通用部分见附录1

参数名 必填 描述
cmdId 命令Id
bioDatas 模板
pin 工号
type 生物识别类型,为空时表示删除该员工所有模板信息
no 生物具体个体编号, 为空时表示删除指定type的全部模板信息

设备响应:

命令回复

删除门禁时间段

Request:

{
    "funcId": "cmd.data.delete.accTimezone", 
    "mid": "xxxxxxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxx",
            "timezoneIds": ["100","101"]
        }
    }
}
参数名 必填 描述
timezoneIds 时间段编号数组

设备响应:

命令回复

删除门禁组

Request:

{
    "funcId": "cmd.data.delete.accGroup", 
    "mid": "xxxxxxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxx",
            "groupIds": ["100","101"]
        }
    }
}
参数名 必填 描述
groupIds 门禁组编号数组

设备响应:

命令回复

删除节假日

Request:

{
    "funcId": "cmd.data.delete.holiday", 
    "mid": "xxxxxxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxx",
            "holidayIds": ["xx"]
        }
    }
}
参数名 必填 描述
holidayIds 节假日编号数组

设备响应:

命令回复

删除访客信息

Request:

{
    "funcId": "cmd.data.delete.visitor", 
    "mid": "xxxxxxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxxx", 
            "pins": ["xxx","xxxx"]
        }
    }
}
参数名 描述
pins 访客临时工号数组

设备响应:

命令回复

删除开门密码

Request:

{
    "funcId": "cmd.data.delete.doorPassword", 
    "mid": "xxxxxxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxxx", 
            "operators": ["xxx","xxxx"]
        }
    }
}
参数名 描述
operators 操作者/密码标签

设备响应:

命令回复

更新命令

更新人员信息

服务端请求:

{
    "funcId":"cmd.data.update.user",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "users":[
                {
                    "pin":"2956",
                    "name":"林某某",
                    "passwd":"123456",
                    "pri":"1",
                    "cards":[
                        "4010846978",
                        "521186050"
                    ],
                    "verifyMode":"0",
                    "bioDatas":[
                        {
                            "no":"0",
                            "index":"0",
                            "valid":"1",
                            "duress":"0",
                            "type":"2",
                            "majorVer":"10",
                            "minorVer":"1",
                            "fmt":"0",
                            "tmp":"xxxxxxxxxxxx"
                        }
                    ]
                }
            ]
        }
    }
}

请求参数详解:

通用部分见附录1

其他参数信息参考人员信息上传

注:人员信息除了pin号为必填字段,其他为选填,当不包含某个属性key时,表示该属性不做变更。

// 举例说明,以下为表示更新员工设备密码

{
    "funcId": "cmd.data.update.user",
    "mid": "b488030912294ff29d5cc4435248452e",
    "payload": {
        "params": {
            "cmdId": "1001",
            "users": [{
                "pin": "2956",
                "passwd": "123456"
            }]
        }
    }
}

设备响应:

命令回复

更新比对照片

服务端请求:

{
    "funcId":"cmd.data.update.bioPhoto",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "bioPhotos":[
                {
                    "pin":"xxxx",
                    "type":"xxxx",
                    "content":"xxxx",
                    "url":"xxxx"
                }
            ]
        }
    }
}

请求参数详解:

通用部分见附录1

参数名 描述
pin 工号
type 生物特征图片类型,详见生物特征类别
content 传输生物特征图片时,需要对原始二进制生物特征图片进行base64 编码
url 比对照片下载地址, content和url不能同时为空

设备响应:

命令回复

更新门禁时间段

Request:

{
    "funcId": "cmd.data.update.accTimezone", 
    "mid": "xxxxxxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxx", 
            "timezones": [
                {
                    "timezoneId": "1", 
                    "monStart": "0", 
                    "monEnd": "2359", 
                    "tuesStart": "0", 
                    "tuesEnd": "2359", 
                    "wedStart": "0", 
                    "wedEnd": "2359", 
                    "thurStart": "0", 
                    "thurEnd": "2359", 
                    "friStart": "0", 
                    "friEnd": "2359", 
                    "satStart": "0", 
                    "satEnd": "2359", 
                    "sunStart": "0", 
                    "sunEnd": "2359"
                }
            ]
        }
    }
}
参数名 必填 描述
timezoneId 时间段编号,数字字符串
monStart 周一开始时间,取值如下:01:01=101,23:59=2359,06:00=600
monEnd 周一截止时间,格式同上
tuesStart 周二开始时间,格式同上
tuesEnd 周二截止时间,格式同上
wedStart 周三开始时间,格式同上
wedEnd 周三截止时间,格式同上
thurStart 周四开始时间,格式同上
thurEnd 周四截止时间,格式同上
friStart 周五开始时间,格式同上
friEnd 周五截止时间,格式同上
satStart 周六开始时间,格式同上
satEnd 周六截止时间,格式同上
sunStart 周日开始时间,格式同上
sunEnd 周日截止时间,格式同上

设备响应:

命令回复

更新门禁权限组

Request:

{
    "funcId": "cmd.data.update.accGroup", 
    "mid": "xxxxxxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxx", 
            "groups": [
                {
                    "groupId": "1", 
                    "verifyMode": "0", 
                    "timezoneIds": ["xx","xx","xx"],
                    "vaildHoliday": "0"
                }
            ]
        }
    }
}
参数名 必填 描述
groupId 门禁组编号,数字字符串
verifyMode 验证方式,详见验证方式说明
timezoneIds 所属时间段,根据设备具体情况而定,目前考勤高级门禁只支持三个
vaildHoliday 节假日是否有效, 0:否,:是

设备响应:

命令回复

更新节假日

Request:

{
    "funcId": "cmd.data.update.holiday", 
    "mid": "xxxxxxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxx",
            "holidays":[{
                "holidayId": "x",
                "holidayName": "NationalDay",
                "startDate": "2018-10-01",
                "endDate": "2018-10-07",
                "startTime": "0",
                "endTime": "2359"
            }]
        }
    }
}
参数名 必填 描述
holidayId 节假日编号,数字字符串
holidayName 节假日名称
startDate 节假日开始日期
endDate 节假日截止日期
startTime 门禁时间段开始时间,取值如下:00:00=0,01:01=101,23:59=2359,06:00=600
endTime 门禁时间段截止时间,取值如下:01:01=101,23:59=2359,06:00=600

设备响应:

命令回复

更新访客信息

Request:

{
    "funcId": "cmd.data.update.visitor", 
    "mid": "xxxx", 
    "payload": {
        "params": {
            "cmdId": "xxxx", 
            "visitors": [
                {
                    "pin": "xxxx", 
                    "name": "xxxx",
                    "password":"fbfe82e76c06ea568e3301ab17a9d4677c1481b8a4f1ca137411e10153deabc3",
                    "passwordSalt":"c09eb7463827cda245f3a398bd453c42",
                    "startTime":"2020-01-01T00:00:00+08:00",
                    "endTime":"2020-12-31T23:59:59+08:00"
                }
            ]
        }
    }
}
参数名 必填 描述
pin 访客编号
name 访客姓名
password 访客密码,算法:PBKDF2WithHmacSHA256,密文长度:32字节,迭代次数:1000
passwordSalt 访客密码加密盐值,十六进制字符串,允许为空字符串
startTime 访客有效期开始时间
endTime 访客有效期截止时间

设备响应:

命令回复

更新人员门禁权限

设置人员门禁权限,如时间段、门禁组等信息

服务端请求:

{
    "funcId": "cmd.data.update.userAccPrivilege",
    "mid": "xxxx",
    "payload": {
        "params": {
            "cmdId": "xxxx",
            "userAccPrivileges": [{
                "pin": "xxxx",
                "timezoneType": "1",
                "timezoneIds": ["xxx", "xxx", "xxx"],
                "groupIds": ["xx", "xx"],
                "customTimezones": [{
                    "monStart": "0",
                    "monEnd": "2359",
                    "tuesStart": "0",
                    "tuesEnd": "2359",
                    "wedStart": "0",
                    "wedEnd": "2359",
                    "thurStart": "0",
                    "thurEnd": "2359",
                    "friStart": "0",
                    "friEnd": "2359",
                    "satStart": "0",
                    "satEnd": "2359",
                    "sunStart": "0",
                    "sunEnd": "2359"
                }],
                "ruleType": "1",
                "verifyModeType": "0"
            }]
        }
    }
}

请求参数详解:

通用部分见附录1

参数名 必填 描述
timezoneType 时间段类型,取值如下:
0:个人门禁时间段,为空时默认为0
1:门禁组时间段
2:自定义时间段
timezoneIds 个人门禁时间段,当且仅当timezoneType=0时有效
groupIds 用户所属门禁组,默认属于1组,当且仅当timezoneType=1时有效
customTimezones 自定义个人时间段,详细属性内容可参考更新门禁时间段,,当且仅当timezoneType=2时有效
ruleType 规则类别,打卡记录需要回传此标记
取值范围:1:考勤(默认);2:门禁;3:考勤+门禁;
verifyModeType 使用的验证方式类型,取值范围,0:个人验证方式(默认),1:组验证方式

设备响应:

命令回复

更新访客照片

服务端请求:

{
    "funcId":"cmd.data.update.visitorBioPhoto",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "visitorBioPhotos":[
                {
                    "pin":"2956",
                    "type":"9",
                    "content":"base64",
                    "url":"https://test.zkteco.com/xxxx.jpg"
                }
            ]
        }
    }
}

请求参数详解:

通用部分见附录1

参数名 必填 描述
pin 访客编号
type 详见生物特征类别
content 传输生物特征图片时,需要对原始二进制生物特征图片进行base64 编码
url 比对照片下载地址, content和url不能同时为空

设备响应:

命令回复

更新开门密码

服务端下发密码命令到设备, 用于临时密码或者远程密码开门

服务端请求:

{
    "funcId": "cmd.data.update.doorPassword",
    "mid": "xxxx",
    "payload": {
        "params": {
            "cmdId": "1001",
            "doorPasswords": [{
                "operator": "luther",
                "startTime": "2020-01-01T00:00:00+08:00",
                "endTime": "2020-02-01T00:00:00+08:00",
                "password": "fbfe82e76c06ea568e3301ab17a9d4677c1481b8a4f1ca137411e10153deabc3",
                "passwordSalt": "c09eb7463827cda245f3a398bd453c42",
                "passwordType": "0"
            }]
        }
    }
}

请求参数详解:

参数名 必填 描述
operator 操作者,也作为开门密码唯一标签
startTime 有效开始时间, ISO标准时间格式:yyyy-MM-ddTHH:mm:ss±HH:mm, (yyyy-MM-ddTHH:mm:ss):服务端的本地时间, (HH:mm):时区偏移量
endTime 有效结束时间, ISO标准时间格式:yyyy-MM-ddTHH:mm:ss±HH:mm, (yyyy-MM-ddTHH:mm:ss):服务端的本地时间, (HH:mm):时区偏移量
password 密码,算法:PBKDF2WithHmacSHA256,密文长度:32字节,迭代次数:1000
举例:原始密码:123456
盐:c09eb7463827cda245f3a398bd453c42
加密后:fbfe82e76c06ea568e3301ab17a9d4677c1481b8a4f1ca137411e10153deabc3
passwordSalt password加密的盐值,十六进制字符串,允许为空字符串
passwordType password类型,0:永久密码(默认),一个操作者对一个门只能设置一个永久密码;1:临时密码,一个操作者对一个门只能设置一个临时密码,startTime和endTime必传

使用密码开门将会产生一条门禁记录,使用上传打卡记录上传数据,其中pin=operator,type=2即门禁记录

设备响应:

命令回复

获取数据命令

重新上传人员信息

重新上传设备人员信息到服务端

服务端请求:

{
    "funcId":"cmd.data.reupload.user",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx"
        }
    }
}

设备响应:

  1. 重新上传人员信息

重新上传人员信息,与人员信息上传一样,只多了cmdId:

设备请求:

{
    "funcId":"dev.data.upload.user",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "users":[
                {
                    "pin":"xxxx",
                    "name":"xxxx",
                    "passwd":"xxxx",
                    "pri":"xxxx",
                    "cards":[
                        "xxxx",
                        "xxxx"
                    ],
                    "bioDatas":[
                        {
                            "no":"xxxx",
                            "index":"xxxx",
                            "valid":"xxxx",
                            "duress":"xxxx",
                            "type":"xxxx",
                            "majorVer":"xxxx",
                            "minorVer":"xxxx",
                            "fmt":"xxxx",
                            "tmp":"xxxx"
                        }
                    ]
                }
            ]
        }
    }
}
  1. 回复命令执行结果,见命令回复

打卡数据自动校对

打卡数据自动校对

服务端请求:

{
    "funcId":"cmd.data.check.attLog",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "startTime":"2019-07-31T00:00:00+08:00",
            "endTime":"2019-07-31T23:59:59+08:00",
            "logCount":"20"
        }
    }
}

请求参数详解:

参数名 是否必须 描述
cmdId 命令Id
startTime 打卡记录开始时间,ISO标准时间格式:yyyy-MM-ddTHH:mm:ss+hh:mm
endTime 打卡记录结束时间,ISO标准时间格式:yyyy-MM-ddTHH:mm:ss+hh:mm
logCount 服务端在此时间端内该设备的打卡记录总数

设备响应:

  1. 上传时间段内的数据

如果设备在此时间段内的打卡记录总数大于服务端的,则要重新上传此时间段内的所有打卡记录,入参与上传打卡记录基本一致,仅多回传了cmdId.

设备请求:

{
    "funcId":"dev.data.upload.attLog",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "attLogs":[
                {
                    "pin":"2956",
                    "attState":"255",
                    "verifyMode":"0",
                    "workCode":"0",
                    "punchTime":"2019-07-31T08:59:59+08:00"
                }
            ]
        }
    }
}
  1. 回复命令执行结果,见命令回复

查询打卡记录

查询指定时间段内的打卡记录

服务端请求:

{
    "funcId":"cmd.data.query.attLog",
    "imme":"xxxx",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "startTime":"2019-07-31T00:00:00+08:00",
            "endTime":"2019-07-31T23:59:59+08:00"
        }
    }
}

设备响应:

  1. 上传时间段内的数据

上传此时间段内的所有打卡记录,入参与上传打卡记录基本一致,仅多回传了cmdId.

设备请求:

{
    "funcId": "dev.data.upload.attLog",
    "mid": "xxxx",
    "payload": {
        "params": {
            "cmdId":"xxxx",
            "attLogs": [{
                "pin": "2956",
                "attState": "255",
                "verifyMode": "0",
                "workCode": "0",
                "punchTime": "2019-07-31T08:59:59+08:00"
            }, {
                "pin": "2956",
                "attState": "255",
                "verifyMode": "0",
                "workCode": "0",
                "punchTime": "2019-07-31T08:59:59+08:00"
            }]
        }
    }
}

参数描述详见上传打卡记录

  1. 回复命令执行结果,见命令回复

重新上传打卡记录

重新上传设备上的所有打卡记录

服务端请求:

{
    "funcId":"cmd.data.reupload.attLog",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx"
        }
    }
}

设备响应:

  1. 重新上传打卡记录

    重新上传设备上打卡记录,与上传打卡记录一样,只多传了cmdId

设备请求:

{
    "funcId": "dev.data.upload.attLog",
    "mid": "xxxx",
    "payload": {
        "params": {
            "cmdId":"xxxx",
            "attLogs": [{
                "pin": "2956",
                "attState": "255",
                "verifyMode": "0",
                "workCode": "0",
                "punchTime": "2019-07-31T08:59:59+08:00"
            }, {
                "pin": "2956",
                "attState": "255",
                "verifyMode": "0",
                "workCode": "0",
                "punchTime": "2019-07-31T08:59:59+08:00"
            }]
        }
    }
}

参数描述详见上传打卡记录

  1. 回复命令执行结果,见命令回复

设备参数命令

设置设备参数

请求规范

服务端请求:

{
    "funcId":"cmd.option.set",
    "imme":"xxxx",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "option":{
                "optionName1":"optionValue1",
                "optionName2":"optionValue2"
            }
        }
    }
}

设备响应:

命令回复

设置门禁参数

请求案例如下,按需设置参数:

{
    "funcId": "cmd.option.set", 
    "imme": "1",
    "mid": "xxxx", 
    "payload": {
        "params": {
            "cmdId": "1",
            "option":{
                "lockOn": "1", 
                "doorSensorTimeout": "10",
                "doorSensorAlarmTimeout": "5",
                "doorSensorMode": "0",
                "doorOpenTimezone": "1",
                "doorCloseTimezone": "1",
                "isHolidayValid": "0",
                "localAlarmOn": "1",
                "auxOutKeepTime":"255",
                "auxOutOption":"1"
            }
        }
    }
}
参数名 必填 描述
lockOn 锁驱动时长,取值范围(单位:秒):0~10,为空时默认为0
doorSensorTimeout 门磁延时,取值范围(单位:秒):1~255,为空时默认为1
doorSensorAlarmTimeout 门磁报警延时,取值范围(单位:秒):0~999,为空时默认为0
doorSensorMode 门磁模式,0:常开型,1:常闭型,2:关闭,为空时默认为0
doorOpenTimezone 常开时间段,值为门禁时间段中的时间段编号
doorCloseTimezone 常闭时间段,值为门禁时间段中的时间段编号
isHolidayValid 节假日是否有效,用于常开/常闭判断中是否增加节假日的判断,取值范围:1:有效,0:无效
localAlarmOn 本地报警,本地报警开了后,如果出现拆机情况设备会发出报警声
取值范围,1:打开本地报警(默认) 0:关闭本地报警
auxOutKeepTime 辅助输出开锁时间设置(单位秒,限制1到255秒),默认255,为255表示常开
auxOutOption 辅助输出类型,取值如下:
0:无
1:触发开门(默认)
2:触发报警
3:触发开门和报警

名词解释:

名词 解释
锁驱动时长 设备控制电锁处于开启状态的时间长度
门磁类型 包括三种类型:关闭、常开型、常闭型;关闭指不使用门磁开关,常开指门打开为正常状态, 常闭指门关闭为正常状态。
门磁报警延时 检测到门磁状态不正常后,相隔一定时间再产生报警信号,这段时间就是门磁报警延时
门磁延时 门后相隔一定时间检测门磁与门磁开关的状态,如果不一致,则开始报警,这段时间叫做门磁延时

设置设备音量

请求案例如下,按需设置参数:

{
    "funcId": "cmd.option.set", 
    "imme": "1",
    "mid": "xxxx", 
    "payload": {
        "params": {
            "cmdId": "1",
            "option":{
                "volume": "10"
            }
        }
    }
}
参数名 必填 说明
volume 音量大小,取值0~100,0时表示静音,此处取值配合固件,目前是10的倍数

设置人脸阈值

请求案例如下,按需设置参数:

{
    "funcId": "cmd.option.set", 
    "imme": "1",
    "mid": "xxxx", 
    "payload": {
        "params": {
            "cmdId": "1",
            "option":{
                "faceMThr": "74",
                "faceVThr": "63"
            }
        }
    }
}
参数名 描述 默认值 最小值 最大值
faceMThr 1:N阈值
在1:N模式下(iT1只有1:N模式)进行人脸比对时,超过默认值时才能比对通过
74 65 120
faceVThr 1:1阈值
在1:1模式下进行人脸比对时,超过默认值时才能比对通过
63 55 120
faceEThreshold 面部登记阀值
在进行面部登记时的匹配值
70 0 100
facePitchThreshold 人脸俯仰角度
人脸登记、比对时的俯视、仰视的角度,超过该值,将会被过滤
35 0 90
faceRollYawThreshold 人脸旋转角度
人脸登记、比对时的左右角度,超过该值,将会被算法过滤
25 0 90
modifyClarityCond 图像质量
人脸登记、比对时的图像质量,值越高,图像要求越清晰
40 0 100
faceMinThreshold 最小人脸像
登记、比对时要求的人脸大小,低于该值将会被过滤。例:本机登记时人站的远近,照片下发登记时,人脸的大小
80 60 180
motionDetectSensitivity 移动侦测灵敏度
从待机到唤醒比对界面的灵敏值,值越大越灵敏,越容易进入比对界面
4 0 10
grayThroldValue 补光灯开启灵敏度
控制补光灯开启的值,值越大,越容易开启补光灯
80 0 100
faceLivenessThreshold 活体检测阈值
判断可见光图像是否为活体的阈值,值越大,可见光防伪越严格
50 0 100
enableBioTest 活体检测开关
利用可见光图像进行活体检测
1 0 1
IRLivenessFunOn 近红外防伪开关
利用近红外图像进行防伪检测
0 0 1
WDRStatus WDR开关
宽动态,场景中特别亮的部位和特别暗的部位同时都能看得特别清楚
0 0 1

设置打卡照片参数

人员在设备人脸识别比对时的相关配置

请求案例如下,按需设置参数:

{
    "funcId": "cmd.option.set", 
    "mid": "xxxx", 
    "payload": {
        "params": {
            "cmdId": "1",
            "option":{
                "punchPhotoFunOn": "1",
                "capturePic": "2",
                "captureAlarm": "80",
                "captureFailInterval": "5",
                "captureSuccInterval": "5",
                "captureSaveType": "0",
                "captureVoiceOn": "0"
            }
        }
    }
}
参数名 必填 说明
punchPhotoFunOn 是否支持打卡照片功能,0:不支持,1:支持
当为0时下面的其他配置与否都无所谓
capturePic 拍照模式。取值范围:
0:不拍照。
1:拍照不保存。有拍照动作,但是不会生成照片。
2:拍照并保存 。有拍照动作,不管是验证成功还是失败都会生成照片。
3:验证成功保存 。只会在验证成功的时候有拍照动作和生成照片。
4:验证失败保存。只会在验证失败的时候有拍照动作和生成照片。
captureAlarm 满容量预警阈值。即磁盘空间占用百分比,例如 90,占用比超过 90%就会发出警告
captureFailInterval 验证失败照片保存频率。单位秒,取值范围0~1000,为空则使用设备默认。
captureFailInterval=5,表示验证没通过的情况下,5秒内只会保存一张考勤照片
captureSuccInterval 验证成功照片保存频率。单位秒,取值范围0~1000,为空则使用设备默认。
captureSuccInterval=5表示同一个人连续验证时,5秒内只会保存一张考勤照片
captureSaveType 照片保存方式:
0:彩色和黑白人脸照;
1:彩色人脸照;
2:标清全景照;
3:高清全景照;
为空时则由设备默认
captureVoiceOn 拍照是否播放拍照音。 0:不播放 1:播放

设置门禁二维码参数

{
    "funcId": "cmd.option.set", 
    "mid": "xxxx", 
    "payload": {
        "params": {
            "cmdId": "1",
            "option":{
                "qrCodeDecryptType": "2",
                "qrCodeDecryptKey": "UkhGaXpuaXE2bjQ3YkxqNFhVVlpMUzF5eVFFVzhTaUo=" 
            }
        }
    }
}
参数名 必填 说明
qrCodeDecryptType 二维码解密方式。2:利用AES256算法加密;
qrCodeDecryptKey 加密密钥

获取设备参数

服务端获取设备参数信息

服务端请求:

{
    "funcId":"cmd.option.get",
    "imme":"xxxx",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "options":[
                "xxxx",
                "xxxx"
            ]
        }
    }
}
  1. 上传设备参数

参考上报设备参数

设备请求:

{
    "funcId":"dev.option.upload",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
            "option":{
                "xxxx":"xxxx"
            }
        }
    }
}

请求参数详解:

通用部分见附录1

  1. 回复命令执行结果,见命令回复

重置设备参数

设备重置分为以服务端为主和以设备端为主,以服务端为主时,服务端自行定义默认配置值,重置时下发对应参数的设备设置指令即可,以设备端为主时,只需下发一条指令,设备端自行根据端侧默认配置进行重置。

此处重置设备参数指令只要指的是以设备端为主的业务场景指令。

重置所有参数

以设备端为主,重置所有设备参数为默认值,即设备参数配置恢复出厂设置

服务端请求:

{
    "funcId":"cmd.option.reset",
    "imme":"1",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
        }
    }
}

设备响应:

命令回复

人脸参数重置

以设备端为主,重置人脸相关参数为默认值,涉及参数可参考设置人脸阀值

服务端请求:

{
    "funcId":"cmd.option.reset.face",
    "imme":"1",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
        }
    }
}

设备响应:

命令回复

门禁参数重置

以设备端为主,重置门禁相关参数为默认值,涉及参数可参考设置门禁参数

服务端请求:

{
    "funcId":"cmd.option.reset.acc",
    "imme":"1",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
        }
    }
}

设备响应:

命令回复

设备音量重置

以设备端为主,重置音量相关参数为默认值,涉及参数可参考设置设备音量

服务端请求:

{
    "funcId":"cmd.option.reset.volume",
    "imme":"1",
    "mid":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx",
        }
    }
}

设备响应:

命令回复

命令回复

设备收到服务端下发的命令之后,回复命令执行结果

设备请求:

{
    "funcId":"dev.cmd.response",
    "mid":"xxxx",
    "code":"xxxx",
    "message":"xxxx",
    "payload":{
        "params":{
            "cmdId":"xxxx"
        }
    }
}

请求参数详解:

通用部分见附录1

参数名 必填 描述
code 错误码
message 错误描述

附录

请求规范说明

业务功能命名规范

每个消息都带有业务功能标识,即funcId。
绑定流程请求以及心跳请求格式固定,其他请求数据格式要求如下:

funcId: xxxx.xxxx.xxxx.xxxx
第一个xxxx,请求类型,cmd表示命令下发,dev表示设备请求
第二个xxxx,数据大类,data表示基础数据,option表示参数数据,firmware表示固件数据,system表示系统数据,cmd表示命令数据,control表示控制数据,......
第三个xxxx,操作类型, delete表示删除,upload表示上传,update表示更新,get表示获取,set表示设置,upgrade表示升级,sync表示同步,......
第四个xxxx,数据小类,user表示用户数据,info表示信息,time表示时间,... ...

命令下发规范

命令下发为服务端发起的,funcId约定cmd开头

格式如下:

{
    "funcId": "cmd.xxxx",
    "imme": "xxxx",
    "mid": "xxxx",
    "payload": {
        "params": {
            "cmdId": "xxxx"

        }
    }
}

参数说明:

参数名 必填 描述
funcId 请求业务功能唯一标识
imme 是否紧急,1:紧急,0:不紧急,参数不存在/参数值为空/参数值为0时,则表示消息是不紧急消息,否则为紧急消息
mid 消息id,消息唯一标识,由字母和数字组成,最高不能超过64位,建议使用uuid
cmdId 仅用于命令请求时以及命令回复时参数必须存在,服务端下发命令的唯一编号

设备请求规范

此处包含两个方面
1. 设备主动请求上传数据;
2. 回复服务端下发的命令执行结果集;

请求格式如下:

{
        "funcId": "dev.xxxx",
        "imme": "xxxx",
        "sn": "xxxx",
        "mid": "xxxx",
        "payload": {
            "params": {
                "cmdId": "xxxx",
                ... ...
            }
        }
    }

参数说明:

参数名 必填 描述
funcId 请求业务功能唯一标识
imme 是否紧急,1:紧急,0:不紧急,参数不存在/参数值为空/参数值为0时,则表示消息是不紧急消息,否则为紧急消息
sn 仅用于登入过程请求时参数必须存在,设备序列号
mid 消息id,消息唯一标识,由字母和数字组成,最高不能超过64位,建议使用32位uuid
cmdId 仅用于命令请求时以及命令回复时参数必须存在,服务端下发命令的唯一编号

消息回复规范

格式如下:

{
    "code": "xxxx",
    "message": "xxxx",
    "imme": "xxxx",
    "mid": "xxxx",
    "payload": {
        "results": {

        }
    }
}

参数说明:

参数名 必填 描述
code 返回错误码
message 返回错误码对应的消息内容
imme 是否紧急,1:紧急,0:不紧急,参数不存在/参数值为空/参数值为0时,则表示消息是不紧急消息,否则为紧急消息
mid 消息id,消息唯一标识,由字母和数字组成,最高不能超过64位,建议使用32位uuid
results 若回复需要带其他详细属性,则放置此处

验证方式说明

验证方式编码 描述
0 指静脉或人脸或指纹或卡或密码 (自动识别)
1 仅指纹
2 工号验证
3 仅密码
4 仅卡
5 指纹或密码
6 指纹或卡
7 卡或密码
8 工号加指纹
9 指纹加密码
10 卡加指纹
11 卡加密码
12 指纹加密码加卡
13 工号加指纹加密码
14 工号加指纹或卡加指纹
15 人脸
16 人脸加指纹
17 人脸加密码
18 人脸加卡
19 人脸加指纹加卡
20 人脸加指纹加密码
21 指静脉
22 指静脉加密码
23 指静脉加卡
24 指静脉加密码加卡
25 掌纹
26 掌纹加卡
27 掌纹加面部
28 掌纹加指纹
29 掌纹加指纹加面部
200 其他

生物特征类别

0:通用的
1:指纹
2:面部(近红外)
3:声纹
4:虹膜
5:视网膜
6:掌纹
7:指静脉
8:掌静脉
9:面部(可见光)

服务端错误编码

编码值 描述
00000000 成功
S00E0001 权限不足
S00E0002 devKey不匹配
S00E0003 授权码不匹配
S00E0004 登录密码不匹配
其他 待定

设备错误编码

编码值 描述
00000000 成功
其他 待定

生物具体个体编号

指纹编号 描述
0 左手小拇指
1 左手无名指
2 左手中指
3 左手食指
4 左手拇指
5 右手拇指
6 右手食指
7 右手中指
8 右手无名指
9 右手小拇指
指静脉编号 描述
0 左手小拇指
1 左手无名指
2 左手中指
3 左手食指
4 左手拇指
5 右手拇指
6 右手食指
7 右手中指
8 右手无名指
9 右手小拇指
虹膜编号 描述
0 左眼
1 右眼
掌静脉编号 描述
0 左手
1 右手