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++) {
            for (int j = 0; j < (endX + 7) / 8; j++) {
                byte vR = 0;
                byte vG = 0;
                byte vB = 0;
                int[] rgb = new int[3];

                //8个字节合并
                for (int k = 0; k < 8; k++) {
                    int pixel = img.getRGB(j * 8 + k, i);
                    //获取红色通道像素
                    rgb[0] = (pixel &  0xff0000) >> 16;
                    //获取绿色通道像素
                    rgb[1] = (pixel &  0xff00) >> 8;
                    //获取蓝色通道像素
                    rgb[2] = (pixel &  0xff);

                    if((rgb[0] & 0xFF) > 0x80){
                        vR =(byte)(vR | _ROLE[k]);
                    }
                    if((rgb[1] & 0xFF) > 0x80){
                        vG =(byte)(vG | _ROLE[k]);
                    }
                    if((rgb[2] & 0xFF) > 0x80){
                        vB =(byte)(vB | _ROLE[k]);
                    }
                }

                buff[pageno][i][j] = vR;
                buff[pageno][endY + i][j] = vG;
                buff[pageno][endY * 2 + i][j] = vB;

            }
        }
    }

3、发送图形信息数据,将图片分包发送

//1、分包发送图片信息数据
int sendinfolen = (endX / 8) * endY * (ledColor + 1) * pageNum;
int x=0;
int y=0;
int command = 2;
//每次发送512个字节,不足一次算一次,末尾补0
int k = (sendinfolen + 0x200 - 1) / 0x200;
log.info("准备发送指令2,总共{}个包",k);
for(int i = 0 ;i < k;i++)
{
    //用byte数组组装
    byte[] sendinfobuf = new byte[514];
    sendinfobuf[0] = (byte)(i / 256);
    sendinfobuf[1] =  (byte)(i % 256);
    int index = 2;
    for(int j=0;j < 0x200; j++)
    {
        if(pageno < pageNum)
        {
            sendinfobuf[index++] = buff[pageno][y][x];
            x++;
            if(x >= endX / 8)
            {
                x = 0;
                y++;
                if(y >= endY * (ledColor+1))
                {
                    y=0;
                    pageno++;
                }
            }
        }
        else
        {
            //不够0x200字节补0
            sendinfobuf[index++] = 0;
        }
    }
    log.info("socket推送第{}个数据包",(i+1));
    sendinfotoled(sendinfobuf, command);
    log.info("socket推送第{}个数据包成功!",(i+1));
}

4、发送图形参数数据

//2、发送图形参数数据
command=1;
byte[] sendinfobuf = new byte[6];
sendinfobuf[0] = (byte)(pageNum / 256);
sendinfobuf[1] =  (byte)(pageNum % 256);
int index = 2;
byte[] dispmode = {0x00};
byte[] hidemode = {0x0f};
byte[] stoptime = {0x00};
byte[] movespeed = {0x05};
for(int i = 0; i < pageNum; i++)
{
    //显示方式
    //                sendinfobuf = sendinfobuf + (char)(dispmode[i]);
    sendinfobuf[index++] =  dispmode[i];
    //消失方式
    //                sendinfobuf = sendinfobuf + (char)(hidemode[i]);
    sendinfobuf[index++] =  hidemode[i];
    //停留时间
    //                sendinfobuf = sendinfobuf + (char)(stoptime[i]);
    sendinfobuf[index++] =  stoptime[i];
    //速度
    //                sendinfobuf = sendinfobuf + (char)(movespeed[i]);
    sendinfobuf[index++] =  movespeed[i];
}
sendinfotoled(sendinfobuf, command);

5、封装统一的发送方法sendinfotoled

	/**
     * 发送指令到led
     * @param sendinfobuf
     * @param command
     */
public static void sendinfotoled(byte[] sendinfobuf,int command){
    Integer i,k,k2;
    byte kh;
    Integer infolen;
    infolen = sendinfobuf.length;
    byte[] senddata2 = new byte[infolen + 8];
    //        byte[] senddata = new byte[infolen + 8];
    k = 3 + infolen;     // 3 + 514 = 517
    senddata2[0] = (byte)0xf5;
    senddata2[1] = (byte)0x01;
    senddata2[2] = (byte)(k / 256);
    //长度
    senddata2[3] = (byte)(k % 256);
    senddata2[4] = 0;
    //命令
    senddata2[5] = (byte)command;
    senddata2[6] = 1;
    k = 7;
    //把数据内容复制到发送数组
    for (i= 0; i < infolen; i++) {
        senddata2[k] = sendinfobuf[i];
        k = k + 1;
    }

    kh = 0;
    for( i=0 ; i <= k-1; i++ ){
        kh ^=  senddata2[i];
    }
    senddata2[k] = kh;
    k = k+1;

    //计算包扩展后的长度
    int extendLength = 0;
    for (int j = 1; j <= k-1; j++) {
        if(senddata2[j] == (byte) 0xf5 || senddata2[j] == (byte)0xfa){
            extendLength++;
        }
    }
    System.out.println("扩展的长度:"+extendLength);
    int sendLength = infolen + 8 + extendLength;
    byte[] senddata = new byte[sendLength];

    senddata[0] = senddata2[0];
    k2 = 1;
    for (i = 1;i <= k-1; i++){
        if(senddata2[i] == (byte) 0xf5){
            senddata[k2] = (byte) 0xfa;
            k2 = k2 + 1;
            senddata[k2] = 0x05;
            System.out.println("0xf5扩展");
        }
        else if(senddata2[i] == (byte)0xfa) {
            senddata[k2] = (byte) 0xfa;
            k2 = k2 + 1;
            senddata[k2] = 0x0a;
            System.out.println("0xfa扩展");
        }
        else {
            senddata[k2] = senddata2[i];
        }
        k2 = k2 + 1;
    }
    //        发送socket
    log.info("推送的内容:{}",senddata);
    FlySocketUtils.sendMsg(senddata);
    log.info("推送成功!command={}",command);
}

6、封装Socket发送工具

/**
 * 支持多个socket同时推送
 * @date 2021/3/16 14:30
 */
@Slf4j
public class FlySocketUtils {
    private static Socket[] sockets = new Socket[1];

    private FlySocketUtils(){}

    static {
        try {
            log.info("初始化socket数组...");
            Socket socket1 = new Socket("localhost",60000);
//            Socket socket1 = new Socket("10.60.1.40",60000);
            log.info("socket1={}",socket1);
            sockets[0] = socket1;

            log.info("初始化socket数组完成!");
            for (int i = 0; i < sockets.length; i++) {
                log.info("打印socket连接:{}",sockets[i]);
            }
        } catch (IOException e) {
            log.error("初始化socket数据出错");
            e.printStackTrace();
        }
    }

    public static void sendMsg(byte[] msg){
        OutputStream output = null;
        try {
            for (Socket socket : sockets) {
                output = socket.getOutputStream();
                log.info("打印output={}",output);
                output.write(msg);
                //每次同送休息1s,担心对方处理不过来,因为没有解析对方的socket响应
                Thread.sleep(1000);
                log.info("output={}发送成功",output);
            }

        } catch (IOException e) {
            log.error("发送消息出错");
            e.printStackTrace();
        } catch (InterruptedException e) {
            log.error("休眠失败");
            e.printStackTrace();
        }
    }

}

测试程序

1、打开Socket服务端的模拟程序,开启60000端口

在这里插入图片描述

2、启动应用程序,浏览器发送 http://localhost:7878/testLed 请求

控制台打印:

2021-04-01 15:03:19.746 INFO 24848 — [nio-7878-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet ‘dispatcherServlet’
2021-04-01 15:03:19.746 INFO 24848 — [nio-7878-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet ‘dispatcherServlet’
2021-04-01 15:03:19.747 INFO 24848 — [nio-7878-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
2021-04-01 15:03:19.768 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.DemoController : 准备推送车速到led:[IllegalRecord(recordId=null, plateNum=粤B123456, carNumType=null, carNumTypeStr=null, capTimeStr=null, channelCode=null, channelName=null, orgName=null, createTimeStr=null, carWayCode=null, carWayCodeStr=null, carSpeed=123, carColor=null, carColorStr=null, recType=null, recTypeStr=null, carBrand=null, carBrandStr=null, carDirect=null, carDirectStr=null, channelId=null, lng=null, lat=null)]
2021-04-01 15:03:20.018 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : 准备发送指令2,总共3个包
2021-04-01 15:03:20.018 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : socket推送第1个数据包
扩展的长度:0
2021-04-01 15:03:20.019 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : 推送的内容:[-11, 1, 2, 5, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8, 69, 16, 0, 0, 0, 0, 0, 8, 5, 66, 0, 0, 0, 0, 0, 16, 5, 82, 0, 0, 0, 0, 0, 16, 4, 66, 0, 0, 0, 0, 0, 34, 68, 82, 48, 0, 0, 0, 0, 0, 4, 8, 48, 0, 0, 0, 0, 2, 36, 42, 0, 0, 0, 0, 0, 0, 0, 8, 48, 0, 0, 0, 0, 0, 0, 8, 48, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, -123, 60, 33, -57, 4, -8, -64, 0, -67, 18, 98, 40, -116, 1, 32, 0, -111, 18, 34, 32, -116, 2, 0, 0, -107, 28, 32, 67, 20, 114, -64, 0, 1, -110, 32, 0, -124, 10, 32, 0, 32, 18, 32, 0, -66, 10, 32, 0, 0, 18, 34, 8, -124, -117, 32, 0, 2, 60, 115, -25, 14, 113, -64, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 8, 64, 16, 0, 0, 0, 0, 0, 8, 2, 16, 0, 0, 0, 0, 0, 16, 0, 16, 0, 0, 0, 0, 0, 16, 0, 20, 0, 0, 0, 0, 0, 34, 66, 20, 48, 0, 0, 0, 0, 0, 2, 48, 48, 0, 0, 0, 0, 2, 34, 16, 0, 0, 0, 0, 0, 0, 2, 16, 48, 0, 0, 0, 0, 0, 4, 16, 48, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, 0, 112, 0, 0, 0, -121, 28, 64, 0, -112, 0, 0, 1, -120, -94, 64, 0, -112, 0, 0, 0, -120, -126, 64, 1, 16, 0, 0, 0, -127, 12, 91, -31, 20, 0, 0, 0, -128, 2, 66, -94, 18, 0, 0, 0, -128, 2, 66, -94, 18, 0, 0, 0, -120, 34, 66, -92, 18, 0, 0, 1, -49, -100, -53, -28, 59, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, 0, 0, 0, 0, 0, 0, 0, -127, 0, 0, 0, 0, 0, 0, 64, -92, 0, 0, -113, -128, 112, 0, 64, -124, 16, 1, -128, 0, -120, 0, 80, -124, -112, 0, -128, 8, 8, 0, 66, -124, -112, 0, -121, 0, 48, 0, 64, -124, -112, 0, -128, -128, 8, 0, 80, -124, -112, 0, -128, -128, 8, 0, 64, -124, 0, 0, -120, -128, -120, 0, 0, -124, 0, 1, -57, 8, 112, 0, 0, -128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -93]
2021-04-01 15:03:20.020 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : 初始化socket数组…
2021-04-01 15:03:20.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : socket1=Socket[addr=localhost/127.0.0.1,port=60000,localport=53281]
2021-04-01 15:03:20.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : 初始化socket数组完成!
2021-04-01 15:03:20.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : 打印socket连接:Socket[addr=localhost/127.0.0.1,port=60000,localport=53281]
2021-04-01 15:03:20.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : 打印output=java.net.SocketOutputStream@4cd06e23
2021-04-01 15:03:21.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : output=java.net.SocketOutputStream@4cd06e23发送成功
2021-04-01 15:03:21.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : 推送成功!command=2
2021-04-01 15:03:21.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : socket推送第1个数据包成功!
2021-04-01 15:03:21.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : socket推送第2个数据包
扩展的长度:0
2021-04-01 15:03:21.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : 推送的内容:[-11, 1, 2, 5, 0, 2, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15]
2021-04-01 15:03:21.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : 打印output=java.net.SocketOutputStream@4cd06e23
2021-04-01 15:03:22.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : output=java.net.SocketOutputStream@4cd06e23发送成功
2021-04-01 15:03:22.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : 推送成功!command=2
2021-04-01 15:03:22.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : socket推送第2个数据包成功!
2021-04-01 15:03:22.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : socket推送第3个数据包
扩展的长度:0
2021-04-01 15:03:22.023 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : 推送的内容:[-11, 1, 2, 5, 0, 2, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14]
2021-04-01 15:03:22.024 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : 打印output=java.net.SocketOutputStream@4cd06e23
2021-04-01 15:03:23.024 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : output=java.net.SocketOutputStream@4cd06e23发送成功
2021-04-01 15:03:23.024 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : 推送成功!command=2
2021-04-01 15:03:23.024 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : socket推送第3个数据包成功!
扩展的长度:0
2021-04-01 15:03:23.024 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : 推送的内容:[-11, 1, 0, 9, 0, 1, 1, 0, 1, 0, 15, 0, 5, -10]
2021-04-01 15:03:23.024 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : 打印output=java.net.SocketOutputStream@4cd06e23
2021-04-01 15:03:24.025 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlySocketUtils : output=java.net.SocketOutputStream@4cd06e23发送成功
2021-04-01 15:03:24.025 INFO 24848 — [nio-7878-exec-1] com.example.testsocket.FlyLedUtils : 推送成功!command=1

wireshark抓包显示:

在这里插入图片描述
最后现场调试设备把socket的ip和端口替换一下就好。

收获和感想

这次对接主要了解了通过socket指令对接硬件的过程,如何通过指定的协议构造数据包。
最后,非常感谢公司同事王哥,在对接过程给出了极具正确的指导和帮助,希望本文也能帮助更多的人。

代码链接 https://gitee.com/LinChong2018/java2led-demo

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值