java 操作串口实现短信收发
来源:互联网 发布:丽晶软件股份 编辑:程序博客网 时间:2024/05/16 00:54
package com.gftech.dcs.commu;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.TooManyListenersException;
import javax.comm.CommDriver;
import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import com.gftech.common.PduPack;
import com.gftech.smp.DeliverPack;
import com.gftech.smp.SubmitPack;
public class ModemAdapter extends Thread implements SerialPortEventListener {
private static ModemAdapter modem;
// 发送是否已成功完成
private boolean sendOKFlag;
private int errCount;
// 发送模式是否是PDU方式
private boolean isPduMode;
private String smContent;
private ArrayList sendBuffer;
// 要打开使用的串口
private SerialPort sPort;
static Logger logger = Logger.getLogger(ModemAdapter.class);
private ModemAdapter() {
DOMConfigurator.configure(MyFinal.LOG4J_CONF_FILE);
isPduMode = false;
errCount = 0;
logger.debug("Add a test data");
sendBuffer = new ArrayList();
SubmitPack msg = new SubmitPack();
ArrayList destList = new ArrayList();
destList.add("136××××××××");
msg.setSm("你好,张新波");
msg.setDestAddr(destList);
add(msg);
start();
}
public static ModemAdapter getInstance() {
if (modem == null)
modem = new ModemAdapter();
return modem;
}
// 得到计算机的串口
private SerialPort getSerialPort(String com) {
SerialPort sPort = null;
CommPortIdentifier portID;
String owner = new String("modemn");
int keeptime = 5000;
Enumeration portList;
portList = CommPortIdentifier.getPortIdentifiers();
String driverName = "com.sun.comm.Win32Driver";
CommDriver driver = null;
try {
System.loadLibrary("win32com");
logger.debug("Win32Com Library Loaded");
driver = (CommDriver) Class.forName(driverName).newInstance();
driver.initialize();
logger.debug("Win32Driver Initialized");
} catch (InstantiationException e1) {
logger.error("1:" + e1.getMessage());
e1.printStackTrace();
} catch (IllegalAccessException e1) {
logger.error("2:" + e1.getMessage());
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
logger.error(e1.getMessage());
e1.printStackTrace();
}
// 如果有多个端口
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
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());
}
}
return sPort;
}
private boolean init() {
boolean result = false;
Config conf = new Config();
String comName = conf.comName();
sPort = getSerialPort(comName);
String msg = null;
if (sPort != null) {
listenSerialPort(sPort);
// 用配置参数初始化MODEM
msg = conf.initParam();
if (msg != null) {
if (conf.modemMode() != null && conf.modemMode().equals("0"))
isPduMode = true;
if (isPduMode)
msg = "at+cmgf=0;" + msg;
else
msg = "at+cmgf=1;" + msg;
sendMsg(msg, sPort);
sendOKFlag = true;
}
}
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(1000);
if (sendOKFlag) {
logger.debug("初始化MODEM成功!");
return true;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return result;
}
// 把短消息通过数据猫发送出去
private void sendMsg(String msg, SerialPort sPort) {
PrintWriter pw;
if (msg != null && sPort != null)
try {
pw = new PrintWriter(sPort.getOutputStream());
pw.println(msg);
pw.flush();
pw.close();
logger.debug("msg has been send from Modemn:");
logger.debug(msg);
} catch (IOException e) {
logger.error(e.getMessage());
e.printStackTrace();
}
}
// 把短消息通过数据猫发送出去
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();
}
}
private void listenSerialPort(SerialPort sPort) {
if (sPort != null)
try {
sPort.addEventListener(this);
sPort.notifyOnDataAvailable(true);
} catch (TooManyListenersException e) {
logger.error(e.getMessage());
e.printStackTrace();
}
}
public void run() {
int waitCount = 0;
String cmd1 = null;
SubmitPack msg;
String dest;
String content;
if (init()) {
while (true) {
try {
sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
msg = getOneMsg();
if (msg != null) {
ArrayList destList = msg.getDestAddr();
for (int i = 0; destList != null && i < destList.size(); i++) {
dest = (String) destList.get(i);
content = msg.getSm();
if (content != null) {
while (true) {
if (sendOKFlag == true) {
if (isPduMode) {
Config conf = new Config();
PduPack pack = new PduPack();
pack.setAddr(dest);
pack.setMsgContent(content);
pack.setSmsc(conf.smsc());
String coded = pack.getCodedResult();
if (coded != null
&& coded.length() > 18)
cmd1 = "AT+CMGS="
+ (coded.length() - 18) / 2
+ "\r";
smContent = coded
+ (char) Integer.parseInt("1A",
16);
// cmd1+=smContent;
sendMsg(cmd1.getBytes(), sPort);
cmd1 = null;
} else
cmd1 = "AT+CMGS="+86"
+ dest
+ ""\r"
+ content
+ (char) Integer.parseInt("1a",
16) + "z";
if (cmd1 != null) {
logger.debug("Cmd:" + cmd1);
sendMsg(cmd1, sPort);
sendOKFlag = false;
logger.debug("isSendOK=false");
}
break;
} else
try {
sleep(100);
if (waitCount > 300) {
sendOKFlag = true;
waitCount = 0;
} else
waitCount++;
} catch (InterruptedException e) {
}
}
}
}
}
}// while
} else {
logger.fatal("无法成功初始化MODEM,请检查设备");
System.exit(0);
}
}
// 处理侦听到的串口事件
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();
}
}
}
private boolean isRecOK(String data) {
final String OK_FLAG = "OK";
int index1 = 0;
if (data != null) {
index1 = data.indexOf(OK_FLAG);
if (index1 >= 0 && index1 + 4 <= data.length()) {
String t = data.substring(index1 + 2);
byte[] b = t.getBytes();
if (b.length >= 2) {
if (b[0] == 0x0D && b[1] == 0x0A)
return true;
}
}
}
return false;
}
private boolean isSendOK(String data) {
final String FLAG = "+CMGS:";
int index = -1;
int index2 = -1;
if (data != null) {
index = data.indexOf(FLAG);
if (index > 0) {
index += 6;
if (index < data.length()) {
String temp = data.substring(index);
index = 0;
byte[] b = temp.getBytes();
for (int i = 0; i < b.length; i++) {
if (b[i] == 0x0D) {
index2 = i;
break;
}
}
if (index2 < temp.length() && index2 > index + 1) {
String t1 = temp.substring(index + 1, index2);
try {
int seqid = Integer.parseInt(t1);
logger.debug("seqID:" + seqid);
if (index2 + 8 == temp.length()) {
// 两个回车换行符
if (b[index2] == 0x0D && b[++index2] == 0x0A
&& b[++index2] == 0x0D
&& b[++index2] == 0x0A) {
if (b[++index2] == 0x4F
&& b[++index2] == 0x4B) {// OK
if (b[++index2] == 0x0D
&& b[++index2] == 0x0A) {// 一个回车换行
return true;
}
}
}
}
} catch (NumberFormatException e) {
e.printStackTrace();
return false;
}
}
}
}
}
return false;
}
private boolean isRecError(String data) {
final String FLAG = "ERROR";
int index1 = 0;
if (data != null) {
index1 = data.indexOf(FLAG);
if (index1 >= 0 && index1 + 7 <= data.length()) {
String t = data.substring(index1 + 5);
byte[] b = t.getBytes();
if (b.length >= 2) {
if (b[0] == 0x0D && b[1] == 0x0A)
return true;
}
}
}
return false;
}
private boolean isRecData(String data) {
final String BEGIN_FLAG = "+CMT:";
int index0 = -1;
int index1 = -1;
int index2 = -1;
if (data != null) {
index0 = data.indexOf(BEGIN_FLAG);
if (index0 >= 0 && index0 < data.length()) {
// data=data.substring(index0);
// index1 = data.indexOf("\r\n");
// if (index1 > index0 && index1 + 2 < data.length()) {
// String str=data.substring(index1+2);
// index2=str.indexOf("\r\n");
// if(index2>0 && index2
//
// return true;
// }
// }
return true;
}
}
return false;
}
private boolean handleRecData(StringBuffer sb) {
String data = null;
if (sb != null) {
data = sb.toString();
if (isRecOK(data)) {
sendOKFlag = true;
return true;
} else if (isRecError(data)) {
errCount++;
if (errCount > 3) {
sendOKFlag = true;
errCount = 0;
}
return true;
} else if (sb.indexOf(">") != -1 && smContent != null) {
sendMsg(smContent.getBytes(), sPort);
smContent = null;
}
else {
int index0 = data.lastIndexOf("+CMT:");
if (index0 >= 0 && index0 < data.length()) {
data = data.substring(index0);
int index1 = data.indexOf("\r\n");
if (index1 != -1 && index1 + 2 < data.length()) {
data = data.substring(index1 + 2);
int index2 = data.indexOf("\r\n");
if (index2 > 1 && index2 < data.length()) {
data = data.substring(0, index2);
if (data != null && data.length() > 0) {
PduPack pack = new PduPack(data);
String srcAddr = pack.getAddr();
String content = pack.getMsgContent();
String destAddr = "012345";
if (srcAddr != null && content != null) {
logger.debug("srcAddr:"+srcAddr);
logger.debug("content:"+content);
Config conf = new Config();
destAddr = conf.cmppSSN();
DeliverPack deliver = new DeliverPack(
srcAddr, destAddr, content);
ServerAdapter server = ServerAdapter
.getInstance();
server.addDeliverPack(deliver);
return true;
}
}
}
}
}
}
}
return false;
}
private SubmitPack getOneMsg() {
SubmitPack result = null;
if (sendBuffer != null && sendBuffer.size() > 0)
result = (SubmitPack) sendBuffer.remove(0);
return result;
}
public void add(SubmitPack msg) {
sendBuffer.add(msg);
}
}
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.TooManyListenersException;
import javax.comm.CommDriver;
import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import com.gftech.common.PduPack;
import com.gftech.smp.DeliverPack;
import com.gftech.smp.SubmitPack;
public class ModemAdapter extends Thread implements SerialPortEventListener {
private static ModemAdapter modem;
// 发送是否已成功完成
private boolean sendOKFlag;
private int errCount;
// 发送模式是否是PDU方式
private boolean isPduMode;
private String smContent;
private ArrayList sendBuffer;
// 要打开使用的串口
private SerialPort sPort;
static Logger logger = Logger.getLogger(ModemAdapter.class);
private ModemAdapter() {
DOMConfigurator.configure(MyFinal.LOG4J_CONF_FILE);
isPduMode = false;
errCount = 0;
logger.debug("Add a test data");
sendBuffer = new ArrayList();
SubmitPack msg = new SubmitPack();
ArrayList destList = new ArrayList();
destList.add("136××××××××");
msg.setSm("你好,张新波");
msg.setDestAddr(destList);
add(msg);
start();
}
public static ModemAdapter getInstance() {
if (modem == null)
modem = new ModemAdapter();
return modem;
}
// 得到计算机的串口
private SerialPort getSerialPort(String com) {
SerialPort sPort = null;
CommPortIdentifier portID;
String owner = new String("modemn");
int keeptime = 5000;
Enumeration portList;
portList = CommPortIdentifier.getPortIdentifiers();
String driverName = "com.sun.comm.Win32Driver";
CommDriver driver = null;
try {
System.loadLibrary("win32com");
logger.debug("Win32Com Library Loaded");
driver = (CommDriver) Class.forName(driverName).newInstance();
driver.initialize();
logger.debug("Win32Driver Initialized");
} catch (InstantiationException e1) {
logger.error("1:" + e1.getMessage());
e1.printStackTrace();
} catch (IllegalAccessException e1) {
logger.error("2:" + e1.getMessage());
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
logger.error(e1.getMessage());
e1.printStackTrace();
}
// 如果有多个端口
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
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());
}
}
return sPort;
}
private boolean init() {
boolean result = false;
Config conf = new Config();
String comName = conf.comName();
sPort = getSerialPort(comName);
String msg = null;
if (sPort != null) {
listenSerialPort(sPort);
// 用配置参数初始化MODEM
msg = conf.initParam();
if (msg != null) {
if (conf.modemMode() != null && conf.modemMode().equals("0"))
isPduMode = true;
if (isPduMode)
msg = "at+cmgf=0;" + msg;
else
msg = "at+cmgf=1;" + msg;
sendMsg(msg, sPort);
sendOKFlag = true;
}
}
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(1000);
if (sendOKFlag) {
logger.debug("初始化MODEM成功!");
return true;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return result;
}
// 把短消息通过数据猫发送出去
private void sendMsg(String msg, SerialPort sPort) {
PrintWriter pw;
if (msg != null && sPort != null)
try {
pw = new PrintWriter(sPort.getOutputStream());
pw.println(msg);
pw.flush();
pw.close();
logger.debug("msg has been send from Modemn:");
logger.debug(msg);
} catch (IOException e) {
logger.error(e.getMessage());
e.printStackTrace();
}
}
// 把短消息通过数据猫发送出去
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();
}
}
private void listenSerialPort(SerialPort sPort) {
if (sPort != null)
try {
sPort.addEventListener(this);
sPort.notifyOnDataAvailable(true);
} catch (TooManyListenersException e) {
logger.error(e.getMessage());
e.printStackTrace();
}
}
public void run() {
int waitCount = 0;
String cmd1 = null;
SubmitPack msg;
String dest;
String content;
if (init()) {
while (true) {
try {
sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
msg = getOneMsg();
if (msg != null) {
ArrayList destList = msg.getDestAddr();
for (int i = 0; destList != null && i < destList.size(); i++) {
dest = (String) destList.get(i);
content = msg.getSm();
if (content != null) {
while (true) {
if (sendOKFlag == true) {
if (isPduMode) {
Config conf = new Config();
PduPack pack = new PduPack();
pack.setAddr(dest);
pack.setMsgContent(content);
pack.setSmsc(conf.smsc());
String coded = pack.getCodedResult();
if (coded != null
&& coded.length() > 18)
cmd1 = "AT+CMGS="
+ (coded.length() - 18) / 2
+ "\r";
smContent = coded
+ (char) Integer.parseInt("1A",
16);
// cmd1+=smContent;
sendMsg(cmd1.getBytes(), sPort);
cmd1 = null;
} else
cmd1 = "AT+CMGS="+86"
+ dest
+ ""\r"
+ content
+ (char) Integer.parseInt("1a",
16) + "z";
if (cmd1 != null) {
logger.debug("Cmd:" + cmd1);
sendMsg(cmd1, sPort);
sendOKFlag = false;
logger.debug("isSendOK=false");
}
break;
} else
try {
sleep(100);
if (waitCount > 300) {
sendOKFlag = true;
waitCount = 0;
} else
waitCount++;
} catch (InterruptedException e) {
}
}
}
}
}
}// while
} else {
logger.fatal("无法成功初始化MODEM,请检查设备");
System.exit(0);
}
}
// 处理侦听到的串口事件
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();
}
}
}
private boolean isRecOK(String data) {
final String OK_FLAG = "OK";
int index1 = 0;
if (data != null) {
index1 = data.indexOf(OK_FLAG);
if (index1 >= 0 && index1 + 4 <= data.length()) {
String t = data.substring(index1 + 2);
byte[] b = t.getBytes();
if (b.length >= 2) {
if (b[0] == 0x0D && b[1] == 0x0A)
return true;
}
}
}
return false;
}
private boolean isSendOK(String data) {
final String FLAG = "+CMGS:";
int index = -1;
int index2 = -1;
if (data != null) {
index = data.indexOf(FLAG);
if (index > 0) {
index += 6;
if (index < data.length()) {
String temp = data.substring(index);
index = 0;
byte[] b = temp.getBytes();
for (int i = 0; i < b.length; i++) {
if (b[i] == 0x0D) {
index2 = i;
break;
}
}
if (index2 < temp.length() && index2 > index + 1) {
String t1 = temp.substring(index + 1, index2);
try {
int seqid = Integer.parseInt(t1);
logger.debug("seqID:" + seqid);
if (index2 + 8 == temp.length()) {
// 两个回车换行符
if (b[index2] == 0x0D && b[++index2] == 0x0A
&& b[++index2] == 0x0D
&& b[++index2] == 0x0A) {
if (b[++index2] == 0x4F
&& b[++index2] == 0x4B) {// OK
if (b[++index2] == 0x0D
&& b[++index2] == 0x0A) {// 一个回车换行
return true;
}
}
}
}
} catch (NumberFormatException e) {
e.printStackTrace();
return false;
}
}
}
}
}
return false;
}
private boolean isRecError(String data) {
final String FLAG = "ERROR";
int index1 = 0;
if (data != null) {
index1 = data.indexOf(FLAG);
if (index1 >= 0 && index1 + 7 <= data.length()) {
String t = data.substring(index1 + 5);
byte[] b = t.getBytes();
if (b.length >= 2) {
if (b[0] == 0x0D && b[1] == 0x0A)
return true;
}
}
}
return false;
}
private boolean isRecData(String data) {
final String BEGIN_FLAG = "+CMT:";
int index0 = -1;
int index1 = -1;
int index2 = -1;
if (data != null) {
index0 = data.indexOf(BEGIN_FLAG);
if (index0 >= 0 && index0 < data.length()) {
// data=data.substring(index0);
// index1 = data.indexOf("\r\n");
// if (index1 > index0 && index1 + 2 < data.length()) {
// String str=data.substring(index1+2);
// index2=str.indexOf("\r\n");
// if(index2>0 && index2
//
// return true;
// }
// }
return true;
}
}
return false;
}
private boolean handleRecData(StringBuffer sb) {
String data = null;
if (sb != null) {
data = sb.toString();
if (isRecOK(data)) {
sendOKFlag = true;
return true;
} else if (isRecError(data)) {
errCount++;
if (errCount > 3) {
sendOKFlag = true;
errCount = 0;
}
return true;
} else if (sb.indexOf(">") != -1 && smContent != null) {
sendMsg(smContent.getBytes(), sPort);
smContent = null;
}
else {
int index0 = data.lastIndexOf("+CMT:");
if (index0 >= 0 && index0 < data.length()) {
data = data.substring(index0);
int index1 = data.indexOf("\r\n");
if (index1 != -1 && index1 + 2 < data.length()) {
data = data.substring(index1 + 2);
int index2 = data.indexOf("\r\n");
if (index2 > 1 && index2 < data.length()) {
data = data.substring(0, index2);
if (data != null && data.length() > 0) {
PduPack pack = new PduPack(data);
String srcAddr = pack.getAddr();
String content = pack.getMsgContent();
String destAddr = "012345";
if (srcAddr != null && content != null) {
logger.debug("srcAddr:"+srcAddr);
logger.debug("content:"+content);
Config conf = new Config();
destAddr = conf.cmppSSN();
DeliverPack deliver = new DeliverPack(
srcAddr, destAddr, content);
ServerAdapter server = ServerAdapter
.getInstance();
server.addDeliverPack(deliver);
return true;
}
}
}
}
}
}
}
return false;
}
private SubmitPack getOneMsg() {
SubmitPack result = null;
if (sendBuffer != null && sendBuffer.size() > 0)
result = (SubmitPack) sendBuffer.remove(0);
return result;
}
public void add(SubmitPack msg) {
sendBuffer.add(msg);
}
}
- java 操作串口实现短信收发
- 在Java中操作串口实现短信收发
- 在Java中操作串口实现短信收发
- 在Java中操作串口实现短信收发
- 在Java中操作串口实现短信收发
- 在Java中操作串口实现短信收发
- 在Java中操作串口实现短信收发 收藏
- 关于Java串口技术实现短信收发
- 用串口操作手机收发短信总结
- Delphi实现串口编程收发短信
- Delphi实现串口编程收发短信
- java写的关于串口收发短信的东东[原创]
- java写的关于串口收发短信的东东
- SMSLib实现Java短信收发的功能
- SMSLib实现Java短信收发的功能
- 如何用java语言控制短信设备实现短信收发?
- j2me实现收发短信
- 一步一步搞定手机串口短信收发
- 【传递参数】html页面之间也可以传递参数
- 分页语句去掉distinct由hash改为nl
- WAMP Server下安装PEAR
- poj——3211——Washing Clothes
- 图片压缩
- java 操作串口实现短信收发
- VC6中减小生成EXE文件的大小
- ProcessOn支持多人协作的在线绘图工具
- FTP常用命令
- PHP扩展的URL Library快速入门
- Web.xml配置详解
- CoreText学习记录一:筛选网址显示不同颜色+Demo+pdf
- HQL实现单一 属性与多个属性的查询
- poj 3630 || hdu 1671 Phone List (字典树)