目前在网络上查询java与usb的设备通信资源都非常的少大多都来自一个05年的文章,本人也摘取了网上的例子,例子中直接运行也出现了一些问题,经过debug还是可以直接在windows上直接使用java向usb设备发送指令并接受返回值的.接下来贴出代码供大家参考

import java.util.List;import javax.usb.UsbConfiguration;
import javax.usb.UsbDevice;
import javax.usb.UsbDeviceDescriptor;
import javax.usb.UsbEndpoint;
import javax.usb.UsbHostManager;
import javax.usb.UsbHub;
import javax.usb.UsbInterface;
import javax.usb.UsbInterfacePolicy;
import javax.usb.UsbPipe;public class UsbTest {//下边两个参数为系统中usb设备的VID和PID 需要自行配置private static short idVendor = (short)0xFFFF;private static short idProduct = (short)0x0001;public static void main(String[] args) {try {UsbPipe sendUsbPipe = new UsbTest().useUsb();//本人测试时 是使用公司的一个读卡器主要对银行卡和身份证进行读取写等相关操作//下边为发送的指令,目前大多usb硬件设备都是接受HEX 16进制指令//那么如下指令为:363600028000000280 的16进制指令 注意2位为一组16进制字符buff[0] = (byte)0x36;buff[1] = (byte)0x36;buff[2] = (byte)0x00;buff[3] = (byte)0x02;buff[4] = (byte)0x80;buff[5] = (byte)0x00;buff[6] = (byte)0x00;buff[7] = (byte)0x02;buff[8] = (byte)0x80;sendMassge(sendUsbPipe, buff);}} catch (Exception e) {e.printStackTrace();}}public UsbPipe useUsb() throws Exception{UsbInterface iface = linkDevice();if (iface == null) {return null;}UsbEndpoint receivedUsbEndpoint,sendUsbEndpoint;sendUsbEndpoint = (UsbEndpoint)iface.getUsbEndpoints().get(0);if (!sendUsbEndpoint.getUsbEndpointDescriptor().toString().contains("OUT")) {receivedUsbEndpoint = sendUsbEndpoint;sendUsbEndpoint = (UsbEndpoint)iface.getUsbEndpoints().get(1);} else {receivedUsbEndpoint = (UsbEndpoint)iface.getUsbEndpoints().get(1);}//发送:UsbPipe sendUsbPipe =  sendUsbEndpoint.getUsbPipe();sendUsbPipe.open();//接收final UsbPipe receivedUsbPipe =  receivedUsbEndpoint.getUsbPipe();receivedUsbPipe.open();new Thread(new Runnable() {public void run() {try {receivedMassge(receivedUsbPipe);} catch (Exception e) {e.printStackTrace();}}}).start();return sendUsbPipe;}public UsbInterface linkDevice() throws Exception{UsbDevice device = null;if (device == null) {device = findDevice(UsbHostManager.getUsbServices().getRootUsbHub());}if (device == null) {System.out.println("设备未找到!");return null;}UsbConfiguration configuration = device.getActiveUsbConfiguration();UsbInterface iface = null;if (configuration.getUsbInterfaces().size() > 0) {//此处需要注意 本人在这个地方的时候是进行了debug来看设备到底在map中的key是多少//各位如果在此处获取不到设备请自行进行debug看map中存储的设备key到底是多少iface = configuration.getUsbInterface((byte) 0);} else {return null;}iface.claim(new UsbInterfacePolicy(){@Overridepublic boolean forceClaim(UsbInterface usbInterface){return true;}});return iface;}public void receivedMassge(UsbPipe usbPipe) throws Exception{StringBuffer all = new StringBuffer();byte[] b = new byte[64];int length;while (true) {length = usbPipe.syncSubmit(b);//阻塞System.out.println("接收长度:" + length);for (int i = 0; i < length; i++) {//此处会打印所有的返回值 注意返回值全部也都是16进制的//比如读取卡号或者身份证号时需要自行转换回10进制//并进行补0操作,比如01转换为10进制会变成1需要补0 变成01//不然得到的10进制返回值会有问题System.out.print(Byte.toUnsignedInt(b[i])+" ");all.append(Byte.toUnsignedInt(b[i])+" ");}}}public static void sendMassge(UsbPipe usbPipe,byte[] buff)  throws Exception{//此处为阻塞和非阻塞  非常好理解和多线程一个道理不再解释usbPipe.syncSubmit(buff);//阻塞//usbPipe.asyncSubmit(buff);//非阻塞}public UsbDevice findDevice(UsbHub hub){UsbDevice device = null;List list = (List) hub.getAttachedUsbDevices();for (int i = 0;i<list.size();i++){device = (UsbDevice)list.get(i);UsbDeviceDescriptor desc = device.getUsbDeviceDescriptor();System.out.println(i+"___"+desc.idVendor()+"___"+desc.idProduct());if (desc.idVendor() == idVendor && desc.idProduct() == idProduct) {return device;}if (device.isUsbHub()){device = findDevice((UsbHub) device);if (device != null) return device;}}return null;}
}

PID和VIP如下图: 0458为VID    003A为PID

另外还需要在resources文件夹中添加配置文件 名称为:javax.usb.properties

配置文件中内容为:

javax.usb.services = org.usb4java.javax.Services

保险起见pom中添加如下配置:

<dependency><groupId>org.usb4java</groupId><artifactId>usb4java-javax</artifactId><version>1.2.0</version>
</dependency><dependency><groupId>javax.usb</groupId><artifactId>usb-api</artifactId><version>1.0.2</version></dependency><dependency><groupId>javax.usb</groupId><artifactId>usb-api</artifactId><version>1.0.2</version><classifier>sources</classifier></dependency>

PS:这个java端的usb方法非常的老支持的usb2.0版本虽然现在的3.0版本也能用但是会发生插拔了之后不能使用,这方面我尝试了很久进行重连但是都失败了,所以非万不得已还是尽量不要使用这个在生产使用好一些,可以用C#来做很容易避免这样的问题java真的很不友好

在java端如果想做成插件可以使用servlet做一个启动类打一个jar包放入到jre中,之后我们在写一个bat脚本就可以实现javausb插件在windows中使用了

java中实现与USB硬件通信相关推荐

  1. iOS中的WiFi与硬件通信

    WiFi通信是指手机通过WiFi与外部设备建立连接,并与外部设备进行交互.通信.手机与外部设备的WiFi通信通常是使用Socket来实现的,在这里先介绍一个第三方Socket库(CocoaAsyncS ...

  2. 关于在u-boot中使用usb进行通信(一)

    写这篇博客是初衷是我之前在做一个项目,需要在uboot中实现usb通信功能,与pc上位机进行通信,在网上一直没找到相关的参考资料,后来项目做完了,就想写这篇博客分享给大家 转载请标明原处:https: ...

  3. Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信

    本文计划采用socket实现客户端和服务端的任意双向通信,即客户端可以随时给服务端发消息,服务端也可以随时给客户端发消息,最终结果就是一个类似与QQ的聊天软件的功能. 以下代码可以直接拷贝到Eclip ...

  4. Java中利用socket实现简单的服务端与客户端的通信(基础级)

    在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程.上一篇文章的链接:Java中利用socket实现 ...

  5. gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)

    场景 ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...

  6. Java中Socket通信-客户端与服务端相互传输对象数据

    场景 Java中Socket通信-服务端和客户端双向传输字符串实现: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1084885 ...

  7. Java中Socket通信-客户端向服务端发送照片

    场景 Java中Socket通信-服务端和客户端双向传输字符串实现: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1084885 ...

  8. Java中Socket通信-服务端和客户端双向传输字符串实现

    场景 什么是socket 在计算机通信领域,socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台计算机可以接收其他计算机 ...

  9. connect: 网络不可达_Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制

    本文转自:https://github.com/jasonGeng88/blog 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

最新文章

  1. 戴尔电脑管家_2020年笔记本电脑推荐指南:笔记本电脑应该怎么选?什么牌子的笔记本电脑更值得入手?...
  2. 开源项目之树莓派---无线监控摄像头
  3. Erlang转JAVA,将Erlang UTF-8编码的字符串转换为java.lang.String
  4. 《TCP/IP详解:卷1》之TCP/UDP总结
  5. 秦九韶算法matlab程序,数值分析matlab程序实例.doc
  6. 从json数组中获取某一属性的集合
  7. 《TCPIP详解》卷一系列解读
  8. 笔记本安装黑苹果后无法调节亮度的解决办法 | 小太阳
  9. android xutils 教程,Android xUtils更新到3.0后的基本使用规则详解
  10. 股票重大利好开盘封涨停买不到?试试这个办法
  11. 【Vue实用功能】Vue实现浏览器全屏退出全屏
  12. ch341a i2c 安卓_CH341-I2C-labview-all-vision CH341A的I2C接口Labview all vision - 下载 - 搜珍网...
  13. php不能连接到数据库服务器,我似乎无法将PHP页面连接到SQL测试服务器和数据库...
  14. android10管理权限,Android 权限管理
  15. 什么是widget?widget是什么意思?
  16. lms算法的matlab实现,LMS算法的MATLAB实现
  17. Datawhale零基础入门NLP赛事 - Task5 基于深度学习的文本分类2
  18. P1000 超级玛丽游戏题解
  19. 根据经纬度,随机生成经纬度
  20. sqlserver战德臣_数据库系统(上):模型与语言答案

热门文章

  1. mysql支持自定义函数_MySQL 自定义函数
  2. Mysql去重查询---DISTINCT、group by
  3. python houdini_Houdini Python编程实例 - 纳金网
  4. word2007中缩进混乱的现象
  5. vscode安装使用(含安装包)、更改语言、更换主题和背景、设置模板、更改字体大小
  6. 每日必做8月17日更新
  7. buuctf刷题9 (反序列化逃逸shtml-SSI远程命令执行idna与utf-8编码漏洞)
  8. 数据结构:栈和队列(Stack Queue)【详解】
  9. C语言程序——分段函数
  10. Mac使用之 数码测色计