package serialporttest.utils; import android.text.TextUtils; import android.util.Log; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android_serialport_api.SerialPort; /** * Created by Administrator on 2017/6/6. */ public class SerialPortUtil { private String TAG = "SerialPortUtil"; public SerialPort serialPort = null; public InputStream inputStream = null; public OutputStream outputStream = null; ISerialPortBedOnclickEvent onDataReceiveListener = null; ISerialPortBedOnclickString onDataReceiveStringListener = null; public boolean isOpenSerialPortUtil = false; private static byte[] KeyValue = new byte[8]; int DataIndex = 0; int DataValue = -1; public Thread receiveThread = null; public SerialPortUtil() { } /** * 打开串口的方法 */ public void openSerialPort() { Log.i(TAG, "打开串口"); try { serialPort = new SerialPort(new File("/dev/" + getSystemPort()), getSystemBaudrate(), 0); //获取打开的串口中的输入输出流,以便于串口数据的收发 inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); isOpenSerialPortUtil = true; receiveSerialPort(); } catch (IOException e) { e.printStackTrace(); } } /** * 接收串口数据的方法 */ private byte[] buffer; private String data; public byte[] re_buffer = new byte[2048]; String data1 = ""; public int writeIndex = 0, readIndex = 0; public boolean finshFlag = false; /** * 请求设备维一序列号(设备 ID) */ public static String KEY_ID = ""; public void receiveSerialPort() { initKeyValue(); Log.i(TAG, "接收串口数据"); if (receiveThread != null) return; buffer = new byte[1024]; receiveThread = new Thread() { @Override public void run() { while (isOpenSerialPortUtil) { try { if (inputStream == null) { return; } int size = inputStream.read(buffer); if (size > 0 && isOpenSerialPortUtil) { data = new String(buffer, 0, size); Log.d("aaaa", "data==" + data); if (systemVersionIsO()) {//安卓7.0.1 or 8.1.0 版用 //addByData(data);//my do changeData(size);//吴总改了后的 } else {//安卓4.2.0 版用 sendData(data); } } } catch (Exception e) { e.printStackTrace(); } } } }; //启动接收线程 receiveThread.start(); } String addData = ""; public synchronized void addByData(String data) { addData = addData + data; if (StringUtils.vagueInquiry(data, "$") && StringUtils.vagueInquiry(data, "#")) { sendData(addData); addData = ""; } } public void changeData(int size) { if (size > 0) { for (int i = 0; i < size; i++) { re_buffer[writeIndex] = buffer[i]; writeIndex++; if (writeIndex > 2047) { writeIndex = 0; } } } if (readIndex != writeIndex) { while (readIndex != writeIndex) { if (re_buffer[readIndex] == '$') { data1 = "$"; readIndex++; if (readIndex > 2047) { readIndex = 0; } } else if (re_buffer[readIndex] == '#') { data1 = data1 + "#"; readIndex++; if (readIndex > 2047) { readIndex = 0; } finshFlag = true; break; } else if (data1.length() > 0) { data1 = data1 + new String(re_buffer, readIndex, 1); readIndex++; if (readIndex > 2047) { readIndex = 0; } } else { readIndex++; if (readIndex > 2047) { readIndex = 0; } } } } if (finshFlag) { sendData(data1); data1 = ""; finshFlag = false; } } public void sendData(String data) { Log.d("bbbb", "data==" + data); if (!StringUtils.notEmpty(data)) return; if (isOpenSerialPortUtil) { if (data.contains("ID")) { String str = data.substring(data.indexOf(",") + 1, data.indexOf("1#")); int i = 0; while (i < 10) { if (str.length() > 4) { break; } else { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } getKeyId(); i++; } } Log.e(TAG, str); KEY_ID = str; } else { if (data.contains("$") && data.contains("#")) { if (null != onDataReceiveStringListener) {//add by waderson 20190708 onDataReceiveStringListener.serialPortBedOnclickString(data); } String str = data.substring(data.indexOf("$") + 1, data.indexOf("#")); if (TextUtils.isDigitsOnly(str.substring(3, 4)) && TextUtils.isDigitsOnly(str.substring(5, 6))) { DataIndex = Integer.parseInt(str.substring(3, 4)); DataValue = Integer.parseInt(str.substring(5, 6)); if (DataIndex < 8) { KeyValue[DataIndex] = (byte) DataValue; } if (null != onDataReceiveListener) { onDataReceiveListener.serialPortBedOnclick(KeyValue); } } //====================================== for (int i = 0; i < KeyValue.length; i++) { if (KeyValue[i] > 0) KeyValue[i] = -1; } //====================================== } } } } /** * 判断是否是7.1以上的系统版本 * * @return */ public static boolean systemVersionIsO() { if (android.os.Build.VERSION.SDK_INT >= 24) {//7.1以上的系统 return true; } else { return false; } } /** * 关闭串口的方法 * 关闭串口中的输入输出流 * 然后将flag的值设为flag,终止接收数据线程 */ public void closeSerialPort() { Log.i(TAG, "关闭串口"); try { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close(); } if (receiveThread != null && receiveThread.isAlive()) { receiveThread.interrupt(); receiveThread = null; } isOpenSerialPortUtil = false; } catch (IOException e) { e.printStackTrace(); } } //初始化 key值 public static void initKeyValue() { KeyValue[0] = -1; KeyValue[1] = -1; KeyValue[2] = -1; KeyValue[3] = -1; KeyValue[4] = -1; KeyValue[5] = -1; KeyValue[6] = -1; KeyValue[7] = -1; } /** * 心跳信号 */ public void startHeart() { send("$HEART,1F#"); } /** * 关闭心跳
* 若MCU在10秒内没有收到信号,将自动重启Android. 随机数为“W”时将关闭心跳
*/ public void closeHeart() { send("$HEART,WE#"); } /** * 系统重启 */ public void systemRestart() { send("$SYSRESET,2D#"); Log.i(TAG, "系统重启发送"); } /* * 进入系统ROM升级模式 * */ public void systemUpDate() { Log.i(TAG, "系统ROM升级模式串口数据"); send("$SYSUPDATE,3C#"); Log.i(TAG, "系统ROM升级模式发送"); } /** * 发送串口数据的方法 * * @param command 要发送的数据 */ private void send(String command) { try { if (isOpenSerialPortUtil) { byte[] sendData = command.getBytes(); outputStream.write(sendData); Log.d("NURSELIGHT","==command=="+"护理灯串口数据发送成功"); Log.i(TAG, "串口数据发送成功"); } } catch (IOException e) { e.printStackTrace(); Log.d("NURSELIGHT","==command=="+"护理灯串口数据发送失败"); Log.i(TAG, "串口数据发送失败"); } } public void setOnDataReceiveListener(ISerialPortBedOnclickEvent dataReceiveListener) { onDataReceiveListener = dataReceiveListener; } public void setOnDataReceiveStringListener(ISerialPortBedOnclickString dataReceiveStringListener) { onDataReceiveStringListener = dataReceiveStringListener; } // private void saveKeyValue() { // if (timer != null) { // timer.purge(); // } // timer = new Timer(); // // if (timerTask != null) { // timerTask.cancel(); // } // timerTask = new TimerTask() { // @Override // public void run() { // if (KeyValue[DataIndex] > 0) { // initKeyValue(); // } // } // }; // timer.schedule(timerTask, 10, mTimeInterval); // } public static int getSystemVersion() { return android.os.Build.VERSION.SDK_INT; } public static String getSystemPort() { String port; if (getSystemVersion() >= 26) { //android8.0 = 26 port = "ttyS4";// rk3368 android8.1 } else if (getSystemVersion() >= 24) { //android7.0 = 24 port = "ttyS1";//rk3128 android7.1 } else { port = "ttyS2";// a33 android4.4 } return port; } /** * 得到波特率 * * @return String */ public static int getSystemBaudrate() { int baudrate; if (getSystemVersion() >= 26) { //android8.0 = 26 baudrate = 115200;// rk3368 android8.1 } else if (getSystemVersion() >= 24) { //android7.0 = 24 baudrate = 115200;//rk3128 android7.1 } else { baudrate = 115200;// a20 android4.2 } return baudrate; } public interface ISerialPortBedOnclickEvent { void serialPortBedOnclick(byte[] buffer); } public interface ISerialPortBedOnclickString { void serialPortBedOnclickString(String str); } //------------------------below things was add by Waderson 20171106 ----------------------------------- public static final String C_HEARD = "$";//开头符 public static final String C_END = "#";//结束符 public static final String C_SEPARATE = ",";//分隔符 /** * 手柄MIC切换
*/ public static final String MIC = "MIC"; /** * 床头灯的切换
0 关闭 1打开 2闪烁 */ public static final String BEDLIGHT = "RELAY"; /** * 门灯控制开关 */ public static final String DOORLIGHT = "DOORLED"; /** * 卫生间呼叫灯控制
*/ public static final String ULED = "ULED"; /** * 护理灯光控制
*/ public static final String NURSELIGHT = "NLED"; /** * 当前 SIP 协议状态
*/ public static final String SIP_STATUS = "SIP"; /** * 心跳控制
* 若MCU在10秒内没有收到信号,将自动重启Android. 随机数为“W”时将关闭心跳
* $ HEART ,1 E #
*/ /** * 写入串口
* Waderson 20171103 * command 命令
* random 随机数
* check 校验符
*/ public void sendCommand(String command, String random, String check) {//$NLED3,beComeDoublF# String random_v = "1", check_v = "F"; if (null == command || "".equals(command)) {// beComeDoubleStr(rr) + beComeDoubleStr(gg) + beComeDoubleStr(bb), "F" return; } if (null != random && !"".equals(random)) { random_v = random; } if (null != check && !"".equals(check)) { check_v = check; } Log.d("NURSELIGHT","=="+C_HEARD + command + C_SEPARATE + random_v + check_v + C_END); send(C_HEARD + command + C_SEPARATE + random_v + check_v + C_END); } /** * 请求设备维一序列号(设备 ID) */ public void getKeyId() { send("$ID,11#"); } }