- 浏览: 182253 次
- 性别:
- 来自: 北京
文章分类
最新评论
在Java中操作串口实现短信收发
采用串口操作进行短信收发,是比较常见的一种方式.比如,很多群发软件,用的就是这种方法.
1.配置comm.jar.
Comm.jar是Sub实现底层串口操作的API,调用了本地的DLL文件,因为Java本身不具备直接访问硬件设置的能力,都是通过调用本地方法来实现的.可以Java的官方网站下载.下载之后把其中Comm.jar包导入到工程的Classpath中,把另外两个非常重要的文件javax.comm.properties和win32com.dll考贝到你的工程目录下,即java.user下.
2.打开串口.
在打开串口前首先要加载Win32com.dll,因为我们没有把它放到JRE路径下,所以必须要自己显式的加载.
String driverName = "com.sun.comm.Win32Driver";
CommDriver driver = null;
try {
System.loadLibrary("win32com");
driver = (CommDriver) Class.forName(driverName).newInstance();
driver.initialize();
} catch (InstantiationException e1) {
logger.error("1:" + e1.getMessage());
} catch (IllegalAccessException e1) {
logger.error("2:" + e1.getMessage());
} catch (ClassNotFoundException e1) {
logger.error(e1.getMessage());
}
然后获取你指定的端口:
SerialPort sPort = null;
CommPortIdentifier portID;
String owner = new String("modemn");
int keeptime = 5000;
Enumeration portList;
portList = CommPortIdentifier.getPortIdentifiers();
// 如果有多个端口
while (portList.hasMoreElements()) {
portID = (CommPortIdentifier) portList.nextElement();
if (portID.getName().equals(com))
try {
sPort = (SerialPort) portID.open(owner, keeptime);
break;
}// 打开一个串口
catch (PortInUseException e) {
logger.fatal(e.getMessage());
System.exit(1);
}
}// while
成功打开端口之后,设置端口的相关参数,如波特率、数据位、奇偶校验位等.这个跟具体的设备有关,不过一般情况下波特率为9600,数据位为8,停止位为1,奇偶为0,流量控制为Off:
if (sPort != null) {
logger.debug("serial name is :" + sPort.getName());
try {
// 设置串口的参数
sPort.setSerialPortParams(9600,// 波特率
SerialPort.DATABITS_8,// 数据位数
SerialPort.STOPBITS_1, // 停止位
SerialPort.PARITY_NONE);// 奇偶位
} catch (UnsupportedCommOperationException e) {
e.printStackTrace();
logger.error(e.getMessage());
}
}
3.对端口进行初始化
对进行数据接收或发送之前,还要先进行一些参数的设置。重要的有:
AT+cmgf=0(设置Modem收发采用Pdu方式,1为Text方式。有些Modem可能正好相反,具体参考Modem的At指令说明)
At+cnmi=2,2,0,0,0(设置Modem自动接收,AT指令说明书给的定义是新的短消息指示说明,就是说说有了新的短消息,怎么给你提示。这个设置是有消息将自动显示,无需进行读卡操作。看到有很网上的例子都是1,1,这样还要通过读卡操作才能得到短消息,十分不方便,还降低了SIM卡的使用寿命)
At+csmp=17,167,0,240(设置短消息文本模式参数。其中17是指SMS-SUBMIT的十进制整数表达形式,即提交;167指是有效期的整数表达形式;0指的是协议标识的十进制整数表示形式。前三个参数都该命令的默认值。最后一240指是编码方案,在Text方式下发送英文和Pdu模式下一般设置成240.如果要在Text模式下发送中文,有多Modem要设成8)
对端口所作的上述初始化工作,可以在超终终端里直接设置。但最好是把它写在程序里,在程序启动之后就进行此工作,避免手工操作的麻烦。
对Modem进行初始化,就必须把上述命令输出到Modem的端口上,还要看它的反回值是不是OK。要想得到返回值,就要对COM端口进行侦听了。所以初始化的工作有三步:
第一,侦听端口
sPort.addEventListener(this);
sPort.notifyOnDataAvailable(true);
第二,建立输入输出流,把初始化命令输出到Modem的COM端口
// 用配置参数初始化MODEM
msg = conf.initParam();
if (msg != null) {
if (conf.modemMode() != null && conf.modemMode().equals("0"))
if (isPduMode)
msg = "at+cmgf=0;" + msg;
else
msg = "at+cmgf=1;" + msg;
sendMsg(msg.getBytes(), sPort);
sendOKFlag = true;
}
// 把短消息通过数据猫发送出去
private void sendMsg(byte[] msg, SerialPort sPort) {
DataOutputStream pw;
if (msg != null && sPort != null)
try {
pw = new DataOutputStream(sPort.getOutputStream());
pw.write(msg);
pw.flush();
pw.close();
logger.debug("msg has been send from Modemn:");
} catch (IOException e) {
logger.error(e.getMessage());
e.printStackTrace();
}
}
// 处理侦听到的串口事件
public synchronized void serialEvent(SerialPortEvent ev) {
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);
System.out.println(sb);
if (handleRecData(sb)) {
logger.debug("从Modem接收到的数据" + sb);
sb = new StringBuffer();
}
}
}// try
catch (IOException e) {
logger.error(e.getMessage());
e.printStackTrace();
}
}
}
serialEvent事件就是刚才添加侦听之后要工作的部分。如果写过界面程序的人,对这个会比较熟悉。一但Modem回复数据,此事件就会触发。我们在发送完初始化命令之后,就从此事件中接收数据,看能不能收到OK。如果收到,就初始化成功。
1.配置comm.jar.
Comm.jar是Sub实现底层串口操作的API,调用了本地的DLL文件,因为Java本身不具备直接访问硬件设置的能力,都是通过调用本地方法来实现的.可以Java的官方网站下载.下载之后把其中Comm.jar包导入到工程的Classpath中,把另外两个非常重要的文件javax.comm.properties和win32com.dll考贝到你的工程目录下,即java.user下.
2.打开串口.
在打开串口前首先要加载Win32com.dll,因为我们没有把它放到JRE路径下,所以必须要自己显式的加载.
String driverName = "com.sun.comm.Win32Driver";
CommDriver driver = null;
try {
System.loadLibrary("win32com");
driver = (CommDriver) Class.forName(driverName).newInstance();
driver.initialize();
} catch (InstantiationException e1) {
logger.error("1:" + e1.getMessage());
} catch (IllegalAccessException e1) {
logger.error("2:" + e1.getMessage());
} catch (ClassNotFoundException e1) {
logger.error(e1.getMessage());
}
然后获取你指定的端口:
SerialPort sPort = null;
CommPortIdentifier portID;
String owner = new String("modemn");
int keeptime = 5000;
Enumeration portList;
portList = CommPortIdentifier.getPortIdentifiers();
// 如果有多个端口
while (portList.hasMoreElements()) {
portID = (CommPortIdentifier) portList.nextElement();
if (portID.getName().equals(com))
try {
sPort = (SerialPort) portID.open(owner, keeptime);
break;
}// 打开一个串口
catch (PortInUseException e) {
logger.fatal(e.getMessage());
System.exit(1);
}
}// while
成功打开端口之后,设置端口的相关参数,如波特率、数据位、奇偶校验位等.这个跟具体的设备有关,不过一般情况下波特率为9600,数据位为8,停止位为1,奇偶为0,流量控制为Off:
if (sPort != null) {
logger.debug("serial name is :" + sPort.getName());
try {
// 设置串口的参数
sPort.setSerialPortParams(9600,// 波特率
SerialPort.DATABITS_8,// 数据位数
SerialPort.STOPBITS_1, // 停止位
SerialPort.PARITY_NONE);// 奇偶位
} catch (UnsupportedCommOperationException e) {
e.printStackTrace();
logger.error(e.getMessage());
}
}
3.对端口进行初始化
对进行数据接收或发送之前,还要先进行一些参数的设置。重要的有:
AT+cmgf=0(设置Modem收发采用Pdu方式,1为Text方式。有些Modem可能正好相反,具体参考Modem的At指令说明)
At+cnmi=2,2,0,0,0(设置Modem自动接收,AT指令说明书给的定义是新的短消息指示说明,就是说说有了新的短消息,怎么给你提示。这个设置是有消息将自动显示,无需进行读卡操作。看到有很网上的例子都是1,1,这样还要通过读卡操作才能得到短消息,十分不方便,还降低了SIM卡的使用寿命)
At+csmp=17,167,0,240(设置短消息文本模式参数。其中17是指SMS-SUBMIT的十进制整数表达形式,即提交;167指是有效期的整数表达形式;0指的是协议标识的十进制整数表示形式。前三个参数都该命令的默认值。最后一240指是编码方案,在Text方式下发送英文和Pdu模式下一般设置成240.如果要在Text模式下发送中文,有多Modem要设成8)
对端口所作的上述初始化工作,可以在超终终端里直接设置。但最好是把它写在程序里,在程序启动之后就进行此工作,避免手工操作的麻烦。
对Modem进行初始化,就必须把上述命令输出到Modem的端口上,还要看它的反回值是不是OK。要想得到返回值,就要对COM端口进行侦听了。所以初始化的工作有三步:
第一,侦听端口
sPort.addEventListener(this);
sPort.notifyOnDataAvailable(true);
第二,建立输入输出流,把初始化命令输出到Modem的COM端口
// 用配置参数初始化MODEM
msg = conf.initParam();
if (msg != null) {
if (conf.modemMode() != null && conf.modemMode().equals("0"))
if (isPduMode)
msg = "at+cmgf=0;" + msg;
else
msg = "at+cmgf=1;" + msg;
sendMsg(msg.getBytes(), sPort);
sendOKFlag = true;
}
// 把短消息通过数据猫发送出去
private void sendMsg(byte[] msg, SerialPort sPort) {
DataOutputStream pw;
if (msg != null && sPort != null)
try {
pw = new DataOutputStream(sPort.getOutputStream());
pw.write(msg);
pw.flush();
pw.close();
logger.debug("msg has been send from Modemn:");
} catch (IOException e) {
logger.error(e.getMessage());
e.printStackTrace();
}
}
// 处理侦听到的串口事件
public synchronized void serialEvent(SerialPortEvent ev) {
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);
System.out.println(sb);
if (handleRecData(sb)) {
logger.debug("从Modem接收到的数据" + sb);
sb = new StringBuffer();
}
}
}// try
catch (IOException e) {
logger.error(e.getMessage());
e.printStackTrace();
}
}
}
serialEvent事件就是刚才添加侦听之后要工作的部分。如果写过界面程序的人,对这个会比较熟悉。一但Modem回复数据,此事件就会触发。我们在发送完初始化命令之后,就从此事件中接收数据,看能不能收到OK。如果收到,就初始化成功。
发表评论
-
人民币转换数字
2012-11-07 15:14 1124该贴原因: ... -
个人收集的java精品网站
2012-05-30 08:19 0java进阶网 http://www.javady.com ... -
JVM(java 虚拟机)内存设置
2011-06-02 16:37 15194JVM(java 虚拟机)内存 ... -
汉字全半角转化程序
2011-02-25 08:52 1482转载一个牛人的。方便以后查看使用: 也许. 这个代码对很多人 ... -
md5JAVA实现
2010-06-07 22:43 1205MD5算法研究 MD5的 ... -
在Java中操作串口实现短信收发2
2010-06-07 22:08 14094.发送数据成功进行初 ... -
JVM内存参数调优
2010-06-07 22:03 1978JVM内存参数调优 我们前面所提到的堆内存(heap)是由 ... -
多线程程序设计的要点
2010-06-07 22:00 861多线程中有主内存和工 ... -
Java 处理事务精要
2010-06-07 21:58 996简单事务的概念 我 ... -
如何开公司及手续过程
2010-06-07 21:55 1219注册一个公司,首先想好经营什么,怎样经营好,再来注册。要不,注 ... -
运用加密技术保护Java源代码
2010-06-07 21:52 950Java程序的源代码很容易被别人偷看,只要有一个反编译器,任何 ... -
连接池的基本工作原理
2010-06-07 21:39 848连接池的基本工作原理 1、基本概念及原理 由上面的分析可以 ... -
高效的Java音乐播放类
2010-06-07 21:34 1537/** *//** * 自动播放,循环停止后结束。 ... -
高效的Java音乐播放类 2
2010-06-07 21:32 1200/** *//** * 直接播放url文件 * ... -
高效的Java音乐播放类
2010-06-07 21:26 1377Java音频播放,因为必须依赖到本地环境,所以JAVA在音频处 ... -
用开源的 InnoSetup 为 Java 应用制作 Windows 安装程序
2010-04-24 11:30 1685在这个例子里, 我将给大家展示如何使用 InnoSetup 自 ... -
Swing: 用 GlassPane 显示一个透明的正在操作框
2010-04-24 10:25 2033这个组件可以让用户看到界面里的显示但是无法操作. 需要的图: ... -
文本放大器
2010-04-24 10:06 1281/** * @(#)Text2Image.java 1.0 D ... -
在自定义 JToolTip 里面显示组件
2010-04-24 10:03 2326在自定义 JToolTip 里面显示组件 我们经常可以看 ... -
JIDE的开源Swing组件
2010-04-24 09:57 9606虽然它们早就开源了(去年吧),我也是今天才看到,虽然目前也用不 ...
相关推荐
在本案例中,Java程序通过串口与GSM modem或其他支持短信功能的硬件设备连接,实现短信的收发。 4. **GSM Modem**:GSM modem是一种能够接入GSM网络的设备,它可以连接到计算机的串口,通过AT命令集控制,实现短信...
Java 实现通过串口与 GSM 猫相连发送短信是一个常见的通信应用场景,主要涉及 Java 的串口编程技术以及 SMS(Short Message Service)协议的理解。在本文中,我们将深入探讨这个主题,了解如何利用 Java 来操作串行...
在"短信猫收发例子"中,这个OCX控件可能封装了与短信猫进行通信的函数和方法,包括初始化串口、发送短信、接收短信、查询状态等功能。开发者可以通过调用这些控件的方法,实现对短信猫的操作。 文件名为"smsdemo_pb...
总结起来,通过Java实现基于短信猫的短信收发,需要深入理解PDU编码机制,掌握串口通信技术,以及对短信猫硬件特性的了解。通过上述的各个Java类,我们可以构建一个完整的短信收发系统,实现高效、可靠的短信服务。
Java短信猫收发短信的例子是基于Java编程语言实现的一个实用工具,主要用于与短信猫设备进行交互,实现短信的发送和接收功能。短信猫是一种硬件设备,通常通过USB或串口连接到计算机,使得电脑能够通过GSM网络发送和...
1. **Java串口通信**: Java的标准库提供了`javax.comm`包,用于处理串行通信。这个包包含了`CommPortIdentifier`、`SerialPort`和`SerialStream`等类,可以用来识别、打开和配置串口。然而,需要注意的是,`javax....
在“SMS.rar”这个压缩包中,可能包含了示例代码或详细教程,帮助开发者理解如何使用Java和AT命令进行串口短信收发的具体步骤。学习这些内容有助于开发相关应用,例如远程监控系统、自动报警系统或物联网设备的通信...
6. **错误处理和调试**:在实现过程中,可能遇到如超时、数据错乱、短信发送失败等问题,需要编写适当的错误处理代码,并利用串口终端软件进行调试,查看通信过程中的原始数据。 7. **安全性与隐私**:由于短信可能...
综上所述,Java短信猫多串口收短信涉及到Java串口通信、smslib库的使用、多线程编程以及错误处理等多个知识点。通过理解和实践这些技术,可以构建出稳定可靠的短信服务系统。在开发过程中,不断学习和优化,可以有效...
在IT行业中,尤其是在通信与自动化领域,通过编程语言如Java来控制硬件设备是常见的需求。本教程将聚焦于如何利用Java...在实际开发中,确保对硬件设备的理解和Java串口编程的熟练掌握,将有助于提升你的解决方案质量。
java读取串口通过AT指令发送短信 操作短信猫进行收发短信
在实现短信息收发时,需要了解CDMA MODEM的短信息数据协议格式,包括短信息的发送、接收、删除、存储等操作。同时,需要使用AT指令来控制CDMA MODEM的各种通信功能,例如呼叫、接听、短信息接收和发送等。 在搭建...
总结起来,使用SMSLib在Java项目中实现短信收发功能,需要理解Java串口通信的基本原理,正确配置相关库,然后通过SMSLib提供的API调用来实现短信的发送和接收。这为开发者提供了一种高效且无需深入了解底层细节的...
使用java SMslib实现了短信猫收发短信。串口开发,串口配置工具,配合了完整的测试用例,可以使用到项目中。
KEIL中如何用虚拟串口调试串口程序.doc Message PDU编码规则.doc QHDQ-29DDDAD3A0.LOG SMSLib串口通信.doc 串口常用参数.doc 关于java使用javacomm20.doc 常见的进制转换方法.doc 浅谈Java串行端口技术协议.doc 短信...
综上所述,Java短信收发涉及到API集成、硬件设备交互、协议理解、安全性、性能优化等多个方面,是一个综合性的技术实践。通过学习和实践这些知识点,开发者可以构建出稳定且高效的短信服务系统。
由于前段时间做的系统需要使用短信猫收发短信,所以研究了一下在Java下使用短信猫,网上很多资料都是使用的smslib的jar包来发送短信,但是这种方式只支持32的jdk,而我的系统使用的是linux的64位环境,所以最后采用...
本示例将详细介绍如何使用RXTX库在Java中实现通过AT指令控制短信猫进行收发短信的功能。 首先,你需要安装RXTX库。提供的压缩包文件`rxtx-2.1-7-bins-r2.zip`和`rxtx-2.2pre2-bins.zip`包含了RXTX的不同版本。解压...
综上所述,Java短信收发文档提供了一个基于smslib库的解决方案,用于通过短信猫在Java应用程序中实现短信服务。这涉及到硬件驱动的安装、配置文件的管理、Java代码的编写以及库的使用等多个方面,是Java与硬件设备...