HC物联网系统对接门禁
说明
如何将自己的门禁设备对接至HC物联网系统,然后提供给别人使用是本文想要解决的问题,一般的门禁对接常见两种方式:
一种为门禁平台,这一种 不直接和门禁设备对接 而是和第三方提供的平台对接 根据平台提供的接口 将数据推送给第三方
平台;另一种则为直接和设备交互,设备会提供比较常见的 http 接口 mqtt接口 socket 接口等,两种的对接方式基本
一样 将数据同步给第三方平台或者 设备,一般第一种的对接难度会比较大一些,第三方平台一般需要的数据较多,比如小区
楼栋 单元 房屋 位置信息 设备信息 业主信息等需要将大量的数据推送给第三方平台,不推荐对接。第二种较简单写,只需要
将人脸信息上传设备即可,所需数据较少,以下为第二种方式说明整个对接过程。
源码:https://gitee.com/java110/MicroCommunityThings
需要对接的接口清单
1、获取设备上人脸接口
该接口的目的是 在 人脸同步 新增或者修改时 判断设备上是否存在 该人脸 如果存在 则修改 如果不存在则新增。
有些设备 如果已经存在时新增会失败,通过此接口判断是否存在,如果设备没有这个能力可以不对接,默认HC物联网系统
自己也有判断能力,对应于IAssessControlProcess.java 接口类的 getFace方法。
2、添加人脸
顾名思义,添加人脸为在界面添加人脸时将人脸信息送给设备,目前HC物联网系统本身不具备人脸识别的能力,人脸识别都是
需要设备自己实现。 对应于 IAssessControlProcess.java 接口类 的 addFace方法。
3、修改人脸
修改人脸为在人员的信息发生变化时将人脸信息重新同步门禁设备,对应于 IAssessControlProcess.java 接口类 的
updateFace方法 。
4、删除人脸
删除人脸为在人员信息删除后需要在设备上删除相应的人脸,不能再让该人员通信。对应于 IAssessControlProcess.java
接口类 的deleteFace方法。
5、清空人脸
当界面清空人脸时需要门禁设备清楚设备上人脸,对应于 IAssessControlProcess.java 接口类 的clearFace方法。
6、重启设备
当在界面操作重启时需要调用设备接口 重启设备 对应于 IAssessControlProcess.java 接口类 的restartMachine方法。
7、远程开门
当业主 物业人员在小程序或者 系统上 点击远程开门时门禁设备需要开门放行 对应于 IAssessControlProcess.java 接口类 的
openDoor方法。
8.0、开门记录上报
当人员通信时,设备需要将人脸信息上报给HC物联网系统,供HC物联网系统查看 对应于 IAssessControlProcess.java 接口类 的
httpFaceResult方法。
如何对接
门禁对接只需要关注 后端代码下的 src\main\java\com\java110\things\adapt\accessControl 目录就可以
如果对接新的门禁可以建一个目录例如yufan 对接宇泛的门禁。
在accessControl目录下存在 如下的java类:
ICallAccessControlService 提供给适配器调用的接口 提供如查询设备信息等方法
IAssessControlProcess 门禁适配器需要实现的接口类 里面包含了需要实现的方法 如 添加人脸,修改人脸等接口
对接新的门禁需要实现该接口 实现每个方法即可
IAssessControlProcess 方法 入参和出参介绍
getFace 方法
描述: 从设备中获取人脸信息
入参: MachineDto machineDto, UserFaceDto userFaceDto
machineDto 对象包含了设备相关信息,可以根据这个对象获取设备名称 编码 ip mac 等相关信息
userFaceDto 对象包含了人员 人脸相关信息 人员名称 人脸base64 等
方法说明: 该方法中只需要完成 根据门禁的协议 查询当前的人员是否在门禁中如果在返回人员ID,如果不在 返回-1
返回参数:字符串类型 如果有人员返回人员ID 没有返回 -1
举例:
public String getFace(MachineDto machineDto, UserFaceDto userFaceDto) {
String url = "http://" + machineDto.getMachineIp() + ":" + DEFAULT_PORT + CMD_ADD_FACE_FIND;
//准备参数 json格式参数
JSONObject param = new JSONObject();
param.put("operator", "SearchPerson");
JSONObject info = new JSONObject();
info.put("DeviceID", machineDto.getMachineCode());
info.put("SearchType", 0);
info.put("SearchID", userFaceDto.getUserId());
info.put("Picture", 1);
param.put("info", info);
// 调用门禁设备同步人脸信息
HttpEntity httpEntity = new HttpEntity(param.toJSONString(), getHeaders());
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
logger.debug("请求信息 : " + httpEntity + ",返回信息:" + responseEntity);
saveLog(SeqUtil.getId(), machineDto.getMachineId(), CMD_ADD_FACE_FIND, param.toJSONString(), responseEntity.getBody());
//返回参数解析
if (HttpStatus.OK != responseEntity.getStatusCode()) {
return AddUpdateFace.MACHINE_HAS_NOT_FACE;
}
JSONObject outParam = JSONObject.parseObject(responseEntity.getBody());
if (!outParam.containsKey("picinfo")) {
return AddUpdateFace.MACHINE_HAS_NOT_FACE;
}
String picinfo = outParam.getString("picinfo");
if (StringUtil.isEmpty(picinfo)) {
return AddUpdateFace.MACHINE_HAS_NOT_FACE;
}
String personId = outParam.getJSONObject("info").getString("CustomizeID");
if (StringUtil.isEmpty(personId)) {
return AddUpdateFace.MACHINE_HAS_NOT_FACE;
}
return personId;
}
addFace 方法
描述: 添加人脸至门禁设备
入参:MachineDto machineDto, UserFaceDto userFaceDto
machineDto 对象包含了设备相关信息,可以根据这个对象获取设备名称 编码 ip mac 等相关信息
userFaceDto 对象包含了人员 人脸相关信息 人员名称 人脸base64 等
方法说明: 该方法中只需要完成 根据门禁的协议 将人员信息和人脸信息长传至门禁设备即可
返回参数:ResultDto 对象 成功code填写为0 失败填写为-1 并填写msg 失败原因
举例:
public ResultDto addFace(MachineDto machineDto, UserFaceDto userFaceDto) {
String url = "http://" + machineDto.getMachineIp() + ":" + DEFAULT_PORT + CMD_ADD_USER;
//根据门禁协议准备参数
JSONObject param = new JSONObject();
param.put("operator", "AddPerson");
JSONObject info = new JSONObject();
info.put("DeviceID", machineDto.getMachineCode());
info.put("PersonType", 0);
info.put("IdType", 0);