在 Linux 上从 Java 访问 PC 硬件端口

Posted

技术标签:

【中文标题】在 Linux 上从 Java 访问 PC 硬件端口【英文标题】:PC hardware port access from Java on Linux 【发布时间】:2012-02-14 01:53:22 【问题描述】:

什么是 Java-on-Linux 等价于 C 字节大小的 PC 架构硬件端口输入/输出功能?

对于输出,outb 如下所示:

tmp = inb(0x61);
if (tmp != (tmp | 0x01)) 
    outb(0x61, tmp | 0x01);

对于输入,inb 如下所示:

tmp = (inb(0x61) & 0xfe);
outb(0x61, tmp);

目的:我想实现比这更少开销的东西:

try  Runtime.getRuntime().exec("beep")  catch (IOException e) 

作为将代码 7(bell char)发送到标准输出的替代方法,因为这似乎已在 Ubuntu 中被积极禁用。 Toolkit 的嘟嘟声也是静音。

【问题讨论】:

在 Linux 中,一切都是文件。 您可以在 Linux 上运行 C(显然),这证明并非所有 Linux I/O 都是面向文件的。 不! Kangkan 建议您打开一些设备文件,例如/dev/tty0/dev/lp0。另见***.com/a/8923009/841108 和easysw.com/~mike/serial 如果您需要确切的功能,请使用 jni - 编写一个小型 C 函数,将其构建到共享库中,加载并调用它。 【参考方案1】:

我认为你搭错了火车。

Java 是一种面向对象的高级语言,可编译为虚拟机架构。汇编器 I/O 指令是特定于硬件处理器的。两者之间没有直接的等价关系。

您所希望的最好的结果是将您的 Java 代码(使用管道、共享内存、套接字等)与执行所需 I/O 的本机 Linux 应用程序接口。

【讨论】:

更新:我的目的已经被描述了。 所以您的实际问题是:“如何从 Java 创建系统蜂鸣声?”这似乎是一个与“Linux 上 Java 访问 PC 硬件端口”截然不同的问题。 仍然是我需要的 I/O,因为尝试以任何其他方式发出声音是在浪费大量时间。而且我尝试了很多。示例代码不是汇编程序:它是与处理器无关的代码。 任何涉及 inb()/outb() 的东西都与处理器无关。 I/O 操作是 x86 独有的。 有些 C 编译器不是 x86 的,所以一定有 inb() 和 outb() 是非 x86 的。

以上是关于在 Linux 上从 Java 访问 PC 硬件端口的主要内容,如果未能解决你的问题,请参考以下文章

java后台如何判断是移动端还是pc端的访问请求

第五章

第三次任务分配

第五章

java服务器端获取用户访问的URL/用户IP/PC还是移动端

在嵌入式系统上从 DOS 切换到 Linux