Java socket推送车速到Led屏

业务场景及流程分析

我们的应用从A平台通过Rest接口获取车速数据,然后将数据推送到Led屏幕显示
显示效果如下:
led显示屏

主要难点是将数据推送到led屏,led屏厂商给了对应的通信协议(文档资料目录下)

通过研究文档,梳理推送的主要流程:

  1. 将文字生成一个图片
  2. 通过pictToBuff方法将图片的像素按照RGB的方式存储在三维数组buff,并将宽方向的八个字节压缩成1个字节(参照图片数据的整理
  3. 将数据分包,每次发送0x200个字节组成数据包,不足0x200补0
  4. 根据显示屏协议组装协议包,先发送**(0x02)发送图形信息数据**,发完所有的信息数据包后最后再发送一个**(0x01)发送图形参数数据**
  5. 封装一个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++) 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值