YZProjectCloud/yanzhu-modules/yanzhu-led/docs/五代六代控制卡Java二次开发说明.md

269 lines
11 KiB
Markdown
Raw Permalink Normal View History

2026-01-04 15:32:09 +08:00
---
title: 五代六代控制卡Java二次开发开发说明
tags: 二次开发,说明,五代六代控制卡,Java
grammar_cjkRuby: true
---
# 1.开发前必读
## 1.1 控制器型号选择
本说明只适用于BX系列五代六代控制卡不包括字库卡例如BX-5E1、BX-5M1、BX-6E1X等其中BX-5E1、BX-5E2、BX-5E3支持动态区4个BX-6E1、BX-6E2、BX-6E1X、BX-6E2X、BX-6Q系列支持动态区32个
## 1.2 关于动态区
根据存储介质的不同我们将控制器上现实的内容分为两类普通节目数据存储在flash中和动态区数据存储在ram中。普通节目可以包括各种区域时间区、传感器区、图文区等。
普通节目会被存储在控制器的flash中其内容掉电不丢失但是因为flash存储器擦写寿命只有十万次所以其不能用于更新频率很高的场合例如停车场车位信息外部传感器状态的实时更新车次状态的实时更新等。
动态区完全独立于普通节目其内容可以按区域进行单独更新它可以与普通节目一起播放也可以单独播放它最大的特点是内容存储在ram中没有擦写次数限制内容掉电不保存通常用于信息更新频繁场合。
## 1.3 准备工作
在进行开发之前请使用通用软件LedshowTW图文编辑软件对控制器进行相关配置比如控制器IP地址串口号、屏幕参数、扫描方式等在使用LedshowTW软件能发送普通节目到控制器兵能显示正常后在进行二次开发。
## 1.4 常见问题
* 关于表格 控制器不支持Excel或其他表格所以需要将表格转换成图片添加到区域中
# 2. 接口说明
## 2.1 SDK初始化
```java
// 五代控制器
// 初始化SDK
// 初始化有3种方法如下
Bx5GEnv.initial();
Bx5GEnv.initial("log.properties"); // log.properties是日志配置文件
Bx6GEnv.initial("log.properties",30000);// 30000为通讯超时时间单位是毫秒
// 六代控制卡
// 初始化SDK
// 初始化有3种方法如下
Bx6GEnv.initial();
Bx6GEnv.initial("log.properties");// log.properties是日志配置文件
Bx6GEnv.initial("log.properties",30000);// 30000为通讯超时时间单位是毫秒
```
## 2.2 Screen类
与控制器的所有交互都需要通过Bx5GScreen类或其子类来进行其子类包括
Bx5GScreenClient客户端模式使用Bx5GScreenRS串口模式使用Bx5GScreenServer服务器模式使用
创建screen对象的通常代码如下
```java
// 五代控制器
// 创建screen对象用于对控制器进行访问客户端模式
Bx5GScreenClient screen = new Bx5GScreenClient("MyScreen");
// 创建screen对象用于对控制器进行访问串口模式
Bx5GScreenRS screen = new Bx5GScreenRS("MyScreen");
// 六代控制器创建screen对象方法以BX-6M系列为例
// Bx6M 为控制卡型号,只有型号对应才能通讯正常,否则会出现逾时未回应
// 如果使用的控制器型号在SDK中没有定义则用Bx6M替代
// 创建screen对象用于对控制器进行访问客户端模式
Bx6GScreenClient screen = new Bx6GScreenClient("MyScreen",new Bx6M());
// 创建screen对象用于对控制器进行访问串口模式
Bx6GScreenRS screen = new Bx6GScreenRS("MyScreen",new Bx6M());
```
## 2.3 屏幕连接
在对控制器交互之前,需要先与控制器建立连接,代码如下:
```java
// 连接控制器
// 其中192.168.100.199为控制器的实际IP地址请根据实际情况填写
// 如果不知道控制器IP地址请先使用LedshowTW软件设置IP地址软件下载地址https://www.onbonbx.com/download/165.html
// 端口号默认为5005
// 五代控制器和六代控制器屏幕连接方法一样
screen.connect("192.168.100.199",5005);
```
与控制器交互完成后,需断开与控制器之间的连接,其代码如下:
```java
// 断开与控制器之间的连接
screen.disconnect();
```
## 2.4 屏幕控制
```java
// 以下为一些简单控制命令的使用方法
// 开关机命令
screen.turnOff();// 关机
screen.turnOn();// 开机
screen.syncTime();// 校时
screen.ping();// ping命令
// 查询控制器状态
screen.checkControllerStatus();
// 查询控制器当前固件版本
screen.checkFirmware();
// 查询控制器内存
screen.checkMemVolumes();
// 锁定屏幕当前画面
screen.lock();
// 解除锁定屏幕当前画面
screen.unlock();
// 通过以下接口回读控制器状态
Bx5GScreen.Result<ReturnControllersStatus> result = screen.checkControllerStatua();
if(result.isOK())
{
ReturnControllerStatus status = result.reply;
status.getBrightness();// 取得亮度值
status.getTemperature1();// 取得温度传感器温度值
// status还有很多接口根据实际应用进行调用
}
else
{
ErrorType error = result.getError();
System.out.println(error);
}
```
## 2.5 节目与区域
节目主要用于组合屏幕上现实的内容,它由多个区域组成。控制器同一时间只能播放一个集美,它是控制器现实内容可以单独更新的最小单位。
以下,我们将按步骤创建一个节目,并将其发送到控制器进行显示
```java
// 创建节目文件
// 第二个参数为显示屏属性具体可以参照Bx5GScreenProfile类
Bx5GScreenProfile profile = screen.getProfile();
ProgramBxFile p0 = new ProgramBxFile("P000",profile);
// 关于节目类的其他接口可以参考ProgramBxFile类
```
控制器支持的区域有很多种,例如:图文区、时间区、传感器区等。其中,最常用的是图文区。图文区可以支持显示文本和图片,文字或图片可以按数据也依次添加到图文区中,每页数据均可以设置特技方式,停留时间等属性
创建图文区的步骤大致如下:
创建TextCaptionBxArea对象
创建TextBxPage或ImageFileBxPage对象
将创建好的page对象添加到TextCaptionBxArea中
如下代码,创建一个文本区,并向这个区域中添加一个文本页
```java
// 创建一个图文区
// 参数为X、Y、width、heigth
// 注意区域左边和宽度高度,不要越界
TextCaptionBxArea area = new TextCaptionBxArea(0,0,160,64);
// 创建一个数据页,并希望显示“仰邦科技”这几个字
TextBxPage page = new TextBxPage("仰邦科技");
// 将page添加到area中
area.addPage(page);
// 将图文区添加到节目中
p0.addArea(area);
```
关于时间区
时间区的创建过程大致如下:
创建DateTimeBxArea对象
设置各时间单元显示格式
将DateTimeBxArea添加到节目中
```java
// 下面代码创建了一个时间区
// 注意只需输入时间区的起始坐标区域的宽度和高度SDK会根据字体和显示方式自动计算
DateTimeBxArea dtArea = new DateTimeBxArea(0,0,screen.getProfile());
// 设置字体
dtArea.setFont(new Font("宋体",Font.PLAIN,12));
// 设置显示颜色
dtArea.setForeground(Color.yellow);
// 多行显示还是单行显示
dtArea.setMultiline(true);
// 年月日显示格式
// 如果不需要显示设置为null
dtArea.setDateStyle(DateStyle.YYY_MM_DD_1);
dtArea.setTimeStyle(TimeStyle.HH_MM_SS_1);
dtArea.setWeekStyle(null);
// 将时间区添加到节目中
p0.addArea(dtArea);
// 关于DateTimeBxArea类的更多接口请参考JAVADOC中相关类的说明
```
更新节目
```java
// 以下为更新节目命令
screen.WriteProgram(p0);
// 更新节目还有很多命令请参考JAVADOC
```
## 2.6 动态区
动态区是一种比较特殊的区域,其有以下几个主要特点:
* 更新次数没有限制
* 内容掉电不保存
* 独立于节目进行编辑
* 可以支持多个区域,且每个区域可以进行单独更新
* 可以和单个活多个节目绑定显示,即作为节目的一个区域进行显示
* 可以作为单独一个节目进行独立播放
* 灵活的控制方式:超时时间控制、是否立即显示灯
以下为动态区代码
```
// 五代控制器动态区BX-5E系列
// BX-5E系列控制卡最高支持4个动态区当屏幕上需要同时显示多个动态区时动态区ID不可以相同
// DynamicBxRule(id,runMode,immediatePlay,timeout);
// runMode 运行模式
// 0:循环显示
// 1:显示完成后静止显示最后一页数据
// 2:循环显示,超过设定时间后数据仍未更新时不显示
// 3:循环显示超过设定时间后数据仍未更新时显示Logo信息
// 4:循环显示,显示完最后一页后不再显示
// immediatePlay
// 0:与异步节目一起播放
// 1:异步节目停止播放,仅播放动态区
// 2:当播放完节目编号最高的异步节目后播放该动态区
DynamicBxAreaRule rule = new DynamicBxRule(0,(byte)0,(byte)1,0);
TextCaptionBxArea darea = new TextCaptionBxArea(0,0,160,64,screen.getProfile());
TextBxPage dapge = new TextBxPage("动态区123abc");
darea.addPage(dpage);
screen.writeDynamic(rule,darea);
// 六代控制器动态区
DynamicBxAreaRule rule = new DynamicBxAreaRule();
// 设定动态区ID此处ID为0多个动态区ID不能相同
rule.setId(0);
// 设定异步节目停止播放,仅播放动态区
// 0:动态区与异步节目一起播放
// 1:异步节目停止播放,仅播放动态区
// 2:当播放完节目编号最高的异步节目后播放该动态区
rule.setImmediatePlay((byte)1);
// 设定动态区循环播放
// 0:循环播放
// 1:显示完成后静置显示最后一页数据
// 2:循环显示,超过设定时间后仍未更新时不再显示
// 3:循环显示超过设定时间后仍未更新时显示Logo信息
// 4:显示完成最后一页后就不再显示
rule.setRunMode((byte)0);
DynamicBxArea area = new DynamicBxArea(0,0,160,32,screen.getProfile());
TextBxPage page = new TextBxPage("动态区abc");
area.addPage(page);
screen.writeDynamic(rule,area);
```
## 2.7 Server模式包含GPRS
Server使用流程如下
* 初始化API在一个进程内只需要初始化一次
* 建立服务器
* 设定监听等待屏幕的连线与断线事件
* 关闭服务器
主要代码如下:
```java
Bx5GEnv.initial(); //初始化
// 建立服务器
Bx5GServer server = new Bx5GServer("Hello Screen", 8036);
// 添加监听
server.addListener(new ConnectionListener());
// 启动服务器
server.start();
System.out.println("waiting 30 secs");
Thread.sleep(30000);
// 更新节目或者动态区
//
//
//
// 关闭服务器
server.stop();
System.out.println("done!");
// 监听
public class ConnectionListener implements Bx5GServerListener {
@Override
public void connected(String socketId, String controllerAddr,
Bx5GScreen screen) {
Result<ReturnPingStatus> result1 = screen.ping();
Result<ReturnControllerStatus> result2 =
screen.checkControllerStatus();
...
}
@Override
public void disconnected(String socketId, String controllerAddr,
Bx5GScreen screen) {
...
}
}
```