1、项目需求
通过调用第三方接口查询相关信息,并按指定格式展示
2、开发
整体排版其实按照提供SDK开发就行,较为简单。其中有一点是测试了半天,就是针对动态显示的内容,这个地方需要使用动态区域,然后针对设定的动态区域进行内容更新。比如上面的装车物料、层数、袋数等内容,这些都是一直查询接口然后实时更新的。最初使用字母,然后整体更新节目,这种会刷新整体,屏幕内容更新的时候就会一闪一闪的,用动态区域可以解决。
public static void showLoadingInfo() throws Exception {
// 初始化API,此操作只在程序启动时候执行一次,多次执行会出现内存错误
Y2Env.initial();
Y2Screen screen = new Y2Screen(url);
boolean result = screen.login("guest", "guest");
log.warn("login result:" + result);
// 创建节目
ProgramPlayFile pf = new ProgramPlayFile(1);
// 创建一个字幕区1
MarqueeArea marea1 = new MarqueeArea(20, 0, 256, 22);
// 区域1字幕内容
marea1.addContent("无锡中粮工程科技有限公司");
// 创建一个字幕区2
MarqueeArea marea2 = new MarqueeArea(20, 22, 176, 22);
marea2.addContent(laneNo + "车道 车牌号:");
MarqueeArea marea3 = new MarqueeArea(20, 44, 176, 22);
marea3.addContent("当前装车物料:");
// 创建一个字幕区3
MarqueeArea marea4 = new MarqueeArea(20, 66, 156, 22);
marea4.addContent("当前装车层数: ");
// 创建一个字幕区4
MarqueeArea marea5 = new MarqueeArea(20, 88, 156, 22);
marea5.addContent("当前装车袋数: ");
// 时钟区域
DateTimeArea timeArea = new DateTimeArea(20, 106, 256, 18);
timeArea.horizontalAlignment(AlignmentType.NEAR);
DateTimePattern[] arr = {DateTimePattern.CH_YYYY_MM_DD, DateTimePattern.CH_HH_MM_SS, DateTimePattern.CH_WEEK};
timeArea.addUnits(arr).fgColor(Color.red).getFont().setSize(13);
// 将字幕区添加到节目中
pf.getAreas().add(marea1);
pf.getAreas().add(marea2);
pf.getAreas().add(marea3);
pf.getAreas().add(marea4);
pf.getAreas().add(marea5);
pf.getAreas().add(timeArea);
// 创建节目列表
// 多个节目可以在列表中同时添加,用“,”隔开
String list = screen.writePlaylist(pf);
// 更新节目
screen.play(list);
Y2DynamicManager dynamicManager = screen.dynamic();
DynamicPlayFile dynFile = new DynamicPlayFile();
// 车牌号区域
DynamicArea vehicleArea = dynFile.createArea(136, 22, 100, 20,0);
DynamicArea layerArea = dynFile.createArea(126, 66, 100, 20, 1);
DynamicArea amountArea = dynFile.createArea(126, 88, 100, 20, 2);
DynamicArea materialArea = dynFile.createArea(136, 44, 100, 20,3);
DynamicAreaTextUnit vehicleUnit = vehicleArea.addText("暂无车辆");
vehicleUnit.setAnimationType(2);
DynamicAreaTextUnit layerUnit = layerArea.addText("0");
layerUnit.animationType(2);
DynamicAreaTextUnit amountUnit = amountArea.addText("0");
amountUnit.animationType(2);
DynamicAreaTextUnit materialUnit = materialArea.addText("");
materialUnit.animationType(2);
dynamicManager.write(dynFile);
while (true) {
// 获取装车信息
Response response = null;
try {
response = getLoadingResponse();
// log.info("装车信息:" + response.getResult());
} catch (Exception e) {
log.error("获取装车信息失败", e);
}
// 110-取消装车
if (Objects.isNull(response) || response.getCode() == 110) {
continue;
}
// 装车信息
LoadingResult loadingInfo = response.getResult();
int aimAmount = loadingInfo.getAimAmount();
int amount = OptionalInt.of(loadingInfo.getAmount()).orElse(0);
String vehicleLicenseNo = loadingInfo.getVehicleLicenseNo();
int layer = loadingInfo.getLayer();
String materialName = loadingInfo.getMaterialName();
vehicleArea.getUnits().clear();
vehicleUnit = vehicleArea.addText(vehicleLicenseNo);
vehicleUnit.setAnimationType(2);
materialArea.getUnits().clear();
materialUnit = materialArea.addText(materialName);
materialUnit.setAnimationType(2);
// 301-装车中
if (response.getCode() == 301 && amount != aimAmount) {
layerArea.getUnits().clear();
layerUnit = layerArea.addText(String.valueOf(layer));
layerUnit.animationType(2);
}
// 更新动态区信息
amountArea.getUnits().clear();
amountUnit = amountArea.addText(amount + "/" + aimAmount);
amountUnit.animationType(2);
dynamicManager.write(dynFile);
}
}
3、开发收获
本次开发其实还是相对简单的,但是最后打包的时候折腾了很久,首先是之前一直使用Springboot开发,引入包和打包都很方便。但是本次的二开是普通的java项目,其中的包都是厂商提供好的,起初是把项目变成maven项目,然后在resources文件夹下,新建了一个lib目录,然后在网上尝试了很多种配置方式进行打包,都不成功,要么就是打包了个空文件,要么就是打包时报错说找不到引入的jar包中的类,要么就是打包成功,也有内容,但是一运行就报错。最后没办法,只能手动先把这些第三方jar包安装到本地maven库中,然后再一一在pom.xml文件中进行引入,最后打包才成功。
将jar包安装到本地maven库,其中^是换行用的,因为在cmd窗口执行这一段,要是一行会因为格式问题无法安装成功。
其中-Dfile: 是jar包所在的文件地址
-DgroupId: 可自行定义,dependency中对应的groupId
-DaetifactId: 同上
-Dversion: 同上
mvn install:install-file ^
-Dfile="D:\play\weifang_screen\src\main\resources\lib\y2-message-0.2.0-SNAPSHOT.jar" ^
-DgroupId=com.screen ^
-DartifactId=y2-message ^
-Dversion=1.0 ^
-Dpackaging=jar
本次还有针对读取配置文件的一个开发,目的是在整个项目打包成jar之后,可以额外的进行配置文件信息配置,如果没有,就默认使用jar包中的配置文件。代码如下:
Properties prop = new Properties();
// 获取当前工作目录
String workingDir = new File("").getAbsolutePath();
//CONFIG_FILE_NAME:配置文件名字
File propertiesFile = new File(workingDir, CONFIG_FILE_NAME);
// 如果配置文件存在,则使用配置文件,否则使用默认配置文件
if (propertiesFile.exists()) {
try (FileInputStream fileInputStream = new FileInputStream(propertiesFile)) {
InputStreamReader reader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
prop.load(reader);
} catch (IOException e) {
log.error("加载配置文件失败", e);
}
} else {
try (InputStream is = MainScreen.class.getClassLoader().getResourceAsStream(CONFIG_FILE_NAME)) {
InputStreamReader reader = new InputStreamReader(is, StandardCharsets.UTF_8);
prop.load(reader);
} catch (IOException e) {
log.error("加载内部配置文件失败", e);
}
}