Java 平台一直都以其平台无关性自豪。虽然这种无关性有许多好处,但是它也使得编写与硬件交互的 Java 应用程序的过程变得相当复杂。在本文中,研究科学家蒋清野讨论了两个项目,它们通过提供使Java 应用程序可以使用 USB 设备的 API 而使这个过程变得更容易。虽然这两个项目仍然处于萌芽状态,但是它们都显示了良好的前景,并已经成为一些实用应用程序的基础。

通用串行总线(Universal Serial Bus USB)规范的个版本发表于 1996年 1月。因为它的低成本、高数据传输率、使用容易和灵活性,USB 在计算机行业里获得了广泛接受。今天,许多周边设备和装置都是通过 USB 接口连接到计算机上的。目前,大多数一般用途的操作系统都提供了对 USB 设备的支持,并且用 C 或者 C++ 可以相对容易地开发访问这些外设的应用程序。不过,Java 编程语言在设计上对硬件访问提供的支持很少,所以编写与 USB 设备交互的应用程序是相当困难的。

ibm 的 Dan Streetman 早开始了在 Java 语言中提供对 USB 设备的访问的努力。2001年,他的项目通过 Java 规范请求(Java Specification Request,JSR)过程被接受为 Java 语言的候选扩展标准。这个项目现在称为 JSR-80 并且指定了官方包 javax.usb。同时,在 2000年 6月,Mojo Jojo 和 David Brownell 在 SourceForge 开始了 jUSB 项目。这两个项目都开发出了 Linux 开发人员可以使用的包,尽管它们都还很不完善。这两个项目也都开始试图向其他操作系统上的 Java 应用程序提供对 USB 设备的访问,尽管它们都还没有开发出可以使用的包(参阅 参考资料 中有关本文中讨论的这两个项目及其他项目的资料)。

在本文中,将对 jUSB 和 JSR-80 项目作一个简要介绍,不过,我们首先要看一下 USB 协议的具体细节,这样您就可以理解这两个项目是如何与 USB 设备交互的。我们还将提供代码片段以展示如何用这两个项目的 API 访问 USB 设备。

USB 介绍

1994年,一个由四个行业伙伴(Compaq、Intel、Microsoft 和 NEC)组成的联盟开始制定 USB 协议。该协议初的目的是将 PC 与电话相连并提供容易扩展和重新配置的 I/O 接口。1996年 1月,发表了 USB 规范的个版本,1998年 9月发表了后续版本(版本 1.1)。这个规范允许 127台设备同时连接到一起,总的通信带宽限制为 12 Mbps。后来,又有三个成员(Hewlett-Packard、Lucent 和 Philips)加入了这个联盟。2000年 4月,发表了 USB 规范的 2.0版本,它支持高达 480 Mbps 的传输率。今天,USB 在高速(视频、图像、储存)和全速(音频、宽带、麦克风)数据传输应用中起了关键作用。它还使各种低速设备(键盘、鼠标、游戏外设、虚拟现实外设)连接到 PC 上。

USB 协议有严格的层次结构。在所有 USB 系统中,只有一个主设备,到主计算机的的 USB 接口称为主控器(host controller)。主控器有两个标准??开放主控器接口(Compaq 的 Open Host Controller Interface,OHCI)和通用主控器接口(Intel 的 Universal Host Controller Interface,UHCI)。这两个标准提供了同样的能力,并可用于所有的 USB 设备,UHCI 的硬件实现更简单一些,但是需要更复杂的设备驱动程序(因而 CPU 的负荷更大一些)。

USB 物理互连是分层的星形拓朴,多有七层。一个 hub 是每个星形的中心,USB 主机被认为是 root hub。每一段连线都是 hub 与 USB 设备的点对点连接,后者可以是为系统提供更多附加点的另一个 hub,也可以是一个提供功能的某种设备。主机使用主/从协议与 USB 设备通信。这种方式解决了包冲突的问题,但是同时也阻止了附加的设备彼此建立直接通信。

所有传输的数据都是由主控器发起的。数据从主机流向设备称为下行(downstream)或者输出(out)传输,数据从设备流向主机称为上 行(upstream)或者输入(in)传输。数据传输发生在主机和 USB 设备上特定的端点(endpoint) 之间,主机与端点之间的数据链接称为管道(pipe)。 一个给定的 USB 设备可以有许多个端点,主机与设备之间数据管道的数量与该设备上端点的数量相同。一个管道可以是单向或者是双向的,一个管道中的数据流与所有其他管道中的数据流无关。

USB 网络中的通信可以使用下面四种数据传输类型中的任意一种:

控制传输: 这些是一些短的数据包,用于设备控制和配置,特别是在设备附加到主机上时。

批量传输: 这些是数量相对大的数据包。像扫描仪或者 SCSI 适配器这样的设备使用这种传输类型。

中断传输: 这些是定期轮询的数据包。主控器会以特定的间隔自动发出一个中断。

等时传输: 这些是实时的数据流,它们对带宽的要求高于可靠性要求。音频和视频设备一般使用这种传输类型。

像串行端口一样,计算机上每一个 USB 端口都由 USB 控制器指定了一个惟一的标识数字(端口 ID)。当 USB 设备附加到 USB 端口上时,就将这个 惟一端口 ID 分配给这台设备,并且 USB 控制器会读取设备描述符。设备描述符包括适用于该设备的全局信息、以及设备的配置信息。配置定义了一台 USB 设备的功能和 I/O 行为。一台 USB 设备可以有一个或者多个配置,这由它们相应的配置描述符所描述。每一个配置都有一个或者多个接口,它可以视为一个物理通信渠道 ;每一个接口有零个或者多个端点,它可以是数据提供者或者数据消费者,或者同时具有这两种身份。接口由接口描述符描述,端点由端点描述符描述。并且一台 USB 设备可能还有字符串描述符以提供像厂商名、设备名或者序列号这样的附加信息。

来源:考试大-Java认证

责编:onmars  评论 纠错

java高级工程师认证考试_Java高级软件工程师人才缺口巨大相关推荐

  1. java高级工程师认证考试_java高级工程师开放面试题集

    java高级工程师开放面试题集 发布时间:2019-01-03 11:38, 浏览次数:1108 , 标签: java 临近年关,不少人蠢蠢欲动,有童鞋问我java后端面试会面试什么? 作为一个jav ...

  2. java高级软件工程师面试_高级软件工程师的新面试问题

    java高级软件工程师面试 I'm putting together some practice interview questions for a friend who lost his job. ...

  3. 程序员IT认证有用吗?软件工程师考证有必要吗?

    有一些没有社会经验的同学会问"程序员IT认证有用吗?软件工程师考证有必要吗?是否应该考几个认证?" 现在和软件开发有关的认证有如下几类: 1.知名国际企业的认证,比如微软的MCSD ...

  4. J2EE高级软件工程师面试题集

      第一章:J2EE高级软件工程师面试题集 --JAVA基础部分 1.面向对象的特征有哪些方面1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不 ...

  5. 高级软件工程师要掌握的技能

    软件工程师考试(高级)大纲 一.考试说明 1.考试要求: (1)理解软件工程管理的概念和任务: (2)理解软件生存期过程: (3)理解软件工程标准: (4)掌握需求分析.测试.维护基本技术: (5)掌 ...

  6. 5gh掌上云计算认证不通过_阿里云ACE高级工程师认证考试攻略、考试心得、费用及常见问题...

    阿里云ACE是高级工程师级别,云吞铺子分享阿里云ACE云计算架构师高级认证考试攻略.考试心得.费用及常见问题: ACE认证分类 阿里云ACE高级工程师认证分为云计算和大数据两个方向,目前可以报考的只有 ...

  7. 谷歌高级软件工程师的一天

    作者 | Dimitris Leventeas 译者 | 弯月   来源 | CSDN(id: CSDNnews) 工作过的朋友都知道,实际写代码的时间其实并不多,有很大一部分工作的时间都用在了处理邮 ...

  8. 高级软件工程师必备的五大技能

    具备什么样的素质的人才能成为一名高级软件工程师?作为高级软件工程师,你不仅要具备娴熟的技能,更重要的,还要具备与人合作的能力.只有能够领导和提升他人的软件工程师,才是真正的高级软件工程师.Israel ...

  9. 转:高级软件工程师成长秘诀(文末有笔者自己的小评论)

    作者:Neil Kakkar 译者 | 张健欣 身为软件工程师,你要如何进一步成长? 2018 年的时候,我开始在彭博社(Bloomberg)工作.从那之后,事情发生了很大变化.我不再是公司里最初级的 ...

  10. Sun Java 国际认证考试流程表

    在当今信息高速发展的社会中,"人才"决定了企业发展.因此,如何评估员工的价值,或是个人如何证明自己的专业能力,就成为关键.Sun公司为了为业界建立一套认证的标准,特别针对最先进的科 ...

最新文章

  1. 查找Windows文件来历的好方法
  2. you're probably running inside a thread without first calling pythoncom.CoInitialize
  3. linux 脚本详解,shell脚本分析日志
  4. 架构师之路(2)---详解面向过程 王泽宾
  5. SAP云平台和第三方CRM解决方案(火锅)互联
  6. mysql的程序怎么升级成mysqli_如何将mysql更改为mysqli?-问答-阿里云开发者社区-阿里云...
  7. 如何把一个运行完好的Kafka搞崩
  8. 生产常见问题及解决方案与深度分析
  9. 人脸识别测试图片_人脸识别或将到达瓶颈,有监督的聚类算法探索新思路
  10. Ubuntu查看联想笔记本无线网卡内核并安装驱动
  11. php毕业综合实践报告范文,php毕业实习报告
  12. Ubuntu系统如何连接WiFi
  13. 好友返利网站开发 二
  14. 64位CPU,64位操作系统,和64位应用程序三者之间的关系
  15. contents()与children()的用法和区别
  16. 电脑赚钱兼职平台有哪些?分享几个正规靠谱的平台
  17. 工作流之待办事宜消息提醒篇
  18. Windows Server2016 安装升级补丁更新
  19. 学习总结-《父与子的编程之旅》chapter 14
  20. 大智慧c语言编程,大智慧分析家 c语言 编程接口

热门文章

  1. 华为鸿蒙如何添加桌面小组件,万能小组件添加至桌面怎么弄?桌面添加应用方法图文详解...
  2. ACPYPE中FAILED: [Errno 2] No such file or directory: 'FFF_AC.prmtop'的解决方法
  3. allegro16.6导出版图到ADS2019仿真的方法
  4. 韩版马化腾:在大财阀围堵下仍白手起家的凤凰男,抢滩加密交易平台、公链赛道...
  5. 内存管理之页转换 virt_to_page
  6. 羊哥推荐的Java后端开发书籍
  7. python中xlrd模块的用法_用xlrd模块读取合并单元格(merged cell)
  8. laravel excel 导出图片
  9. linux中括号命令,Linux中的括号用法
  10. linux统计文件大小大于100k,Centos / Linux设置logrotate为所有日志的最大文件大小