記錄一下從零開始開發一個Windows和Linux通用的HID和USB串口的JAVA應用DEMO,實現簡單的連接,收發數據。
開發工具:IDEA,自行查詢下載安裝步驟,我安裝的版本是2018.3,參考網上教程第一次使用,怕界面不一致所以安裝舊點的。
一、HID庫
HID庫源碼:https://hub.連接.台灣/signal11/hidapi,需要下載源碼編譯自定義的java native接口的庫。
1.編譯Windows下的dll:
參考庫的readme.txt可以先在windows的VS上編譯dll,需要添加依賴庫setupapi.lib,測試通訊是否正常,最后編譯的時候最好選擇屬性/C++/代碼生成為MT或者MTD減少依賴的動態庫。用java jni native windows關鍵詞查詢window jni使用教程,編譯dll,在java層調用測試。
比如:https://www.cnblogs.com/sysu-huangwei/p/7466481.html
2.編譯Linux下的so:
Linux端同理,需要依賴libudev,沒有的話需要先安裝。源碼使用linux/hid.c,編譯生成so。在Linux上進行測試,可以用javac指令編譯生成class文件,運行測試。運行的時候如果找不到類可能需要加上包名:java 包名.類名。
根據以上步驟,在Windows和Linux端都成功編譯生成了庫,並且測試可以正常收發數據,剩下的就是應用界面開發以及調用庫接口就可以了。
二、USB串口庫
USB串口庫:http://rxtx.qbang.org/wiki/index.php/Download
串口庫使用可參考:https://blog.csdn.net/kong_gu_you_lan/article/details/52302075
我使用的版本是rxtx-2.2pre2-bins,解壓后將RXTXcomm.jar和rxtxSerial.dll移動到IDEA工程目錄的libs目錄下,沒有就新建一個,編譯的HID庫也移動到此目錄下,在IDEA設置中添加依賴庫路徑,即libs的路徑。
rxtx-2.2pre2-bins版本有個坑,在Linux下,枚舉不到ttyACM0串口,參考https://bugs.launchpad.net/ubuntu/+source/rxtx/+bug/367833,需要添加
if(System.getProperty("os.name").toLowerCase().contains("linux"))
System.setProperty("gnu.io.rxtx.SerialPorts", "/dev/ttyACM0")
再獲取系統的所有串口,不限制在Linux下會影響Windows下枚舉串口。
導入jar包:
轉載請注明出處:https://www.cnblogs.com/linguinost/p/15922914.html
三、IDEA新建工程:
1.新建工程教程:https://www.jianshu.com/p/cdca9a30b86b
用到的組件有JButton(按鈕)、JTextArea(不帶拖動條)、TextArea(自帶拖動條)、JLabel(說明,配合JTextField使用)、JTextField(輸入文本框)、JComboBox(多選框)。
布局使用固定布局,setLayout(null),使用setBounds標記位置和長寬,使用addActionListener實現按鈕點擊后的操作,最后完成的界面如下:
2.打包生成可運行jar:
file - project structure
需要注意META-INF文件夾路徑,選錯可能生成的jar沒有編進全部java文件,可以解壓查看jar是否編譯正常。
新建lib目錄,右鍵將依賴的串口jar添加進去:
打包生成jar,將dll庫以及串口jar復制到打包生成的jar所在文件夾的lib內,運行.bat測試:
bat內容,將當前lib文件夾臨時加入環境變量,運行jar:
@echo off
set PwdPath=%~dp0\lib
echo %PwdPath%
set PATH=%PATH%;%PwdPath%
java -jar xxx.jar
pause
也可以直接把動態庫復制到C:\Windows\System32(Windows)或/usr/lib(Linux),運行java -jar xxx.jar。Linux環境下可能需要root權限,我在ubuntu虛擬機測試,沒有root權限不能連接HID或者USB串口。