文章目录
业务场景及流程分析
我们的应用从A平台通过Rest接口获取车速数据,然后将数据推送到Led屏幕显示
显示效果如下:
主要难点是将数据推送到led屏,led屏厂商给了对应的通信协议(文档资料目录下)
通过研究文档,梳理推送的主要流程:
- 将文字生成一个图片
- 通过pictToBuff方法将图片的像素按照RGB的方式存储在三维数组buff,并将宽方向的八个字节压缩成1个字节(参照图片数据的整理)
- 将数据分包,每次发送0x200个字节组成数据包,不足0x200补0
- 根据显示屏协议组装协议包,先发送**(0x02)发送图形信息数据**,发完所有的信息数据包后最后再发送一个**(0x01)发送图形参数数据**
- 封装一个socket发送工具,socket是长连接不用每次都创建然后再断开,可以使用单例模式创建唯一的socket
代码实现
1、将文字生成一个图片
public static BufferedImage drawImage(IllegalRecord record){
BufferedImage buffImg = new BufferedImage(pictWidth,pictHeight,BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g = (Graphics2D) buffImg.getGraphics();
//设置抗锯齿,防止图片或文字模糊
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//绘制图片
ImageIcon imgIcon = new ImageIcon("in.jpg");
Image img = imgIcon.getImage();
g.drawImage(img,64,64,null);
//绘制文字
Font f = new Font("宋体",Font.PLAIN,12);
g.setColor(Color.RED);
g.setFont(f);
String row1 = "车牌:";
String row2 = " "+record.getPlateNum();
String row3 = "车速:";
String row4 = " "+record.getCarSpeed() + "km/h";
Calendar now = Calendar.getInstance();
String row5 = "时间 " + now.get(Calendar.HOUR_OF_DAY) + ":" + now.get(Calendar.MINUTE);
String[] contents = {
row1,row2,row3,row4,row5};
int h = 12;
for (int i = 0; i < contents.length; i++) {
g.drawString(contents[i], 0, h * (i +1));
}
return buffImg;
}
2、pictToBuff 将图片转成符合要求的RGB格式
/**
* pictToBuff 将图片转成符合要求的RGB格式
* @param img 图片
* @param buff 存放结果的缓冲区
* @param pictWidth 图片宽度
* @param pictHeight 图片高度
* @param width 屏体宽度
* @param height 屏体高度
* @param color 显示屏颜色
* @param pageno 图片编号
*/
public static void pictToBuff(BufferedImage img,byte[][][] buff,Integer pictWidth,
Integer pictHeight,Integer width,Integer height,
Integer color,Integer pageno){
//据图片和屏体的宽高决定截取图片的宽高,保证数据不越界
int endX = pictWidth > width ? width : pictWidth;
int endY = pictHeight > height ? height : pictHeight;
byte[] _ROLE = new byte[8];
//_ROLE : Array [0..7] Of BYTE = ($80,$40,$20,$10,$08,$04,$02,$01);
_ROLE[0] = (byte)0x80;
_ROLE[1] = (byte)0x40;
_ROLE[2] = (byte)0x20;
_ROLE[3] = (byte)0x10;
_ROLE[4] = (byte)0x08;
_ROLE[5] = (byte)0x04;
_ROLE[6] = (byte)0x02;
_ROLE[7] = (byte)0x01;
for (int i = 0; i < endY; i++)