




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
安装手册1. 常见的Java串口包目 前,常见的Java串口包有SUN在1998年发布的串口通信API:comm2.0.jar(Windows下)、 comm3.0.jar(Linux/Solaris);IBM的串口通信API以及一个开源的实现。鉴于在Windows下SUN的API比较常用以及 IBM的实现和SUN的在API层面都是一样的,那个开源的实现又不像两家大厂的产品那样让人放心,这里就只介绍SUN的串口通信API在Windows 平台下的使用。2. 串口包的安装(Windows下)到SUN的网站下载javacomm20-win32.zip,包含的东西如下所示:按 照其使用说明(Readme.html)的说法,要想使用串口包进行串口通信,除了设置好环境变量之外,还要将win32com.dll复制 到bin目录下;将comm.jar复制到lib;把perties也同 样拷贝到lib目录下。然而在真正运行使用串口包的时候,仅作这些是不够的。因为通常当运行“java MyApp”的时候,是由JRE下的虚拟机启动MyApp的。而我们只复制上述文件到JDK相应目录下,所以应用程序将会提示找不到串口。解决这个问题的 方法很简单,我们只须将上面提到的文件放到JRE相应的目录下就可以了。简洁说明:1.将win32com.dll拷贝到到bin目录下;将comm.jar复制到lib;把 perties也同 样拷贝到lib目录下.2. 当运行“java MyApp”的时候,是由JRE下的虚拟机启动MyApp的。应用程序将会提示找不到串口。须将上面提到的文件放到JRE相应的目录下,如果是myeclipse运行在拷贝到其下的加热文件对应的目录下。3. 程序调用3.1 MessageSender 发送短信主类import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.util.Enumeration;import java.util.TooManyListenersException;import m.CommPortIdentifier;import m.NoSuchPortException;import m.PortInUseException;import m.SerialPort;import m.SerialPortEvent;import m.SerialPortEventListener;import m.UnsupportedCommOperationException;/* * 发送手机短信的主接口 本接口为singleton * * author closed * */public class MessageSender extends Thread implements SerialPortEventListener private static final int baudRate = 9600; / /波特率private static String portName = COM1; / /端口名private static String portOwnerName = rms; / /串口所有者名/private boolean sendOKFlag;/private String smContent;/private String smscAddress = null;/private int errCount;private PduPack pack;private static SerialPort sPort = null; / /串口public static boolean isPduMode = false;public static MessageSender ms = null;public static final String clazzName = com.qbs.rms.business.sms.MessageSender; / / 单例构造类名称private MessageSender() init();/* * 列出本机所有可用的串口名称 本方法只为测试工作环境是否配置正确以及串口连接是否成功的一个方法,不对外 */public void listPortChoices() Enumeration em = CommPortIdentifier.getPortIdentifiers();while (em.hasMoreElements() CommPortIdentifier p = (CommPortIdentifier) em.nextElement();if (p.getPortType() = CommPortIdentifier.PORT_SERIAL)System.out.println(p.getName();/* * 初始化,设置串口波特率、奇偶校验位等 */private void init() try CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(portName);/ 打开端口.延迟等待为300mssPort = (SerialPort) portId.open(portOwnerName, 300);/ 设置串口参数sPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8,SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);/ 设置监听发送、接收短信的监听器sPort.addEventListener(this);sPort.notifyOnDataAvailable(true);/System.out.println(sPort.getFlowControlMode(); catch (NoSuchPortException e) sPort.close();e.printStackTrace(); catch (PortInUseException e) sPort.close();e.printStackTrace(); catch (UnsupportedCommOperationException e) sPort.close();e.printStackTrace(); catch (TooManyListenersException e) / TODO Auto-generated catch blocke.printStackTrace();/* * 获得手机短信接口实例 * * return */public static MessageSender getInstance() if (ms = null) try Class c = Class.forName(clazzName);ms = (MessageSender) c.newInstance(); catch (Exception e) System.out.println(获得短信接口发生错误!);e.printStackTrace();return ms;/* * 发送短信 本接口只针对西门子TC35芯片 * * param phone * 手机号码 * param content * 手机短信内容 */public void sendMessage(String phone, String content) String cmd = ;/设置短信参数:目的手机号、短信中心号、短信内容。pack = new PduPack();pack.setAddr(phone);pack.setSmsc(+8613800230500);pack.setMsgContent(content);/获得pdu转码后的字符串String coded = pack.getCodedResult();/System.out.println(pack.getMsgLen();if (coded != null & coded.length() 18) /设置pdu转码后TPDU的十进制长度:15+消息的长度cmd = AT+CMGS=+ (coded.length()-2) / 2 + r;content = coded; else cmd += AT+CMGS=+86 + phone + r;content = coded;/System.out.println(cmd);try / 发送指令,格式为PDU/ TODO/ 发送指令及号码send(cmd, false);sleep(100);/ 发送信息内容send(content, true); catch (IOException e) sPort.close();e.printStackTrace(); catch (InterruptedException e) sPort.close();e.printStackTrace();/* * 往串口写入数据 * * param message * 信息 * param 标志位 * false:未完成 true:完成 * throws IOException * throws InterruptedException */private void send(String message, boolean flag) throws IOException,InterruptedException /System.out.println(the message is: + message);DataOutputStream pw;pw = new DataOutputStream(sPort.getOutputStream();pw.write(message.getBytes();if (flag) pw.write(26);pw.flush();pw.close();/* * 接收短信 本接口暂不实现 * * return */public String receiveMessage() return ;/* * 回应事件监听 读出手机模块芯片的缓存 * * param ev * return */public synchronized void serialEvent(SerialPortEvent ev) /System.out.println(-I am listening-);DataInputStream in;int c = 0;StringBuffer sb = null;/ 如果有串口事件发生if (ev.getEventType() = SerialPortEvent.DATA_AVAILABLE) try in = new DataInputStream(sPort.getInputStream();sb = new StringBuffer();while (c = in.read() != -1) sb.append(char) c);if (handleRecData(sb) System.out.println(从Modem接收到的数据 + sb);sb = new StringBuffer(); catch (IOException e) e.printStackTrace();private boolean handleRecData(StringBuffer sb) return true;protected void finalize() throws Throwable sPort.close();super.finalize();3.2 处理编码格式类:PduPackpublic class PduPack / 短消息中心号长度private String smscLen;private String smscFormat;/ 短消息中心号private String smsc;/ 源地址长度private int addrLen;private String addrFormat;/ 源地址private String addr;/ 短消息内容编码方式,tp_dcsprivate String msgCoding;/ 时间戳,tp_scts/ private String timestamp;private int msgLen;/ 短消息内容,tp_udprivate String msgContent;public PduPack() smscLen = 08;/ 指的是短信中心号的长度smscFormat = 91;/ 指的是短信息中心号码类型addrLen = 13;/ 目的手机号长度addrFormat = 91;/* * 获得中心号码长度 * * return */public String getSmscLen() return smscLen;public PduPack(String src) if (src != null & src.length() 44) String temp = src.substring(4, 18);smsc = GFSerChange(temp);if (smsc != null & smsc.length() 1) smsc = smsc.substring(0, smsc.length() - 1);if (smsc.length() = 13)smsc = smsc.substring(2);temp = src.substring(20, 22);addrLen = Integer.parseInt(temp, 16);if (addrLen % 2 = 0)temp = src.substring(24, 24 + addrLen);elsetemp = src.substring(24, 24 + addrLen + 1);addr = GFSerChange(temp);/ 去掉为补齐为偶数加上的那一位if (addr != null & addr.length() % 2 = 0) addr = addr.substring(0, addr.length() - 1);if (addr.length() = 13)/ 如果前面有86,去掉它addr = addr.substring(2);if (addrLen % 2 = 0) msgCoding = src.substring(24 + addrLen + 2, 24 + addrLen + 4);temp = src.substring(24 + addrLen + 4 + 16); else msgCoding = src.substring(24 + addrLen + 3, 24 + addrLen + 5);temp = src.substring(24 + addrLen + 5 + 16);if (msgCoding.equals(08)msgContent = GFString.unicode2gb(temp);elsemsgContent = GFString.decode7bit(temp);/* * 设置短信中心号码并按两位两位转换编码 * * param s * 中心號碼 */public void setSmsc(String s) if (s != null) String centerNo = null;if (s.length() = 11 & s.substring(0, 2).equals(13) centerNo = 86 + s; else if (s.length() = 13 & s.substring(0, 4).equals(8613) centerNo = s; else if (s.length() = 14 & s.substring(0, 5).equals(+8613) centerNo = s.substring(1); elsereturn;this.smsc = GFSerChange(centerNo);/* * * 设置目标手机号码并编码 * */public void setAddr(String ad) if (ad != null) String centerNo = null;if (ad.length() = 11 & ad.substring(0, 2).equals(13) centerNo = 86 + ad; else if (ad.length() = 13 & ad.substring(0, 4).equals(8613) centerNo = ad; else if (ad.length() = 14 & ad.substring(0, 5).equals(+8613) centerNo = ad.substring(1); else if (ad.length() 0) / 特服号addrFormat = A1;addrLen = ad.length();centerNo = ad; elsereturn;addr = GFSerChange(centerNo);/* */* * 设置编码方式 * * param encoding * 0:表示7-BIT编码 4:表示8-BIT编码 8:表示UCS2编码 */public void setMsgCoding(int encoding) if (encoding = 8)msgCoding = 08;else if (encoding = 4)msgCoding = 04;elsemsgCoding = 00;/* * * 短消息内容 * * param content */public void setMsgContent(String content) if (content != null) if (content.length() = content.getBytes().length) msgCoding = 00;msgLen = content.getBytes().length;msgContent = encode7bit(content); else msgCoding = 08;msgContent = GFString.gb2unicode(content);if (msgContent != null)msgLen = msgContent.length() / 2;if (msgContent != null) msgContent = msgContent.toUpperCase();/* * * return 经过PDU编码的结果,十六进制字符串形式 */public String getCodedResult() String result = null;final String tp_sca = 00;/ SCA以00写入,应用默认的服务中心地址final String tp_mti = 11;/ PDU类型final String tp_mr = 00;/ TPMR表示MR 消息 参考final String tp_pid = 00;/ TPPID协议标示final String tp_vp = 00;/ TPVP有效期if (addr != null & msgContent != null) result = tp_sca + tp_mti + tp_mr+ GFString.byte2hex(byte) addrLen)/ 接收号字符数+ addrFormat/ 表示是国内代码+ addr/ 编码时长度为奇数末尾追加“F”每两个字节进行位置交换,如 编码后,3163774802F0+ tp_pid + msgCoding / TPDCS数据编码方式+ tp_vp + GFString.byte2hex(byte) msgLen)/ UDL用户数据长度,用十六制表示+ msgContent;/ 短信内容的UNICODE编码result = result.toUpperCase();return result;public String getAddr() return addr;public String getMsgCoding() return msgCoding;public String getMsgContent() return msgContent;public int getMsgLen() return msgLen;public String getSmsc() return smsc;/* */* * 7-BIT编码 把ASCII码值最高位为0的字符串进行压缩转换成8位二进制表示的字符串 * * param src * return */public static String encode7bit(String src) String result = null;String hex = null;byte value;if (src != null & src.length() = src.getBytes().length) result = ;byte left = 0;byte b = src.getBytes();for (int i = 0, j = 0; i b.length; i+) j = i & 7;if (j = 0)left = bi;else value = (byte) (bi j);hex = GFString.byte2hex(byte) value);result += hex;if (i = b.length - 1)result += GFString.byte2hex(left);result = result.toUpperCase();return result;/* */* * 对7-BIT编码进行解码 * * param src * 十六进制的字符串,且为偶数个 * return 源字符串 */public static String decode7bit(String src) String result = null;int b;String temp = null;byte srcAscii;byte left = 0;if (src != null & src.length() % 2 = 0) result = ;b = new intsrc.length() / 2;temp = src + 0;for (int i = 0, j = 0, k = 0; i temp.length() - 2; i += 2, j+) bj = Integer.parseInt(temp.substring(i, i + 2), 16);k = j % 7;srcAscii = (byte) (bj (7 - k);if (k = 6) result += (char) left;left = 0;if (j = src.length() / 2)result += (char) left;return result;/* */* * 把UNICODE编码的字符串转化成汉字编码的字符串 * * param hexString * return */public static String unicode2gb(String hexString) StringBuffer sb = new StringBuffer();if (hexString = null)return null;for (int i = 0; i + 4 = hexString.length(); i = i + 4) try int j = Integer.parseInt(hexString.substring(i, i + 4), 16);sb.append(char) j); catch (NumberFormatException e) return hexString;return sb.toString();/* */* * 把汉字转化成UNICODE编码的字符串 * * param gbString * return */public static String gb2unicode(String gbString) String result = ;char c;int value;if (gbString = null)return null;String temp = null;c = new chargbString.length();StringBuffer sb = new StringBuffer(gbString);sb.getChars(0, sb.length(), c, 0);for (int i = 0; i c.length; i+) value = (int) ci;temp = Integer.toHexString(value);result += GFString.fill(temp, 4);return result.toUpperCase();class GFString /* * 把相临的两个字符对换,字符串长度为奇数时最后加“F” * * param src * return */public static String interChange(String src) String result = null;if (src != null) if (src.length() % 2 != 0)src += F;src += 0;/ 多加1位为了后面截取字符串方便,实际上还是没有增加此0result = ;for (int i = 0; i src.length() - 2; i += 2) result += src.substring(i + 1, i + 2);result += src.substring(i, i + 1);return result;/* * * 把中文转换成Unicode编码格式的字符 * * param gbString * 中文字符串 * return Unicode字符 */public static String gb2unicode(String gbString) String result = ;char c;int value;if (gbString = null)return null;String temp = null;c = new chargbString.length();StringBuffer sb = new StringBuffer(gbString);sb.getChars(0, sb.length(), c, 0);for (int i = 0; i c.length; i+) value = (int) ci;temp = Integer.toHexString(value);result += fill(temp, 4);return result.toUpperCase();/* * 填充字符串“0”到字符串前面 * * param temp * 原字符串 * param totalbit * 字符串长度小于此值才填充“0” * return 填充后的字符串 */public static String fill(String temp, int totalbit) String t = temp;while (t.length() totalbit) t = 0 + t;return t;/* * 对7-BIT编码进行解码 * * param src * 十六进制的字符串,且为偶数个 * return 源字符串 */public static String decode7bit(String src) String result = null;int b;String temp = null;byte srcAscii;byte left = 0;if (src != null & src.length() % 2 = 0) result = ;b = new intsrc.length() / 2;temp = src + 0;for (int i = 0, j = 0, k = 0; i temp.length() - 2; i += 2, j+) bj = Integer.parseInt(temp.substring(i, i + 2), 16);k = j % 7;srcAscii = (byte) (bj (7 - k);if (k = 6) result += (char) left;left = 0;if (j = src.length() / 2)result += (char) left;return result;/* * 对8-BIT编码进行解码 * * param src * 被解码的字符串 * return 源字符串 */public static String decode8bit(String src) String temp = src;String result = ;for (int i = 0; i src.length() - 2; i += 2)result += (char) Integer.parseInt(temp.substring(i, i + 2), 16);return result;/* * 把UNICODE编码的字符串转化成汉字编码的字符串 * * param hexString * return */public static String unicode2gb(String hexString) StringBuffer sb = new StringBuffer();if (hexString = null)return null;for (int i = 0; i + 4 = hexString.length(); i = i + 4) try int j = Integer.parseInt(hexString.substring(i, i + 4), 16);sb.append(char) j); catch (NumberFormatException e) return hexString;return sb.toString();/* * * 字节码数组转换成16进制字符串 * * param b * return */public static String byte2hex(byte b) String hs = ;String stmp = ;for (int n = 0; n b.length; n+) stmp = (java.lang.Integer.toHexString(bn & 0XFF);if (stmp.length() = 1)hs = hs + 0 + stmp;els
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年蚌埠市淮上区公办幼儿园公开招聘学前教育教师8名考试参考题库及答案解析
- 电池厂采购合同实施办法
- 2025辽宁大连长兴岛经济技术开发区招聘社区工作者16人考试参考题库及答案解析
- 2025江苏苏州大学附属儿童医院招聘考核(第二批)备考考试试题及答案解析
- 2025河南昌市特招医学院校毕业生和特岗全科医生招聘157人考试模拟试题及答案解析
- 2025年井冈山市自然资源局面向社会公开招聘食堂管理员考试参考题库及答案解析
- 2025年度孝感市法院系统招聘雇员制审判辅助人员考察考试模拟试题及答案解析
- 2025年大庆龙南医院招聘救护车担架员18人备考模拟试题及答案解析
- 2025年哈尔滨市骨伤科医院编外聘用人员招聘考试参考题库及答案解析
- 2025河南南阳市第二人民医院招聘专业技术人员3人考试模拟试题及答案解析
- 遴选笔试真题及答案
- 2025年消防经济学试题及答案
- 医疗科室外包合同协议书
- 基于核心素养的中小学安全教育课程设计与实施路径
- 2025年医院安全员安全技能测试
- 网络安全技术培训
- 超级充电综合站及配套设施建设项目可行性研究报告
- 中国心房颤动管理指南2025解读
- 《云计算与大数据》课件第3章“大数据”关键技术与应用
- 2025-2026学年人教大同版(2024)小学英语三年级上册教学计划及进度表
- 2025年兽医实验室理论考试题库及答案详解【夺冠系列】
评论
0/150
提交评论