我这里串口使用的是jSerialComm,JDK版本是17,使用的是Maven。麒麟系统为DeBian版
一、环境准备
1.1 麒麟v10系统配置
# 安装基础依赖
sudo apt update sudo apt install -y build-essential unzip # 查看CPU架构(x86_64或aarch64) uname -m # 安装JDK17(若系统未预装)
使用OpenJDK(推荐)
# 通过apt直接安装(自动匹配架构) sudo apt update sudo apt install -y openjdk-17-jdk # 验证安装 java -version
# 配置环境变量(添加到/etc/profile末尾) # 查找JDK安装路径 sudo update-alternatives --config java # 示例输出: /usr/lib/jvm/jdk-17-oracle-x64/bin/java # 编辑环境变量文件 sudo nano /etc/profile # 在文件末尾添加(路径根据实际修改): export JAVA_HOME=/usr/lib/jvm/jdk-17-oracle-x64 export PATH=$JAVA_HOME/bin:$PATH # 使配置生效 source /etc/profile # 验证安装 java -version
1.2 串口权限配置
# 查看串口设备 ls -l /dev/ttyS* # 将用户加入dialout组 sudo usermod -aG dialout $USER # 或直接修改设备权限(临时生效) sudo chmod 666 /dev/ttyS0 # 重启生效 reboot
二、项目打包
2.1 修改pom.xml(增加Linux打包支持)
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> <!-- 增加可执行权限 --> <classifier>exec</classifier> <!-- 生成带依赖的包 --> </configuration> </plugin> </plugins> </build>
2.2 在IDEA中打包
mvn clean package -DskipTests # 生成的包路径:target/ck-0.0.1-SNAPSHOT-exec.jar
三、部署到麒麟系统
3.1 传输文件
# 使用scp传输(示例) scp target/ck-0.0.1-SNAPSHOT-exec.jar user@kylin-v10:/opt/app/
这里如果要将 Windows 系统中的打包文件部署到另一台麒麟系统电脑:
需要使用scp命令:
- 打开 Windows 的 PowerShell(以管理员权限运行)。如果系统没有安装 OpenSSH,需要先安装 OpenSSH 才能使用
scp
命令。 - 确保麒麟系统电脑的 SSH 服务已经开启,并且防火墙允许 SSH 通信。可以在麒麟系统电脑上执行
sudo systemctl enable --now sshd
来开启 SSH 服务,执行sudo firewall-cmd --add-service=ssh --permanent
并sudo firewall-cmd --reload
来配置防火墙允许 SSH 通信2。 (如果执行执行sudo systemctl enable --now sshd报错
Failed to enable unit: Unit file sshd.service doesnot exist.
可知,系统里不存在sshd.service
这个单元文件,这往往是因为 OpenSSH 服务器未安装。基于 Debian 或 Ubuntu 的系统
在终端执行以下命令来安装 OpenSSH 服务器:sudo apt update
sudo apt install openssh-server安装完成后,启用并启动 SSH 服务
sudo systemctl enable --now ssh
) - 如果开启失败:
你可以通过以下命令列出所有和 SSH 相关的单元文件:sudo systemctl list-units --type=service | grep ssh
此命令会列出所有正在运行的 SSH 相关服务。你要留意其中类似
sshd.service
或者ssh.service
这样的服务名。如果你发现正确的单元文件名是
ssh.service
,那么可以使用下面的命令来启用并启动 SSH 服务:sudo systemctl enable --now ssh.service -
在 Debian 系统中使用
ufw
(Uncomplicated Firewall)来实现允许 SSH 通信,可参考以下步骤:允许 SSH 端口通过防火墙:
通常 SSH 服务使用 22 端口,执行以下命令允许 22 端口的流量通过防火墙:sudo ufw allow 22/tcp 。如果你的 SSH 服务使用了非默认端口,将上述命令中的22
替换为你实际使用的端口号。重新加载防火墙规则:执行以下命令使新的规则生效:sudo ufw reload - 确定麒麟系统电脑的 IP 地址或主机名,以及登录用户名。
- 在 PowerShell 中执行
scp
命令,格式为scp -r 本地文件路径 用户名@麒麟系统电脑IP地址:远程目标路径
。例如scp -r D:\code\ck\target\ck-0.0.1-SNAPSHOT-exec.jar user@kylin-v10:/opt/app/
,将本地的ck-0.0.1-SNAPSHOT-exec.jar
文件传输到麒麟系统电脑的/opt/app/
目录下。 - 输入麒麟系统电脑上
user
用户的密码,即可开始传输文件。
这里需要将 user
替换为远程服务器的实际用户名,将 kylin-v10
替换为远程服务器的实际主机名或 IP 地址。
出现 C:\WINDOWS\System32\OpenSSH\scp.exe: dest open "/opt/app/": Failure
错误提示,是因为目标路径/opt/app/
的权限设置不允许当前用户写入。可以尝试以下解决方法:
- 使用临时目录中转:
- 先将文件传输到具有写入权限的临时目录,如
/tmp
。命令为scp -r D:\code\ck\target\ck-0.0.1-SNAPSHOT-exec.jar tytdc@192.168.18.182:/tmp
。 - 登录到麒麟系统电脑,使用
mv
命令将文件从/tmp
目录移动到/opt/app/
目录,前提是你有对/opt/app/
目录执行mv
操作的权限。
- 先将文件传输到具有写入权限的临时目录,如
- 修改目标目录权限:以管理员身份登录麒麟系统电脑,执行以下命令修改
/opt/app/
目录的权限,使其允许tytdc
用户写入。sudo chown -R tytdc /opt/app
:将/opt/app/
目录及其所有子文件和子目录的所有者更改为tytdc
。sudo chmod -R 755 /opt/app
:为/opt/app/
目录及其所有子文件和子目录设置权限,使所有者具有读、写和执行权限,组用户和其他用户具有读和执行权限。
如果 /opt/app
这个目录不存在。你可以按照以下步骤来解决这个问题:
-
确认目录是否存在:在麒麟系统的终端中,使用
ls /opt
命令查看/opt
目录下的内容,确认是否真的没有app
目录。 -
创建目录:如果
app
目录确实不存在,你可以使用sudo mkdir /opt/app
命令来创建它。这条命令使用sudo
以管理员权限运行,mkdir
是创建目录的命令,/opt/app
是要创建的目录路径。 -
设置目录权限:创建好目录后,再执行
sudo chown -R tytdc /opt/app
命令,将目录的所有者设置为tytdc
用户。然后执行sudo chmod -R 755 /opt/app
命令,设置目录的权限,使其可被读写执行。 -
重新传输文件:完成上述步骤后,回到 Windows 的 PowerShell 中,再次执行
scp -r D:\code\ck\target\ck-0.0.1-SNAPSHOT-exec.jar tytdc@192.168.18.182:/opt/app/
命令,尝试将文件传输到新创建的目录中。
按照这些步骤操作后,应该可以解决无法访问目录的问题,并成功传输文件。
3.2 创建服务管理文件
1. 登录麒麟系统
使用具备管理员权限的用户(通常是通过 sudo
执行命令)登录到麒麟系统的终端。可以通过物理终端登录,也可以使用 SSH 从其他设备远程登录,例如在 Windows 上使用 PuTTY 或在 Linux/macOS 上使用 ssh
命令:
ssh tytdc@192.168.18.182
然后输入密码完成登录。
2. 创建并编辑服务文件
使用文本编辑器(如 vim
或 nano
)创建并编辑 /etc/systemd/system/serial-app.service
文件。这里以 vim
为例:
sudo vim /etc/systemd/system/serial-app.service
输入上述命令后,会提示你输入当前用户的密码。输入密码后,按回车键,vim
编辑器会打开一个空白文件。在 vim
中,按 i
键进入插入模式,然后将以下内容复制粘贴到文件中:
[Unit]
Description=Serial Port Application
After=syslog.target network.target
[Service]
User=appuser
Group=dialout
WorkingDirectory=/opt/app
ExecStart=/usr/bin/java -jar /opt/app/ck-0.0.1-SNAPSHOT-exec.jar
SuccessExitStatus=143
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
3. 保存并退出编辑器
在 vim
中,按 Esc
键退出插入模式,然后输入 :wq
并按回车键,这表示保存文件并退出 vim
编辑器。
4. 重新加载系统服务配置
创建或修改服务文件后,需要重新加载 systemd
的管理器配置,使新的服务文件生效:
sudo systemctl daemon-reload
5. 启动并设置服务开机自启
使用以下命令启动服务:
sudo systemctl start serial-app.service
使用以下命令设置服务开机自启:
sudo systemctl enable serial-app.service
通过以上步骤,你就在麒麟系统上成功创建并启动了 serial-app
服务。
# 查看日志 journalctl -u serial-app -f
如果之前部署过,需要先执行以下步骤:
1. 停止相关服务
在删除服务配置文件之前,你需要先停止由该文件定义的服务,以避免服务在运行过程中出现异常。你可以使用以下命令停止服务:
sudo systemctl stop serial-app.service
执行该命令后,系统会尝试停止 serial-app
服务。
2. 禁用服务开机自启
为了防止系统在下次启动时尝试启动该服务,你需要禁用该服务的开机自启。可以使用以下命令:
sudo systemctl disable serial-app.service
3. 删除服务配置文件
使用 rm
命令删除 /etc/systemd/system/serial-app.service
文件:
sudo rm /etc/systemd/system/serial-app.service
执行该命令后,系统会提示你输入管理员密码,输入正确密码后,文件将被删除。
4. 重新加载 systemd 管理器配置
删除服务配置文件后,你需要重新加载 systemd
管理器的配置,以确保系统不再识别该服务。可以使用以下命令:
sudo systemctl daemon-reload
注意事项
四、验证调试
4.1 检查串口通信
# 查看串口设备识别 dmesg | grep tty # 使用minicom测试串口 sudo yum install minicom minicom -D /dev/ttyS0 -b 9600
4.2 应用调试技巧
# 临时前台运行(查看实时日志) java -jar ck-0.0.1-SNAPSHOT-exec.jar \ --server.port=8080 \ --logging.level.com.example=DEBUG # 检查jSerialComm加载 -Djserialcomm.lib.path=/usr/lib/jni/ # 指定本地库路径
五、常见问题解决
5.1 串口无法打开
Error opening serial port: /dev/ttyS0 (error code: -1)
解决方案:
sudo chmod 666 /dev/ttyS0 sudo setenforce 0 # 临时关闭SELinux
5.2 缺少本地库
UnsatisfiedLinkError: no jSerialComm in java.library.path
解决方法:
# 查找本地库位置 find / -name "libjSerialComm.so" # 设置JVM参数 java -Djava.library.path=/usr/lib/jni/ -jar your-app.jar