汽车CAN通信基础知识-Java之Socket通信实战

it2022-05-08  16

目录

1.理解JavaSocket通信原理

2.定义数据通信数据规则

3.实现Socket通信

3.1创建Socket并主动连接服务器

3.2通过OutpuStream写入数据给服务器

3.3起线程通过InputStream从服务器不断的读取数据流

3.4关闭资源


1.理解JavaSocket通信原理

https://blog.csdn.net/ahou2468/article/details/80353723

2.定义数据通信数据规则

以下是CAN数据的通信结构;

一个 TCP 或 UDP 帧包含若干个 CAN 帧(最多50个, 最少1个CAN帧);一个CAN帧是13个字节;

第一字节主要区分标准帧和扩展帧,远程帧和数据帧;

3.实现Socket通信

3.1创建Socket并主动连接服务器

注意要设置连接Server地址和端口,同时设置连接时间,超时则连接失败

//客户端模式 private Socket socket; private InputStream inputStream; //输入流,用于从服务器获取数据 private OutputStream outputStream;//输出流,用于写数据给服务器 //创建一个流套接字并将其连接到指定主机上的指定端口号。 // socket = new Socket(ipAddress_l, nWorkPort_l); socket = new Socket(); //实例化socket SocketAddress socketAddress = new InetSocketAddress(ipAddress_l, nWorkPort_l); //获取sockaddress对象 socket.connect(socketAddress,15000); //连接socket并设置连接超时为5秒,如果5秒后服务端还没有响应,则弹出异常信息。 outputStream = socket.getOutputStream(); inputStream = socket.getInputStream();

3.2通过OutpuStream写入数据给服务器

将short(0-255)数据强制转换为byte(-128-127)类型,实际CAN设备C++Server接收byte数据属于无符号类型,实际接收数据是(0-255)

//组装实际数据,将short数据强制转换为byte short[] msg = new short[13]; //将short数组转为byte数组 byte[] msgbyte = new byte[msg.length]; for(int i=0; i<msg.length;i++){ msgbyte[i] = (byte)msg[i]; } //写入数据 outputStream.write(msgbyte,0, msgbyte.length);

3.3起线程通过InputStream从服务器不断的读取数据流

/** * 监听接收数据 */ private class FrmRecvRunnable implements Runnable{ @Override public void run() { int nCount = 0; while (!mPaused){ try{ if(mConnected){ if(!socket.isConnected()){ //通知设备已经断开连接 return; } //1.接收数据缓冲区,每一帧数据为13字节 byte[] buffer = new byte[13]; int bytes; //2.不断循环接收数据 while(true){ //3.读数据,每次读取一帧数据,13字节 bytes = inputStream.read(buffer);//, 0, 13); if(bytes > 0) { byte[] data = new byte[bytes]; System.arraycopy(buffer, 0, data, 0, bytes); short[] msg = new short[13];//LeopaardCANCtrl.toShortArray(data); //4.根据自己需要将字节数据转换为short类型 for(int i=0;i<bytes; i++){ msg[i] = (short) (0x0FF&buffer[i]); } //5.根据数据需要将13字节数据转为需要的CAN数据 LeopaardFrmData frmData = new LeopaardFrmData(); LeopaardCANCtrl.canPack(frmData, msg, msg.length); sendDataToJS(frmData, 0); //0暂未使用 // Thread.sleep(2000); } } } }catch (Exception exception){ //暂不处理 } } } }

3.4关闭资源

//是否连接资源 public boolean freeResouce(){ //是否资源 try{ if(outputStream != null){ outputStream.close(); outputStream = null; } if(inputStream != null){ inputStream.close(); inputStream = null; } if(threadPool != null){ threadPool.shutdown(); threadPool = null; } if(socket != null){ socket.close(); socket = null; } return true; }catch (Exception exception){ //暂不处理 } return false; }

 

 


最新回复(0)