精华内容
下载资源
问答
  • java硬件对接经验总结

    2021-03-25 16:42:46
    总结一下就是之前没有过硬件对接经验和现场业务流程不熟悉。 二、解决思路 1、厂家有提供他们的说明文档,先把文档大致看下,然后再和厂家沟通; 2、业务和数据流转和现场的负责人沟通; 总结一下就是:不耻下问,...

    一、问题描述

    项目现场需要对接硬件,机缘巧合下派我出差对接。暂定要对接读卡器通道门两个硬件。

    难点描述:
    1、业务流程不清楚、数据流转来源和去向未确定,不知从何下手;
    2、时间和学习成本高;
    3、基本知识不懂,和硬件厂家沟通比较慢;
    4、部署调试、数据交互方案设计;
    总结一下就是之前没有过硬件对接经验现场业务流程不熟悉

    二、解决思路

    1、厂家有提供他们的说明文档,先把文档大致看下,然后再和厂家沟通;
    2、业务和数据流转和现场的负责人沟通;
    总结一下就是:不耻下问,明白自己要做什么之后再动手去做。

    3、业务流程:读卡器通过usb口连接Windows电脑,读卡器刷卡,硬件后端(下面简称hardware)代码读取卡片的芯片数据,然后推送给A系统,A系统把芯片数据推送给前端展示。即:读卡器刷卡,前端页面展示芯片数据。

    4、为方便大家理解业务,可以认为是运动员和工牌的证件写入和证件核验两部分。证件写入:运动员和工牌绑定;证件核验,在证件写入之后,检验芯片关联出的用户数据是否正确。

    三、解决方案

    1、人证读卡器

    (1)通过串口调试工具获取到芯片数据

    先用工具调试通过,学习一下指令怎么处理。
    ①读卡器数据交互格式:
    在这里插入图片描述

    ②读卡器需要先设置读卡模式,就以这个指令来调试吧
    在这里插入图片描述
    解释:
    0x代表是16进制,不用管,之后取后两位即可。如0x03,则取03.
    校验字可以通过网页计算:在线异或计算
    在这里插入图片描述
    ③使用工具发送指令:

    在这里插入图片描述
    使用的工具是,友善串口调试工具。红框设置连接参数;蓝框发送指令;黄框是响应数据

    (2)代码开发及交互方案演进

    具体代码就不再多描述了,百度一下java串口编程即可。

    读卡器是一问一答模式,即发送读卡指令给读卡器,读卡器才会响应给你,即被动模式
    ①hardware获取芯片:
    暂定用定时任务,发送读卡指令给读卡器,读取到芯片数据则推送到mq,让A系统接收芯片数据推送给前端;
    ②重复推送问题:
    假设定时任务1S一次,一张卡放在读卡器上10S,则hardware会读取十次芯片数据推送mq,A系统接收到mq的数据就推送给前端。从效果来说,前端没有明显的闪动,但是从交互来说,需要优化一下。即,卡放在读卡器上面10S,在此期间hardware只发送一次数据到mq里。个人的方案是,读取一个芯片数据,将该芯片数据作为key存入redis,并给一个过期时间(略大于定时任务间隔,尽量减少延迟),下次读取数据校验redis是否有该key,有的话则不推送至mq。
    ③hardware兼容读卡器模式:
    后续和读卡器厂家沟通,读卡器升级后支持主动模式(有芯片数据,读卡器主动推送),考虑到老系统的兼容问题,即hardware要支持读卡器的主动和被动两种模式。
    ④数据展示和读卡器要一一对应:
    前面说到,读卡器通过usb连接Windows,hardware是读取读卡器的芯片数据。则Windows、读卡器、hardware是一一对应关系,即hardware部署在有读卡器的Windows上,读卡器-A的数据只发送给hardware-A,然后在Windows-A页面展示;但是问题在于,A系统,也就是接收mq芯片数据的服务,是部署在Linux上的,也就是说A系统无法区分芯片数据是哪个读卡器读的,要推送至哪个前端页面。解决方案:hardware推送至mq的芯片数据,携带一个本机ip字段;Windows操作页面和A系统建立socket通道时,前端传参本机ip,A系统通过map保存socket通道,key为ip,value为socket。这样就能区分该芯片数据,是哪个读卡器推送,要推送至哪个前端页面,不会让数据交叉。
    ⑤离线模式回显芯片
    客户后来提出需求:在局域网断网的情况下,刷卡的时候,页面也要显示芯片数据(只针对芯片回显,其他的比如接口请求则不做要求)。解决方案:前端新建一个socket通道连接本机hardware。一共建立两个socket通道,一个连服务器的A系统,用于在线流程;一个连本地Windows的hardware,用于离线流程(分两个socket是因为不想让hardware沾染A系统的业务代码,各司其职就好)。则hardware需要定时检测相关服务器是否可达,具体代码就不描述了,根据服务器是否可达走相关代码逻辑。
    概括一下流程:
    在线流程:读卡器 -> hardware -> rabbitmq -> A系统 -> netty -> 前端
    离线流程:读卡器 -> hardware -> netty -> 前端
    自动获取串口名称
    代码开发到这程度,功能是实现了,但是还有优化的地方。比如hardware是通过配置文件读取串口号的,同一个读卡器用在不同Windows电脑,串口号可能不一样,可能Windows-A是COM3,到了Windows-B就是COM7,所以如果hardware能自动获取串口号,那么也节省了部署的成本。
    在这里插入图片描述
    截图的是Windows连接显示屏的串口,和读卡器的一样,都是COM开头。如果能获取前面的中文,用来区分那就完美了,详情参考:
    Java获取串口名称
    JAVA代码执行CMD命令
    ⑦Windows部署jar脚本(简单):
    启动脚本start.bat:

    @echo off
    REM 取消 快速编辑模式,防止程序卡着
    reg add HKEY_CURRENT_USER\Console /v QuickEdit /t REG_DWORD /d 00000000 /f
    REM 指明控制台编码UTF-8
    chcp 65001
    REM 命令行窗口的名字
    title "hardware"
    REM jar包存放在Windows的绝对位置,指明外置配置文件绝对路径
    java -Dfile.encoding=utf-8 -jar D:\hardware.jar --spring.cloud.bootstrap.location=D:\bootstrap.yml
    pause
    

    停止脚本stop.bat:

    @echo off
    REM hardware的运行port
    set port=8080
    for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (
     echo kill the process %%m who use the port 
     taskkill /pid %%m -t -f
     goto q
    )
    :q
    

    前端部署:
    Windows部署前端

    2、通道门

    通道门对接就大致概括下吧,通道门的作用本来我以为是最终入场的时候,运动员通过通道门,电脑屏幕显示该人员的信息。但是实际不是这么回事,通道门暂时是用来做“证件校验”的另一个方法。也就是说,人员的证件写入,芯片数据来源只有读卡器;但是证件核验,有读卡器和通道门两种。

    (1)通道门对接方式是厂家的dll动态库

    相关资料请百度JNA或JNI,hardware加载动态度用的是绝对路径。通道门也是问答模式,和人证读卡器的区别在于,通道门有厂家提供的dll动态库,直接调用相关函数即可。dll动态度处理代码:

    public static String loadLib(String libName) {
            String resourcePath = "/" + libName;
            String folderName = System.getProperty("user.dir") + "/dll/";
            File folder = new File(folderName);
            if (!folder.exists()) {
                folder.mkdirs();
            }
            File libFile = new File(folder, libName);
            if (libFile.exists()) {
                System.load(libFile.getAbsolutePath());
            } else {
                try {
                    InputStream in = ChannelDoorConfig.class.getResourceAsStream(resourcePath);
                    FileUtils.copyInputStreamToFile(in, libFile);
                    in.close();
                    System.load(libFile.getAbsolutePath());
                } catch (Exception e) {
                    throw new RuntimeException("Failed to load required lib", e);
                }
            }
            String libAbsolutePath = libFile.getAbsolutePath();
            log.info("{} absolute-path -> {}",libName,libAbsolutePath);
            return libAbsolutePath;
    }
    

    (2)双网卡配置问题

    在三-1-(2)-④提到过,芯片数据要能区分是哪个Windows的数据,所以hardware会获取本机ip。但是由于通道门是单独的网段,所以本机Windows配置双ipv4网段后,代码没办法区分内网ip和通道门ip。
    在这里插入图片描述

    解决方案:通道门采用的是网口对接,所以配置文件会有通道门的ip,可以截取前三段的ip段落,然后和获取的ip进行比较。

    3、车证读卡器

    (1)流程

    车证读卡器对接的业务流程和人证的一摸一样,也分证件写入和证件核验等流程,不再多说。

    (2)SDK对接

    相关概念及流程:
    ①盘点,读卡器搜查芯片数据的过程就叫盘点。
    ②盘点期间,只要芯片在范围内,就会一直向hardware推送数据
    ③数据交互:调用dll的盘点函数(可设置盘点时长),程序实现回调函数,盘点到芯片数据就调用回调函数。即一次盘点,可能回调函数多次被调用。

    dll盘点函数之一,EPC芯片盘点函数:
    EPC_SEARCH(INT32U handle, EPC_INV_PARAM_SIMPLE *param, RFID_PACKET_CALLBACK_FUNCTION func)
    ④JNA实现dll结构体,
    即定义一个实体类,继承com.sun.jna.Structure。根据dll中的结构体定义相关字段即可,注意要定义取值顺序:
    在这里插入图片描述
    ⑤JNA实现dll回调函数,以及Callback的问题
    自定义接口,继承com.sun.jna.Callback接口,自己定义方法即可,入参要和dll函数保持一致,让impl类实现回调逻辑。注意回调函数入参不支持数组,要使用Pointer类,否则报错
    在这里插入图片描述
    在这里插入图片描述
    debug查看原因:
    com.sun.jna.CallbackReference类的构造方法:
    在这里插入图片描述
    com.sun.jna.CallbackReference类的isAllowableNativeType方法:

    private static boolean isAllowableNativeType(Class cls) {
            return cls == Void.TYPE || cls == Void.class 
    		|| cls == Boolean.TYPE || cls == Boolean.class 
    		|| cls == Byte.TYPE || cls == Byte.class 
    		|| cls == Short.TYPE || cls == Short.class 
    		|| cls == Character.TYPE || cls == Character.class 
    		|| cls == Integer.TYPE || cls == Integer.class 
    		|| cls == Long.TYPE || cls == Long.class 
    		|| cls == Float.TYPE || cls == Float.class 
    		|| cls == Double.TYPE || cls == Double.class 
    		|| ByValue.class.isAssignableFrom(cls) && Structure.class.isAssignableFrom(cls) || Pointer.class.isAssignableFrom(cls);
    }
    

    解决方法:将数组类型换成Pointer类型即可,调用getByteArray方法获取byte[]数据。

    四、总结

    1、不怕任务多和难,只要有相关文档和厂家人员沟通,什么都不是事;
    2、对于从未接触的领域,一定要不耻下问,不耻下问,不耻下问;
    3、这次对接硬件,也是想着多接触一些技术,见见世面;

    萌新发言,不喜勿喷,欢迎大佬指出不当之处!

    展开全文
  • java后台与硬件对接经验

    千次阅读 2016-01-13 14:27:00
    = (java.lang.Integer.toHexString(b[n] & 0XFF )); if (stmp.length() == 1) // 小于16会补0 hs = hs + "0" + stmp; else hs = hs + stmp; } return hs.toUpperCase(); } 16进制字符串转10...

    8421BCD编码,用于存储手机号码,每2位手机号码存储于一个byte中,详细转换如下:

      比如手机号码 13129911472 ,13拆开为1和3,1对应2进制为 0000 0001,3对应2进制为 0000 0011,合并只有为 0001 0011,对应byte为 19,对应16进制为 0x13

    byte转10进制:

    byte b=19;
    int a=b&0xFF; //byte转int 此时 a=19
    byte b=-103;
    int a=b&0xFF; //byte转int 此时a=153

    10进制转16进制:

    int a=19;
    String hex=Integer.toHexString(a); //10进制转16进制,此时hex =13

    byte数组转16进制:

    public static String byte2hex(byte[] b) {
          String hs = "";
          String stmp = "";
          for (int n = 0; n < b.length; n++) {
           stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
           if (stmp.length() == 1)//小于16会补0
            hs = hs + "0" + stmp;
           else
            hs = hs + stmp;
          }
          return hs.toUpperCase();
         }

    16进制字符串转10进制:

    String str="AC";
    int num=Integer.parseInt(str,16);//此时 num 为172
    byte b=(byte)num; //此时byte 为 -84

    16进制字符串转byte数组

    public static byte[] hex2byte(String content) {
          byte[] mtemp=new byte[content.length()/2];//初始化byte数组,长度为lenth/2,每2个表示一个byte
          int j=0;
          for (int n=0; n<content.length(); n=n+2) {//每次增加2
           String sTemp=content.substring(n,n+2);//截取每2个
           //0xca-256=-54
           mtemp[j]=(byte)Integer.parseInt(sTemp, 16);//先转成10进制int,然后再转成byte
           j++;
          }
          return mtemp;
         }

     字符串获取特定编码字节数组:

    public static byte[] getBytesArray(String str,String changeToCharset)
            throws UnsupportedEncodingException {
     return str.getBytes(changeToCharset);
    }

    对字节数组通过特定编码获取字符串:

    public static String bytesToString(byte[] bs,String changeToCharset)
            throws UnsupportedEncodingException {
     return new String(bs,changeToCharset);
    }

     

    转载于:https://www.cnblogs.com/jinjixia/p/5127214.html

    展开全文
  • 最近一直再做物联网相关的方向,做一些硬件设备的对接,经常用到校验和。因此记录下来,以供大家使用 /*** * 计算校验和 * @param data * @return */ public static String makeChecksum(String data) { if...

    最近一直再做物联网相关的方向,做一些硬件设备的对接,经常用到校验和。因此记录下来,以供大家使用

     

    /***
         * 计算校验和
         * @param data
         * @return
         */
        public static String makeChecksum(String data) {
              if (data == null || data.equals("")) {
               return "";
              }
              int total = 0;
              int len = data.length();
              int num = 0;
              while (num < len) {
               String s = data.substring(num, num + 2);
              // System.out.println(s);
               total += Integer.parseInt(s, 16);
               num = num + 2;
              }
              /**
               * 用256求余最大是255,即16进制的FF
               */
              int mod = total % 256;
              String hex = Integer.toHexString(mod);
              len = hex.length();
              // 如果不够校验位的长度,补0,这里用的是两位校验
              if (len < 2) {
               hex = "0" + hex;
              }
              return hex;
        }

    展开全文
  • 记录一次项目经历,新公司开发过程中遇到了硬件对接的需求,没有接触过这方面的我一想到这些就很头大,花了几天时间来专门研究一下这个。一般硬件购买后厂家都会附赠一些开发文档,有各种语言的demo,里面其实重要的...
    记录一次项目经历,新公司开发过程中遇到了硬件对接的需求,没有接触过这方面的我一想到这些就很头大,花了几天时间来专门研究一下这个。一般硬件购买后厂家都会附赠一些开发文档,有各种语言的demo,里面其实重要的只是dll里面的dll文件和接口文档,每一个dll文件都是一个单独的函数库,里面记录着对接硬件所需要的函数。每种开发语言基本上都有对dll调用的支持,最典型的就是js的activex控件,activex控件支持js通过一个服务的clsid在页面上生成一个object对象,之后操作object对象就相当于操作dll函数库,但是特别鸡肋的是activex只支持部分ie,如果想解决兼容性问题就只能使用后台服务进行桥接。
    

    作为一个java程序员,当然最先想到的是java代码如何操作这个dll,网上搜索到的基本上就是JNI、JNA、JNative这三种方式,这三种的功能基本上是一样的,但是相比之下,JNA的代码简洁易懂,可以说是完胜,所以这里拿JNA调用dll的demo举个栗子。
    项目结构是这样的:一般dll文件放在项目根目录下,在代码中dll的路径直接写上dll名称就可以访问dll了。

    这里的Termb.dll是我硬件中的一个函数库,其中文档上说他有两个内置方法,
    在这里插入图片描述
    在这里插入图片描述
    接下来发一下测试代码:

    import com.sun.jna.Library;
    import com.sun.jna.Native;
    
    /**
     * Test
     * @author :wdq
     * @date :Created in 2019/8/14 14:40
     * @version: 1.0
     */
    public class Test {
    
        public static void main(String[] args) {
            TerMbDll dll = init("Termb", TerMbDll.class);
            System.out.println(dll.CVR_InitComm(1));
            System.out.println(dll.CVR_Authenticate());
        }
    
        /**
         * TerMbDll接口
         * @author :wdq
         * @date :Created in 2019/8/14 14:30
         * @version: 1.0
         */
        public interface TerMbDll extends Library {
    
            //dll内置函数
            int CVR_InitComm(int Port);
            int CVR_Authenticate();
    
        }
    
        /**
         * 装载dll接口
         * @param dllPath
         * @param c
         * @return
         */
        public static <T> T init(String dllPath,Class c){
            //判断是否继承Library
            if(!Library.class.isAssignableFrom(c)){
                return null;
            }
            return (T) Native.loadLibrary(dllPath,c);
        }
    }
    
    

    仔细品味一下jna调用dll的代码,感觉方式有点webservice的赶脚,通过classLoader完成interface和dll函数库之间的映射,我们只需要在接口中写上需要使用的方法,然后调用接口就可以了,不要太简单,有时间的小伙伴可以点jar进去看下源码,懂了源码可以在基础上再封装一下。贴一下我的pom文件:

            <dependency>
                <groupId>net.java.dev.jna</groupId>
                <artifactId>jna</artifactId>
                <version>4.1.0</version>
            </dependency>
    
    展开全文
  • 由于最近在用java对接一些物联网的智能设备,在这构成中经历了各种折腾之后,总结出来的一些方法和经验,希望能帮助在路上的同学们。下边是一个计算校验和的方法 public class CheckNum { /* *//** * 求校验...
  • 这两天 一直和京东对接接口,我们用.net api 提供接口,对方用java调用,本来没什么问题,但是对方对数据安全要求特别严,要验签,于是噩梦开始了。 1、在传输的时候,约定传输格式: HttpWebRequest request = ...
  • 使用mqtt协议 硬件对接

    千次阅读 2019-11-22 13:50:56
    Shaocheng.Li Toggle main menu visibility 首页 关于 MQTT 协议和 mosquitto 2015-08-11 Network 12792 MQTT 介绍 Mosquitto 安全性 3.1. SSL/TLS 3.2. WebSockets with SSL/TLS libmosquitto 库 ...4.3...
  • java web项目如何与硬件设备(物联网)进行对接

    万次阅读 多人点赞 2018-02-12 14:38:13
    说说做过的粮库项目用到的硬件设备与怎么样与java web项目进行对接。 首先是出入库系统。 粮食出入库系统是最基本的系统。没有粮食的入,出,就没有后面的粮食的管理,粮情的检测等。出入库系统最好的是C/S系统,C/S...
  • 海康设备网络SDK java对接

    千次阅读 2020-05-16 14:02:25
    一.开发环境:Linux64(ubuntu环境) 二.SDK版本:CH-HCNetSDKV6.1.4.17_build20200331_Linux64(官网下载sdk) 三.开发环境准备:安装 jdk , eclipse, Linux下需要将库文件放置到/usr/lib64目录下 ...
  • 1、图灵机器人大脑具备强大的中文语义分析能力,可准确理解中文含义并作出回应,是最擅长聊中文的机器人大脑,赋予软硬件产品自然流畅的人机对话能力。 2、我们熟悉的案例有QQ小冰,通过用户的输入能够达到智能对话...
  • 收到的一份需求任务是对接硬件,TCP通信,并给出通信端口与数据包格式,如下:0x01. 首先编写了一个简单的十六进制转 byte[] 数组与 byte[] 转换16进制字符串的两个方法,如...
  • 请问web服务和硬件对接.通过阿里的iot平台通信和直接使用mqtt服务器通信有什么区别吗?
  • 最近几天就是把接口和UI都对上了,动态获取到需要的值,都是走网络走数据库的 。
  • Java基础 (1)基本数据类型各占多少个字节 数据类型 字节 byte 1 short 2 int 4 long 8 float ...
  • Java的IO_10对接

    2019-07-28 17:27:15
    对接流 用:图片——>字节数组——>图片来实践 文件输入流(通过程序做中转),写入字节数组中,程序写入文件中 除了字符串,其他的转接成字符数组需要流来对接 package com.io.cx2; import java.io....
  • 最近项目中接到一个需求,需要对接硬件流速仪,实时获取数据并保存到数据库.根据了解得到硬件支持XPH通讯、标准MODBUS通讯两种格式。支持RS-232、RS-485通讯总线。支持9600波特率. 在调试之前需要先要下载RXTX的jar包...
  • 公司做的是消防行业,最近我来对接一个断漏器的物联网设备,设备响应的报文body体是用异或加密的,所以整理了一下,方便后来者直接使用,不必走弯路。 import java.io.BufferedOutputStream; import java.io....
  • Java调用硬件接口

    2020-08-21 13:15:25
    使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob. 其中JNI(Java Native Interface)是Java语言本身提供的调用本地已编译的函数库的方法,本身具有跨平台性,可以在不同的 机器上调用不同的本地库。...
  • 在需要开始发送的地方写线程开启,在需要关闭和OnDestiory里面条用关闭 //还有一种方法是用sleep不推荐使用,一般硬件要求比较严格sleep对于时间有一个累计的过程不提倡使用,在SerialHelper.Java里面有个方法也是做...
  • 简介:硬件设备有IC卡片,指压测试仪(测试脉搏信号、心率、血压),经过串口获取硬件设备发送的数据。 正文:第一步:获得硬件设备,应用市场下载串口调适软件,测试一下在Android环境下数据是否能正常获取, 第...
  • 大佬们好,作为客户端的Java程序,利用TCP与硬件通信,在通信的过程中往往由于网络的原因导致指令无法完整的到达硬件设备,或者在与硬件通信过程中存在Java程序TCP客户端的响应速度过快(过快:就是客户端主动关闭了...
  • 今天收到的一份需求任务是对接硬件,TCP通信,并给出通信端口与数据包格式,如下: 1.首先编写了一个简单的十六进制转byte[]数组与byte[]转换16进制字符串的两个方法,如下: /** * 将十六进制的字符串转换...
  • 基于JavaWeb平台的常用物联网硬件接口对接代码总结文档 20190612 田超凡 ...
  • java获取远程服务器硬件信息 内容精选换一换分析辅助软件是一款支持部署到多台服务器目标环境上,实现对整个业务集群的数据采集和优化的组件。已成功登录Java性能分析。待安装分析辅助软件的服务器已开启sshd。已...
  • 请问有人知道java中有没有和PHP中的workerman有类似功能的插件或框架,用来做java硬件交互,和硬件设备建立长连接,来进行通信传输命令等...
  • 代码如下 def skip_ws(txt, pos): while pos &lt; len(txt) and txt[pos].isspace(): pos += 1 return pos ...def parse_str(txt, pos, allow_ws=False, delimiter=[',',':','}',']']): ...
  • Java串口编程控制硬件

    千次阅读 2019-09-20 17:19:46
    还是半年前接触的JAVA串口编程控制硬件,现在项目中又即将运用到,所以特别写成博客记录,同时分享交流。 Java环境中的JDK是本身不带有串口的jar包的,需要我们自己下载然后配置到本地的JDK之中,我们采用RXTX串口...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,843
精华内容 3,537
关键字:

java硬件对接

java 订阅