通过放大器串口与电脑进行通信,从而在程序段发送消息给放大器,再由放大器把消息推送指指定手环
具体代码如下:
package middol.util; import com.yang.serialport.exception.*; import gnu.io.*; import java.io.*; import java.net.URLEncoder; import java.nio.ByteBuffer; import java.util.*; public class SerialPortManager { /** * 查找所有可用端口 * * @return 可用端口名称列表 */ @SuppressWarnings("unchecked") public static final ArrayList<String> findPort() { // 获得当前所有可用串口 Enumeration<CommPortIdentifier> portList = CommPortIdentifier .getPortIdentifiers(); ArrayList<String> portNameList = new ArrayList<String>(); // 将可用串口名添加到List并返回该List while (portList.hasMoreElements()) { String portName = portList.nextElement().getName(); portNameList.add(portName); } return portNameList; } /** * 打开串口 * * @param portName * 端口名称 * @param baudrate * 波特率 * @return 串口对象 * @throws SerialPortParameterFailure * 设置串口参数失败 * @throws NotASerialPort * 端口指向设备不是串口类型 * @throws NoSuchPort * 没有该端口对应的串口设备 * @throws PortInUse * 端口已被占用 */ public static final SerialPort openPort(String portName, int baudrate) throws SerialPortParameterFailure, NotASerialPort, NoSuchPort, PortInUse { try { // 通过端口名识别端口 CommPortIdentifier portIdentifier = CommPortIdentifier .getPortIdentifier(portName); // 打开端口,设置端口名与timeout(打开操作的超时时间) CommPort commPort = portIdentifier.open(portName, 2000); // 判断是不是串口 if (commPort instanceof SerialPort) { SerialPort serialPort = (SerialPort) commPort; try { // 设置串口的波特率等参数 serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) { throw new SerialPortParameterFailure(); } return serialPort; } else { // 不是串口 throw new NotASerialPort(); } } catch (NoSuchPortException e1) { throw new NoSuchPort(); } catch (PortInUseException e2) { throw new PortInUse(); } } /** * 关闭串口 * * @param serialport * 待关闭的串口对象 */ public static void closePort(SerialPort serialPort) { if (serialPort != null) { serialPort.close(); serialPort = null; } } /** * 向串口发送数据 * * @param serialPort * 串口对象 * @param order * 待发送数据 * @throws SendDataToSerialPortFailure * 向串口发送数据失败 * @throws SerialPortOutputStreamCloseFailure * 关闭串口对象的输出流出错 */ public static void sendToPort(SerialPort serialPort, byte[] order) throws SendDataToSerialPortFailure, SerialPortOutputStreamCloseFailure { OutputStream out = null; try { out = serialPort.getOutputStream(); out.write(order); out.flush(); } catch (IOException e) { throw new SendDataToSerialPortFailure(); } finally { try { if (out != null) { out.close(); out = null; } } catch (IOException e) { throw new SerialPortOutputStreamCloseFailure(); } } } /** * 从串口读取数据 * * @param serialPort * 当前已建立连接的SerialPort对象 * @return 读取到的数据 * @throws ReadDataFromSerialPortFailure * 从串口读取数据时出错 * @throws SerialPortInputStreamCloseFailure * 关闭串口对象输入流出错 */ public static byte[] readFromPort(SerialPort serialPort) throws ReadDataFromSerialPortFailure, SerialPortInputStreamCloseFailure { System.out.println("1111111111"); InputStream in = null; byte[] bytes = null; try { in = serialPort.getInputStream(); // 获取buffer里的数据长度 int bufflenth = in.available(); while (bufflenth != 0) { // 初始化byte数组为buffer中数据的长度 bytes = new byte[bufflenth]; in.read(bytes); bufflenth = in.available(); } } catch (IOException e) { throw new ReadDataFromSerialPortFailure(); } finally { try { if (in != null) { in.close(); in = null; } } catch (IOException e) { throw new SerialPortInputStreamCloseFailure(); } } return bytes; } /** * 添加监听器 * * @param port * 串口对象 * @param listener * 串口监听器 * @throws TooManyListeners * 监听类对象过多 */ public static void addListener(SerialPort port, SerialPortEventListener listener) throws TooManyListeners { try { // 给串口添加监听器 port.addEventListener(listener); // 设置当有数据到达时唤醒监听接收线程 port.notifyOnDataAvailable(true); // 设置当通信中断时唤醒中断线程 port.notifyOnBreakInterrupt(true); } catch (TooManyListenersException e) { throw new TooManyListeners(); } } public static byte[] hexStr2Byte(String hex) { ByteBuffer bf = ByteBuffer.allocate(hex.length() / 2); for (int i = 0; i < hex.length(); i++) { String hexStr = hex.charAt(i) + ""; i++; hexStr += hex.charAt(i); byte b = (byte) Integer.parseInt(hexStr, 16); bf.put(b); } return bf.array(); } public static String strTo16(String s) { String str = ""; for (int i = 0; i < s.length(); i++) { int ch = (int) s.charAt(i); String s4 = Integer.toHexString(ch); str = str + s4; } return str; } public static String toChineseHex(String s) { String ss = s; byte[] bt = new byte[0]; try { bt = ss.getBytes("GBK"); }catch (Exception e){ e.printStackTrace(); } String s1 = ""; for (int i = 0; i < bt.length; i++) { String tempStr = Integer.toHexString(bt[i]); if (tempStr.length() > 2) tempStr = tempStr.substring(tempStr.length() - 2); s1 = s1 + tempStr + ""; } return s1.toUpperCase(); } public static void main(String[] args) { try { System.out.println(toChineseHex("1111") ); SerialPort serialPort = SerialPortManager.openPort("COM3", 9600); System.out.println(strTo16("测试")); SerialPortManager.sendToPort(serialPort, hexStr2Byte("19"+strTo16("R1234567")+"8A"+toChineseHex("测试")+"18")); byte[] b = SerialPortManager.readFromPort(serialPort); serialPort.close(); if(b != null){ String reciString = new String(b); System.out.println(reciString); } }catch (Exception e1){ e1.printStackTrace(); } } }