公司让我开发几个对接硬件设备(门禁人脸识别机)等,有多台不同型号的人脸识别机,每种型号需要参考不同的厂家协议,再开发过程中遇到了很多坑,故需要将这些坑提炼出来,避免以后继续踩坑,如下:
  1. 硬件设备需要配置访问服务器的心跳URL、上传考勤数据URL和拍照图片上传URL,设备是主动通过这三个接口请求,并带相关参数(协议上提供)访问以上三个URL,服务器在接收到请求后给以json格式的响应,其中心跳是具有一定时间间隔的,每个时间间隔会访问一次心跳URL,服务器在每次心跳过来时查询数据库,查找是否有需要下发的数据(即新增人员信息或删除人员信息)以协议上规定的格式下发给硬件设备,硬件设备根据下发的规定格式(JSON)的数据更新设备人员信息到设备数据库。当有人员门禁信息比如人员人脸发生识别时会产生门禁记录,则会主动调用设置的上传考勤数据URL访问服务器对应接口,然后将数据以协议上规定格式上传服务器,服务器接收数据后保存数据库对应表。
  2. 有些硬件设备会提供操作设备API,而这种API的请求分为form-data类型或application/x-www-form-urlencoded类型,其中form-data中的POST方式采用以下代码:
// 创建远程url连接对象URL url = new URL(strurl);// 通过远程url连接对象打开一个连接,强转成httpURLConnection类connection = (HttpURLConnection) url.openConnection();// 设置连接方式:GET,POSTconnection.setRequestMethod("POST");connection.setDoInput(true);connection.setDoOutput(true);connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");//这里必须要写,否则出错connection.setRequestProperty("SOAPAction", "");// 设置连接主机服务器的超时时间:15000毫秒connection.setConnectTimeout(15000);// 设置读取远程返回的数据时间:60000毫秒connection.setReadTimeout(60000);// 发送请求connection.connect();out = connection.getOutputStream(); // 获取输出流对象connection.getOutputStream().write(param.getBytes("UTF-8")); // 将要提交服务器的SOAP请求字符流写入输出流out.flush();out.close();//System.out.println(connection.getResponseCode());// 通过connection连接,获取输入流if (connection.getResponseCode() == 200) {is = connection.getInputStream();// 封装输入流is,并指定字符集br = new BufferedReader(new InputStreamReader(is, "UTF-8"));// 存放数据StringBuffer sbf = new StringBuffer();String temp = null;while ((temp = br.readLine()) != null) {sbf.append(temp);sbf.append("\r\n");}result = sbf.toString();}
  1. GET方式是不能在body里面带有数据的,不能有**connection.setDoOutput(true) **,故采用以下代码:
     HttpURLConnection connection = null;InputStream is = null;BufferedReader br = null;String result = null;// 返回结果字符串OutputStream out = null;Date d1 = new Date();try {// 创建远程url连接对象URL url = new URL(strurl);// 通过远程url连接对象打开一个连接,强转成httpURLConnection类connection = (HttpURLConnection) url.openConnection();// 设置连接方式:GET,POSTconnection.setRequestMethod("GET");connection.setDoInput(true);
//            connection.setDoOutput(true);//            connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");//这里必须要写,否则出错
//            connection.setRequestProperty("SOAPAction", "");// 设置连接主机服务器的超时时间:15000毫秒connection.setConnectTimeout(15000);// 设置读取远程返回的数据时间:60000毫秒connection.setReadTimeout(60000);// 发送请求connection.connect();//out = connection.getOutputStream(); // 获取输出流对象//connection.getOutputStream().write(param.getBytes("UTF-8")); // 将要提交服务器的SOAP请求字符流写入输出流//out.flush();//out.close();//System.out.println(connection.getResponseCode());// 通过connection连接,获取输入流if (connection.getResponseCode() == 200) {is = connection.getInputStream();// 封装输入流is,并指定字符集br = new BufferedReader(new InputStreamReader(is, "UTF-8"));// 存放数据StringBuffer sbf = new StringBuffer();String temp = null;while ((temp = br.readLine()) != null) {sbf.append(temp);sbf.append("\r\n");}result = sbf.toString();}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 关闭资源if (null != br) {try {br.close();} catch (IOException e) {e.printStackTrace();}}if (null != is) {try {is.close();} catch (IOException e) {e.printStackTrace();}}connection.disconnect();// 关闭远程连接}
  1. 设备是人脸图片都是采用Base64位存储和解析人脸数据,包括三种方案:base64位图片下发,将图片上传到云服务器,然后传递url,或者前两种方式综合提供,设备拍照也是传递base64位字符串给后台,后台可以将其存储到数据库字段,代码如下:
ImgBase64.getImgStr(path+"static\\temp\\"+filename)import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;import java.io.*;public class ImgBase64 {/*** 将图片转换成Base64编码* @param imgFile 待处理图片* @return*/public static String getImgStr(String imgFile) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理InputStream in = null;byte[] data = null;// 读取图片字节数组try {in = new FileInputStream(imgFile);data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {e.printStackTrace();}return Base64.encodeBase64String(data);}/*** 对字节数组字符串进行Base64解码并生成图片* @param imgStr 图片数据* @param imgFilePath 保存图片全路径地址* @return*/public static boolean generateImage(String imgStr, String imgFilePath) {//if (imgStr == null) // 图像数据为空return false;BASE64Decoder decoder = new BASE64Decoder();try {// Base64解码byte[] b = decoder.decodeBuffer(imgStr);for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {// 调整异常数据b[i] += 256;}}// 生成jpg图片OutputStream out = new FileOutputStream(imgFilePath);out.write(b);out.flush();out.close();return true;} catch (Exception e) {return false;}}
}
# 数据库如果存储二进制数据,可以将二进制数据读出,并将其转换为临时图片文件存储到云服务器,然后转换为base64位字符串传递给用户byte[] data=(byte[]) map.get("fileblob");if(data.length>0) {InputStream in = new ByteArrayInputStream(data);//logger.info("filename--->"+filename);File p = new File(path+"static\\temp");if(!p.exists()){p.mkdirs();}FileUtil.getFile(in,path+"static\\temp\\"+filename);
  1. 硬件设备调试可能出现各种未知错误,协议可能没写全,比如可能是图片清晰度不够、图片文件超过设备允许范围,各大参数是否必须,这些都需要重视将其设备返回信息打印出来,因为在客户那里是不允许上外网的,也不能现场调试,所以必须有足够多的日志信息输出,比如接口进入日志,接口传递参数,方法名和参数值调用,调用远程接口返回值一定要都打印出来,以便了解远程报错情况,可以通过AOP切面方式捕获服务接口和方法调用情况。

硬件设备(门禁人脸识别机)调试总结相关推荐

  1. 大华人脸门禁(人脸闸机)sdk集成对接javaweb接口springboot版

    大华人脸门禁(人脸闸机)sdk集成对接javaweb接口springboot版 项目开源地址: https://gitee.com/helloworld_xy/ibms-dahua 一.介绍 ​ 项目 ...

  2. 人脸识别门禁_门禁人脸识别系统铜陵县门禁人脸识别系统哪家好

    门禁人脸识别系统铜陵县门禁人脸识别系统哪家好 工地 1.建筑工地使用人脸识别门禁考勤机解决问题:工人刷脸出入,刷脸考勤,杜绝虚假考勤,提高考勤效率,工人工种分组,实名制管理. 2.人脸识别测温一体机用 ...

  3. 建筑工地人脸识别门禁通道闸机如何安装 1

    工地人脸识别应用常态化 伴随着国家住建部下发建筑工地实名制文件,行业正式进入政策红利期,相关工地实名制产品迅速爆发.其中,以人脸识别技术产品为代表的工地应用已经推广开来,以杭州为例,余杭等多地已明确要 ...

  4. 商汤SenseKeeper人脸识别机“打卡”海尔总部,刷脸通行再升级

    https://www.toutiao.com/a6707108992872612356/ 走到大堂闸机口,拿出员工卡触碰闸机,扇门打开,进入--这是很多上班族们每天的标准操作,并早已习以为常. 如今 ...

  5. 人脸识别机CCC认证

    刷脸终端CCC认证,移动支付设备3c认证,人脸识别CCC认证,终端刷卡机CCC认证,人脸识别机CCC认证,人脸识别CE认证 CCC认证申请资料提供清单及检查要求 下面让我们详细的了解下企业做CCC认证 ...

  6. 人脸识别接口_视壮人脸识别机相关接口

    视壮人脸识别机人脸库管理相关接口,要完成1:N或者M:N识别,首先需要构建一个人脸库,用于存放所有人脸特征,相关接口如下: 人脸注册:向人脸库中添加人脸 人脸更新:更新人脸库中指定用户下的人脸信息 人 ...

  7. 安卓设备门禁识别开发_基于android手机的视频通话门禁控制系统

    龙源期刊网 http://www.qikan.com.cn 基于 android 手机的视频通话门禁控制系统 作者:陆海 李登辉 来源:<科教导刊 · 电子版> 2017 年第 34 期 ...

  8. 安卓设备门禁识别开发_基于Android和RFID的门禁管理系统

    基于 Android 和 RFID 的门禁管理系统 秦斌斌 ; 何极 ; 赵萌 ; 秦丽丽 [期刊名称] <无线通信技术> [年 ( 卷 ), 期] 2018(027)004 [摘要] 本 ...

  9. 人脸识别机与服务器访问协议,人脸识别终端485通信协议.doc

    人脸识别终端485通信协议 人脸识别终端485通信协议 (波特率为57600bps:8个数据位,1个停止位,无奇偶校验位) 目 录 一.协议描述3 二.数据包格式3 三.包类型及子类型定义4 四.各命 ...

最新文章

  1. 使用T-SQL语句操作数据表-更新数据
  2. pgsql 运行状态 采集脚本
  3. pacman安装ubuntu_Ubuntu如何安装pacman
  4. 下载文件(弹出迅雷来下载)
  5. 在阿里云上进行Docker应用的自动弹性伸缩
  6. 老李分享:接口测试之jmeter
  7. 进阶学习js中的执行上下文
  8. FAIR 何恺明、Piotr、Ross等新作,MAE才是YYDS!仅用ImageNet1K,Top-1准确率87.8%!
  9. 使用 NVIDIA GPU 的 OpenCV ‘dnn’:YOLO、SSD 和 Mask R-CNN 速度提高 1549%
  10. 学而思编程python软件下载-靠品牌还是靠实力?猿编程、学而思编程、网易卡搭等机构深度测评...
  11. iframe调用其他网站出现验证码错误
  12. allgro pcb铜皮编辑_Allegro设计PCB基础知识:快捷键设置、铜皮处理、DC-DC布局布线、电源分割等等...
  13. Aliyun平台Nginx+Mysql+Redis部署easyboot
  14. android的listview分组显示的时候layout_marginTop失效的解决办法
  15. Windows10无法启动防火墙
  16. 【论文速读】【金融】Predicting stock and stock price index movement using ... and machine learning techniques
  17. 如何在企业中从0-1建立一个数据/商业分析部门?
  18. 威斯康星大学硕士计算机科学,威斯康星大学麦迪逊分校计算机科学
  19. 高颜值时尚小巧蓝牙耳机推荐,女友生日过节最强送礼装备
  20. [ERROR] Slave I/O: error connecting to master

热门文章

  1. 信息系统服务器故障应急处理规程,医院信息系统故障应急预案43066
  2. 仙剑缘_仙剑缘游戏下载-仙剑缘 v1.3.0 手机版 - 下载吧
  3. COBOL 中定义变量
  4. mysql 游戏 知乎_入行游戏测试之Navicat For MySQL
  5. AI得贤招聘官:浅谈人岗匹配对招聘的影响
  6. base64、图片相互转
  7. Godaddy SSL 证书配置(Nginx)
  8. MindManager22升级版思维导图
  9. 一文读懂RS-232与RS-422及RS-485三者之间的特性与区别
  10. 基于HTTP协议实现的小型web服务器