目录
- 第一部分:软件机器人 - 控制鼠标和键盘
- 场景:自动化测试、GUI自动化、游戏辅助等。
- 核心技术:Java AWT
Robot类。
- 第二部分:硬件机器人 - 通过串口控制 Arduino
- 场景:控制物理世界的机器人,如小车、机械臂。
- 核心技术:Java 串口通信 (
jSerialComm库)。
- 第三部分:高级硬件机器人 - 通过网络控制
- 场景:更复杂的机器人,通常搭载 Raspberry Pi 等单板计算机。
- 核心技术:Java Socket 编程。
- 总结与建议
第一部分:软件机器人 - 控制鼠标和键盘
Java 自带的 java.awt.Robot 类可以创建一个“机器人”对象,用于模拟用户的鼠标和键盘输入,这对于自动化重复性任务非常有用。

(图片来源网络,侵删)
核心概念
Robot类:创建一个本地屏幕的图形化测试工具。- 鼠标控制:
mouseMove(x, y): 移动鼠标到指定屏幕坐标。mousePress(button): 模拟按下鼠标按键(InputEvent.BUTTON1_DOWN_MASK左键,BUTTON2_DOWN_MASK中键,BUTTON3_DOWN_MASK右键)。mouseRelease(button): 模拟释放鼠标按键。mouseWheel(rotation): 模拟滚动鼠标滚轮。
- 键盘控制:
keyPress(keycode): 模拟按下某个键。keyRelease(keycode): 模拟释放某个键。- 注意:需要使用
java.awt.event.KeyEvent中的常量,如KeyEvent.VK_A,KeyEvent.VK_ENTER,KeyEvent.VK_CONTROL。
示例代码:让机器人自动打开记事本并输入 "Hello, Robot!"
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.IOException;
public class SoftwareRobotExample {
public static void main(String[] args) {
try {
// 1. 创建 Robot 实例
Robot robot = new Robot();
// 2. 模拟按下 Win + R 键打开“运行”对话框
robot.keyPress(KeyEvent.VK_WINDOWS);
robot.keyPress(KeyEvent.VK_R);
robot.keyRelease(KeyEvent.VK_R);
robot.keyRelease(KeyEvent.VK_WINDOWS);
// 等待一下,让“运行”对话框出现
robot.delay(500); // 延迟 500 毫秒
// 3. 输入 "notepad" 并回车
typeString(robot, "notepad");
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
// 等待记事本程序启动
robot.delay(1500);
// 4. 输入文本 "Hello, Robot!"
typeString(robot, "Hello, Robot!");
} catch (AWTException e) {
e.printStackTrace();
}
}
/**
* 一个辅助方法,用于输入字符串
* @param robot Robot 实例
* @param text 要输入的文本
*/
private static void typeString(Robot robot, String text) {
for (char c : text.toCharArray()) {
int keyCode = KeyEvent.getExtendedKeyCodeForChar(c);
// 对于无法直接映射的字符(如中文),需要特殊处理,这里只处理英文字符
if (keyCode != KeyEvent.VK_UNDEFINED) {
robot.keyPress(keyCode);
robot.keyRelease(keyCode);
}
// 在字符之间加一个短延迟,模拟人类输入
robot.delay(100);
}
}
}
如何运行:直接运行这个 Java 程序,你会看到屏幕自动打开记事本并输入文字。
第二部分:硬件机器人 - 通过串口控制 Arduino
这是物理世界中最常见的控制方式,Java 运行在电脑上,通过 USB 端口向 Arduino 发送指令,Arduino 接收指令并控制电机、LED 等硬件。
核心概念
- Arduino:一个微控制器,可以直接与传感器和执行器(如电机、舵机)交互,它运行简单的 C/C++ 代码(称为 "Sketch")。
- 串口通信:Java 和 Arduino 通过虚拟的 COM 端口进行通信,Java 发送字符串指令,Arduino 解析这些指令并执行相应操作。
- Java 库:Java 本身没有直接操作串口的库,需要借助第三方库。
jSerialComm是一个非常好用且跨平台的库。
硬件准备
- 一台电脑
- 一个 Arduino 开发板(如 Arduino Uno)
- 一个或两个 LED(带限流电阻,220Ω-1kΩ)
- 杜邦线若干
Arduino 代码 (Sketch)
将以下代码上传到你的 Arduino,它会监听串口,如果收到 "ON",就点亮 LED;收到 "OFF",就熄灭 LED。
// 定义连接 LED 的引脚
const int ledPin = 13; // 大多数 Arduino 板载 LED 在 13 号引脚
void setup() {
// 初始化串口通信,波特率设置为 9600
Serial.begin(9600);
// 设置 LED 引脚为输出模式
pinMode(ledPin, OUTPUT);
// 初始状态,关闭 LED
digitalWrite(ledPin, LOW);
Serial.println("Arduino is ready. Send 'ON' or 'OFF'.");
}
void loop() {
// 检查串口是否有数据可读
if (Serial.available() > 0) {
// 读取串口传入的数据,直到遇到换行符
String command = Serial.readStringUntil('\n');
// 去除命令两端的空白字符
command.trim();
// 根据收到的命令执行操作
if (command.equals("ON")) {
digitalWrite(ledPin, HIGH);
Serial.println("LED is ON.");
} else if (command.equals("OFF")) {
digitalWrite(ledPin, LOW);
Serial.println("LED is OFF.");
}
}
}
Java 代码 (使用 jSerialComm)
你需要添加 jSerialComm 库到你的项目中。

(图片来源网络,侵删)
- Maven:
<dependency> <groupId>com.fazecast</groupId> <artifactId>jSerialComm</artifactId> <version>2.10.5</version> </dependency> - Gradle:
implementation 'com.fazecast:jSerialComm:2.10.5'
- 手动下载: 从 GitHub Releases 页面下载 JAR 文件,并添加到你的项目路径中。
import com.fazecast.jSerialComm.*;
public class HardwareRobotArduino {
public static void main(String[] args) {
// 1. 查找连接到电脑的 Arduino 串口
// Arduino 通常的串口名格式为 "COMx" (Windows) 或 "/dev/tty.usbmodem..." (macOS/Linux)
SerialPort[] ports = SerialPort.getCommPorts();
SerialPort arduinoPort = null;
for (SerialPort port : ports) {
System.out.println("Found port: " + port.getDescriptivePortName());
// 你可以根据描述或系统名称来识别 Arduino
// 查找 "Arduino" 或 "USB-SERIAL" 字样
if (port.getDescriptivePortName().contains("Arduino") || port.getSystemPortName().startsWith("COM")) {
arduinoPort = port;
break;
}
}
if (arduinoPort == null) {
System.err.println("Arduino port not found. Exiting.");
return;
}
System.out.println("Using port: " + arduinoPort.getSystemPortName());
// 2. 打开串口
if (!arduinoPort.openPort()) {
System.err.println("Failed to open port. Exiting.");
return;
}
// 3. 配置串口参数
arduinoPort.setBaudRate(9600);
arduinoPort.setNumDataBits(8);
arduinoPort.setNumStopBits(1);
arduinoPort.setParity(SerialPort.NO_PARITY);
// 4. 发送指令
try {
System.out.println("Sending commands...");
// 发送 "ON" 指令
arduinoPort.setComPortTimeouts(SerialPort.TIMEOUT_WRITE_BLOCKING, 0, 0);
arduinoPort.writeBytes("ON\n".getBytes(), "ON\n".getBytes().length);
System.out.println("Sent: ON");
Thread.sleep(2000); // 等待 2 秒
// 发送 "OFF" 指令
arduinoPort.writeBytes("OFF\n".getBytes(), "OFF\n".getBytes().length);
System.out.println("Sent: OFF");
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 5. 关闭串口
arduinoPort.closePort();
System.out.println("Port closed.");
}
}
}
如何运行:
- 上传 Arduino 代码到板子。
- 将 Arduino 通过 USB 连接到电脑。
- 运行 Java 程序,你应该会看到 Arduino 上的 LED 闪烁。
第三部分:高级硬件机器人 - 通过网络控制
对于更复杂的机器人(如带摄像头、WiFi 的机器人),通常会在机器人上运行一个单板计算机(如 Raspberry Pi),Java 程序运行在电脑上,通过局域网(TCP/IP Socket)向树莓派发送指令。
核心概念
- 服务器端 (机器人端 - Raspberry Pi):运行一个 Java 程序,监听来自网络的连接,接收指令并控制硬件。
- 客户端 (控制端 - 你的电脑):运行另一个 Java 程序,连接到服务器,发送指令(如 "FORWARD", "BACKWARD")。
- Socket 编程:Java 使用
java.net.ServerSocket和java.net.Socket来实现网络通信。
服务器端代码 (运行在 Raspberry Pi 上)
import java.io.*;
import java.net.*;
public class RobotServer {
public static void main(String[] args) throws IOException {
int port = 12345;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Robot server is listening on port " + port);
// 这里只是一个示例,实际控制硬件的逻辑需要替换
// 调用 GPIO 库来控制电机
void moveRobot(String command) {
System.out.println("Executing command: " + command);
// ... 你的硬件控制代码 ...
if (command.equals("FORWARD")) {
// 电机前进逻辑
} else if (command.equals("STOP")) {
// 电机停止逻辑
}
}
while (true) {
try (Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {
System.out.println("Client connected: " + clientSocket.getInetAddress());
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received from client: " + inputLine);
moveRobot(inputLine); // 执行收到的指令
}
} catch (IOException e) {
System.out.println("Exception in client handler: " + e.getMessage());
}
}
}
}
客户端代码 (运行在你的电脑上)
import java.io.*;
import java.net.*;
public class RobotClient {
public static void main(String[] args) {
String host = "192.168.1.100"; // 替换为你的树莓派 IP 地址
int port = 12345;
try (Socket socket = new Socket(host, port);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
System.out.println("Connected to robot server.");
// 发送一系列指令
String[] commands = {"FORWARD", "FORWARD", "STOP", "BACKWARD", "STOP"};
for (String cmd : commands) {
out.println(cmd);
System.out.println("Sent: " + cmd);
Thread.sleep(2000); // 每个指令间隔 2 秒
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host " + host);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to " +
host);
System.exit(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
总结与建议
| 控制方式 | 适用场景 | 优点 | 缺点 | 核心技术 |
|---|---|---|---|---|
| 软件 Robot | GUI自动化、测试、键盘鼠标脚本 | 无需额外硬件,简单易用 | 只能控制软件,无法与物理世界交互 | java.awt.Robot |
| 串口控制 | 直接连接 Arduino、传感器、简单电机 | 实时性好,延迟低,控制精确 | 需要 Arduino,物理接线,距离受限 | jSerialComm 库 |
| 网络控制 | 复杂机器人、远程控制、多客户端 | 距离远(局域网/广域网),可扩展性好 | 需要服务器(如树莓派),网络延迟可能影响实时性 | java.net.Socket |
如何选择?
- 如果你只是想在电脑上自动做点事:用 第一部分。
- 如果你想亲手搭建一个物理机器人,让它动起来:从 第二部分 开始,这是机器人入门的最佳路径。
- 如果你想做一个更酷、更复杂的机器人,比如可以远程遥控或能看能听:学习 第二部分 后,再挑战 第三部分。
希望这个详细的指南能帮助你开启 Java 控制机器人的旅程!

(图片来源网络,侵删)
标签: Java机器人控制代码实现 Java编程实现机器人控制方法 Java开发机器人控制技术方案
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。