工具类: tcp通讯 ,plc工业大屏串口com通讯 十六进制数据的传递和数据的转换处理
TCPConnection:
package com.zlhc.autocookie.utils.plcutils; import android.os.Handler; import android.os.Message; import android.util.Log; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; public class TCPConnection { int port; String host_address; SocketInitListener sctListener; SendDataListener sendListener; ReveiceDataListener reveiceListener; private int readLength; private Thread thread; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { //判断标志位 case -1: if (sctListener != null) sctListener.connectFailure((String) msg.obj); break; case 1: if (sctListener != null) sctListener.connectSuccess(); break; case -2: if (sendListener != null) sendListener.sendFailure((String) msg.obj); break; case 2: if (sendListener != null) sendListener.sendSuccess(); break; case -3: break; case 3: if (reveiceListener != null) reveiceListener.reveiceSuccess((List<String>) msg.obj); break; } } }; private OutputStream out; private Socket socket; private PrintWriter pintwriter; private Thread receiveThread; /** * 初始化tcp链接 * * @param host_address * @param port */ public TCPConnection init(String host_address, final int port, final SocketInitListener sctListener) { this.port = port; this.host_address = host_address; this.sctListener = sctListener; thread = new Thread(new Runable()); thread.start(); return this; } /** * 线程实现 */ class Runable implements Runnable { @Override public void run() { try { socket = new Socket(host_address, port); socket.setSoTimeout(Config.SOCKETTIMEOUT); out = socket.getOutputStream(); pintwriter = new PrintWriter(out); sendHandler(1, ""); } catch (UnknownHostException e) { sendHandler(-1, e.getMessage()); e.printStackTrace(); } catch (IOException e) { sendHandler(-1, e.getMessage()); e.printStackTrace(); } } } /** * 发送UI线程消息 * * @param code * @param result */ public void sendHandler(int code, Object result) { Message msg = Message.obtain(); msg.obj = result; msg.what = code; handler.sendMessage(msg); } /** * 发送byte数组或者串数据 * * @param data * @param sendDataListener */ public void sendData(final Object data, SendDataListener sendDataListener) { this.sendListener = sendDataListener; new Thread(new Runnable() { @Override public void run() { try { if (data instanceof byte[]) { out.write((byte[]) data); out.flush(); } else if (data instanceof String) { pintwriter.write((String) data); pintwriter.flush(); } sendHandler(2, ""); } catch (IOException e) { sendHandler(-2, e.getMessage()); e.printStackTrace(); } } }).start(); } /** * 接受byte数据 * * @param reveiceDataListener */ public void reveiceData(ReveiceDataListener reveiceDataListener) { this.reveiceListener = reveiceDataListener; receiveThread = new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(500); StringBuilder buffer = new StringBuilder(); String line = null; byte[] arrs = null; byte[] b = null; InputStream is = null; is = socket.getInputStream(); while (true) { b = new byte[1024]; readLength = is.read(b); sendHandler(3, ByteToString(b)); Log.e("", "返返回值:" + ByteToString(b).toString()); } } catch (Exception e) { sendHandler(-3, e.getMessage()); e.printStackTrace(); } } } }); receiveThread.start(); } /** * 断开连接 */ public void disconnect() { try { out.close(); pintwriter.close(); socket.close(); } catch (IOException e) { } } /** * 转换 * * @param bytes * @return */ public List<String> ByteToString(byte[] bytes) { List<String> listData = new ArrayList<>(); for (int i = 0; i < readLength; i++) { String num = Integer.toHexString(byteToInteger(bytes[i])); if (num.length() == 1) { listData.add("0" + num); } else { listData.add(num); } } return listData; } /** * Description: 负数byte转正int <BR> */ public static Integer byteToInteger(Byte b) { return 0xff & b; } }
public interface SocketInitListener {
void connectSuccess();
void connectFailure(String exception);
}
public interface SendDataListener {
void sendSuccess();
void sendFailure(String exception);
}
public interface ReveiceDataListener {
void reveiceSuccess(String result);
}
public class Config {
//超时时间
public static int SOCKETTIMEOUT = 3000;
}