java 短信猫发送短信的方法
http://zghbwjl.blog.163.com/blog/static/12033667220129175158806/
http://www.smscom.cn/sms_javasoft/
用java實現短信收發的功能,目前一般項目中短信群發功能的實現方法大致有下面三種:
·?????????????????1、 向運行商申請短信網關,不需要額外的設備,利用運行商提供的API調用程序發送短信,適用于大型的通信公司。
·?????????????????2、 借助像GSM MODEM之類的設備(支持AT指令的手機也行),通過數據線連接電腦來發送短信,這種方法比較適用于小公司及個人。要實現這種方式必須理解串口通信、AT指令、短信編碼、解碼。
·?????????????????3、 借助第三方運行的網站實現,由網站代發短信數據,這種方法對網站依賴性太高,對網絡的要求也比較高。
???????鑒于項目的情況和多方考慮,同時又找到了一個開源的SMSLib項目的支持,比較傾向于第二種方法,SMSLib的出現就不需要我們自己去寫底層的AT指令,這樣就可以直接通過調用SMSLib的API來實現通過GSM modem來收發送短信了。
SMSLib官方網站:http://smslib.org/,使用SMSLib的一些基本要點:
·?????????????????SUN JDK 1.6 or newer. (Java環境)
·?????????????????Java CommunicationsLibrary. (Java串口通信)
·?????????????????Apache ANT for building thesources. (編譯源碼時需要的)
·?????????????????Apache log4j. (日志工具)
·?????????????????Apache Jakarta Commons -NET. (網絡操作相關的)
·?????????????????JSMPP Library (SMPP協議時需要的)
有關Java串口通信需要補充說明:
·?????????????????window系統可以用SUN Java Comm v2. (該版本好像也支持solaris)
其下載地址:http://smslib.googlecode.com/files/javacomm20-win32.zip
·?????????????????其他操作系統(比如:Linux, Unix, BSD,等等),你可以選擇 Java Comm v3 或者是RxTx。
Java Comm v3下載地址:http://java.sun.com/products/javacomm/(需要注冊);?
???????? RxTx官網:http://users.frii.com/jarvi/rxtx/index.html?or?http://rxtx.qbang.org/wiki/index.php/Main_Page
附件提供相關下載:
·?????????????????java串口通信v2:javacomm20-win32.zip
·?????????????????smslib-3.5.1.jar
·?????????????????短信modem驅動:PL2303_Prolific_DriverInstaller_v130.zip
本次測試的環境是window,GSM modem是wavecom,所以這次主要描述window環境下簡單的實現過程:?
【一】、配置相應的環境?
?????首先解壓下載的Java Comm v2文件javacomm20-win32.zip,具體配置步驟如下:
·?????????????????把文件:comm.jarcopy 到目錄:JDKDIR/jre/lib/ext/,當然這一步也可以不要這樣做,你只需把comm.jar copy到所要運行的項目對應的lib/下既可
·?????????????????把文件:javax.comm.propertiescopy 到目錄:JDKDIR/jre/lib/
·?????????????????把DLL文件:win32com.dll(windows) copy 到目錄:JDKDIR/jre/bin/
如果存在JRE目錄, 最好安裝上面步驟把文件copy到JREDIR相應的目錄下 測試串口端口程序:?
Test?.java
Java代碼??
package test;
import java.util.Enumeration;
import javax.comm.CommDriver;
import javax.comm.CommPortIdentifier;
import javax.comm.SerialPort;
public class Test {
?? public static void main(String[] args) throws Exception { ?
?? ? ? ?// 人工加載驅動 ?
?? ? ? ?// MainTest.driverInit(); ?
?? Test.getCommPortList(); ?
?? ? ? ?// 人工加載驅動獲取端口列表 ?
?? ? ? ?// TestGetPortList.getPortByDriver(); ?
??
?? ?} ?
??
?? ?/**?
?? ? * 手工加載驅動<br>?
?? ? * 正常情況下程序會自動加載驅動,故通常不需要人工加載<br>?
?? ? * 每重復加載一次,會把端口重復注冊,CommPortIdentifier.getPortIdentifiers()獲取的端口就會重復?
?? ? */ ?
?? ?public static void driverManualInit() { ?
?? ? ? ?String driverName = "com.sun.comm.Win32Driver"; ?
?? ? ? ?String libname = "win32com"; ?
?? ? ? ?CommDriver commDriver = null; ?
?? ? ? ?try { ?
?? ? ? ? ? ?System.loadLibrary("win32com"); ?
?? ? ? ? ? ?System.out.println(libname + " Library Loaded"); ?
??
?? ? ? ? ? ?commDriver = (javax.comm.CommDriver) Class.forName(driverName) ?
?? ? ? ? ? ? ? ? ? ?.newInstance(); ?
?? ? ? ? ? ?commDriver.initialize(); ?
?? ? ? ? ? ?System.out.println("comm Driver Initialized"); ?
??
?? ? ? ?} catch (Exception e) { ?
?? ? ? ? ? ?System.err.println(e); ?
?? ? ? ?} ?
?? ?} ?
??
?? ?/**?
?? ? * 獲取端口列表?
?? ? */ ?
?? ?public static void getCommPortList() { ?
?? ? ? ?CommPortIdentifier portId; ?
?? ? ? ?Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); ?
?? ? ? ?while (portEnum.hasMoreElements()) { ?
?? ? ? ? ? ?portId = (CommPortIdentifier) portEnum.nextElement(); ?
??
?? ? ? ? ? ?if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { ?
?? ? ? ? ? ? ? ?System.out.println("串口: name-" + portId.getName() ?
?? ? ? ? ? ? ? ? ? ? ? ?+ " 是否占用-" + portId.isCurrentlyOwned()); ?
?? ? ? ? ? ?} else { ?
?? ? ? ? ? ? ? ?System.out.println("并口: name-" + portId.getName() ?
?? ? ? ? ? ? ? ? ? ? ? ?+ " 是否占用-" + portId.isCurrentlyOwned()); ?
?? ? ? ? ? ?} ?
?? ? ? ?} ?
?? ? ? ?System.out.println("-------------------------------------"); ?
?? ?} ?
??
?? ?/**?
?? ? * ?
?? ? */ ?
?? ?public static void getPortByDriver() { ?
??
?? ? ? ?String driverName = "com.sun.comm.Win32Driver"; ?
?? ? ? ?String libname = "win32com"; ?
?? ? ? ?CommDriver commDriver = null; ?
?? ? ? ?try { ?
?? ? ? ? ? ?System.loadLibrary("win32com"); ?
?? ? ? ? ? ?System.out.println(libname + " Library Loaded"); ?
??
?? ? ? ? ? ?commDriver = (CommDriver) Class.forName(driverName).newInstance(); ?
?? ? ? ? ? ?commDriver.initialize(); ?
?? ? ? ? ? ?System.out.println("comm Driver Initialized"); ?
??
?? ? ? ?} catch (Exception e) { ?
?? ? ? ? ? ?System.err.println(e); ?
?? ? ? ?} ?
?? ? ? ?SerialPort sPort = null; ?
?? ? ? ?try { ?
??
?? ? ? ? ? ?sPort = (SerialPort) commDriver.getCommPort("COM24", ?
?? ? ? ? ? ? ? ? ? ?CommPortIdentifier.PORT_SERIAL); ?
?? ? ? ? ? ?System.out.println("find CommPort:" + sPort.toString()); ?
?? ? ? ?} catch (Exception e) { ?
?? ? ? ? ? ?System.out.println(e.getMessage()); ?
?? ? ? ?} ?
??
?? ?} ?
??
}
本機運行結果:
引用
串口: name-COM10 是否占用-false?
串口: name-COM21 是否占用-false?
串口: name-COM23 是否占用-false?
串口: name-COM20 是否占用-false?
串口: name-COM22 是否占用-false?
串口: name-COM24 是否占用-false?
串口: name-COM9 是否占用-false?
串口: name-COM19 是否占用-false?
串口: name-COM3 是否占用-false?
串口: name-COM8 是否占用-false?
串口: name-COM98 是否占用-false?
串口: name-COM99 是否占用-false?
串口: name-COM4 是否占用-false?
串口: name-COM5 是否占用-false?
串口: name-COM6 是否占用-false?
并口: name-LPT1 是否占用-false?
并口: name-LPT2 是否占用-false?
-------------------------------------
【三】、檢查串口設備信息:?
TestCommPort?.java
Java代碼??
package test;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.comm.CommPortIdentifier;
import javax.comm.SerialPort;
public class TestCommPort {
??
? ? static CommPortIdentifier portId; ?
? ? static Enumeration portList; ?
? ? static int bauds[] = { 9600, 19200, 57600, 115200 }; ?
??
? ? /**?
? ? ?* @param args?
? ? ?*/ ?
? ? public static void main(String[] args) { ?
? ? ? ? portList = CommPortIdentifier.getPortIdentifiers(); ?
? ? ? ? System.out.println("GSM Modem 串行端口連接測試開始..."); ?
? ? ? ? String portName = "COM4"; ?
? ? ? ? while (portList.hasMoreElements()) { ?
? ? ? ? ? ? portId = (CommPortIdentifier) portList.nextElement(); ?
? ? ? ? ? ? if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL ?
? ? ? ? ? ? ? ? ? ? && portName.equals(portId.getName())) { ?
? ? ? ? ? ? ? ? System.out.println("找到串口: " + portId.getName()); ?
? ? ? ? ? ? ? ? for (int i = 0; i < bauds.length; i++) { ?
? ? ? ? ? ? ? ? ? ? System.out.print(" ?Trying at " + bauds[i] + "..."); ?
? ? ? ? ? ? ? ? ? ? try { ?
? ? ? ? ? ? ? ? ? ? ? ? SerialPort serialPort; ?
? ? ? ? ? ? ? ? ? ? ? ? InputStream inStream; ?
? ? ? ? ? ? ? ? ? ? ? ? OutputStream outStream; ?
? ? ? ? ? ? ? ? ? ? ? ? int c; ?
? ? ? ? ? ? ? ? ? ? ? ? StringBuffer response = new StringBuffer(); ?
? ? ? ? ? ? ? ? ? ? ? ? serialPort = (SerialPort) portId.open( ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "SMSLibCommTester", 1971); ?
? ? ? ? ? ? ? ? ? ? ? ? serialPort ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN); ?
? ? ? ? ? ? ? ? ? ? ? ? serialPort.setSerialPortParams(bauds[i], ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SerialPort.DATABITS_8, SerialPort.STOPBITS_1, ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SerialPort.PARITY_NONE); ?
? ? ? ? ? ? ? ? ? ? ? ? inStream = serialPort.getInputStream(); ?
? ? ? ? ? ? ? ? ? ? ? ? outStream = serialPort.getOutputStream(); ?
? ? ? ? ? ? ? ? ? ? ? ? serialPort.enableReceiveTimeout(1000); ?
? ? ? ? ? ? ? ? ? ? ? ? c = inStream.read(); ?
? ? ? ? ? ? ? ? ? ? ? ? while (c != -1) { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? c = inStream.read(); ?
? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? ? ? ? outStream.write('A'); ?
? ? ? ? ? ? ? ? ? ? ? ? outStream.write('T'); ?
? ? ? ? ? ? ? ? ? ? ? ? outStream.write('\r'); ?
? ? ? ? ? ? ? ? ? ? ? ? try { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? Thread.sleep(1000); ?
? ? ? ? ? ? ? ? ? ? ? ? } catch (Exception e) { ?
? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? ? ? ? c = inStream.read(); ?
? ? ? ? ? ? ? ? ? ? ? ? while (c != -1) { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? response.append((char) c); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? c = inStream.read(); ?
? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? ? ? ? if (response.indexOf("OK") >= 0) { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.print(" ?正在檢測設備:"); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? try { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? outStream.write('A'); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? outStream.write('T'); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? outStream.write('+'); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? outStream.write('C'); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? outStream.write('G'); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? outStream.write('M'); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? outStream.write('M'); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? outStream.write('\r'); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? response = new StringBuffer(); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? c = inStream.read(); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? while (c != -1) { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? response.append((char) c); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? c = inStream.read(); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(" ?發現設備: " ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + response.toString().replaceAll( ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "(\\s+OK\\s+)|[\n\r]", "")); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? } catch (Exception e) { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(" ?檢測設備失敗,獲取設備信息異常:" ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + e.getMessage()); ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? ? ? ? } else { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(" ?檢測設備失敗,沒有接收到響應結果!"); ?
? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? ? ? ? serialPort.close(); ?
? ? ? ? ? ? ? ? ? ? } catch (Exception e) { ?
? ? ? ? ? ? ? ? ? ? ? ? System.out.println(" ?檢測設備失敗,發生異常:" + e.getMessage()); ?
? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? } ?
? ? ? ? } ?
? ? } ?
} ?
運行結果如下:
引用
GSM Modem 串行端口連接測試開始...?
找到串口: COM24?
? Trying at 9600...? 正在檢測設備:?發現設備: AT+CGMM MULTIBAND? 900E?1800?
? Trying at 19200...? 發現設備失敗,沒有接收到響應結果!?
? Trying at 57600...? 發現設備失敗,沒有接收到響應結果!?
? Trying at 115200...? 發現設備失敗,沒有接收到響應結果!
【四】、測試收發短信:
Java代碼??
package test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.smslib.AGateway;
import org.smslib.AGateway.Protocols;
import org.smslib.GatewayException;
import org.smslib.InboundMessage;
import org.smslib.Message.MessageEncodings;
import org.smslib.OutboundMessage;
import org.smslib.Service;
import org.smslib.modem.SerialModemGateway;
public class SendSmsHandler { ?
? ? private static final Logger logger = Logger.getLogger(SendSmsHandler.class); ?
??
? ? private Service smsService; ?
??
? ? /**?
? ? ?* 發送短信的類
? ? ?*/ ?
? ? public SendSmsHandler() { ?
? ? ? ? smsService = Service.getInstance(); ?//獲得服務實例 ?單例模式的
? ? ? ? List<AGateway> agatewayList = new ArrayList<AGateway>(); ?
??
? ? ? ? String portName = "COM4";//"/dev/ttyUSB0";// COM24 ?//使用的端口號
? ? ? ? SerialModemGateway gateway = new SerialModemGateway( ?
? ? ? ? ? ? ? ? "modem." + portName, portName, 9600, "wavecom", "PL2303"); ?//通過端口號頻率名稱等內容獲得設備實例
? ? ? ? gateway.setInbound(true); ?
? ? ? ? gateway.setOutbound(true); ?
? ? ? ? gateway.setProtocol(Protocols.PDU); ?//發送凡是PDU
? ? ? ? gateway.setSimPin("0000"); ?
? ? ? ? agatewayList.add(gateway); ?//放到隊列中,群發可以放多條就可以了
? ? ? ? try { ?
? ? ? ? ? ? for (AGateway gatewayTmp : agatewayList) { ?
? ? ? ? ? ? ? ? smsService.addGateway(gatewayTmp); ?
? ? ? ? ? ? } ?
? ? ? ? } catch (GatewayException ex) { ?
? ? ? ? ? ? logger.error(ex.getMessage()); ?
? ? ? ? } ?
? ? } ?
??
? ? /**?
? ? ?* ?啟動發送短信的服務
? ? ?*/ ?
? ? public void start() { ?
? ? ? ? logger.info("SMS service start....."); ?
? ? ? ? try { ?
? ? ? ? ? ? smsService.startService(); ?
? ? ? ? } catch (Exception ex) { ?
? ? ? ? ? ? logger.error("SMS service start error:", ex); ?
? ? ? ? } ?
? ? } ?
??
? ? /**?
? ? ?* ?停止發送短信服務
? ? ?*/ ?
? ? public void destroy() { ?
? ? ? ? try { ?
? ? ? ? ? ? smsService.stopService(); ?//停止服務
? ? ? ? } catch (Exception ex) { ?
? ? ? ? ? ? logger.error("SMS service stop error:", ex); ?
? ? ? ? } ?
? ? ? ? logger.info("SMS service stop"); ?
? ? } ?
??
? ? /**?
? ? ?* send SMS?
? ? ?* 發送短信的方法
? ? ?* @param msg 發送的內容
? ? ?* @return Boolean 返回是否發送成功
? ? ?*/ ?
? ? public Boolean sendSMS(OutboundMessage msg) { ?
? ? ? ? try { ?
? ? ? ? ? ? msg.setEncoding(MessageEncodings.ENCUCS2); ?//設置編碼
? ? ? ? ? ? return smsService.sendMessage(msg); ?//發送短信并返回結果
? ? ? ? } catch (Exception e) { ?
? ? ? ? ? ? logger.error("send error:", e); ?
? ? ? ? } ?
? ? ? ? return false; ?
? ? } ?
??
//服務是否已經啟動
? ? private boolean isStarted() { ?
? ? ? ? if (smsService.getServiceStatus() == Service.ServiceStatus.STARTED) { ?//服務的狀態是否是啟動
? ? ? ? ? ? for (AGateway gateway : smsService.getGateways()) { ?
? ? ? ? ? ? ? ? if (gateway.getStatus() == AGateway.GatewayStatuses.STARTED) { ?
? ? ? ? ? ? ? ? ? ? return true; ?
? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? } ?
? ? ? ? } ?
? ? ? ? return false; ?
? ? } ?
??
? ? /**?
? ? ?* read SMS 去讀接收到的短信信息
? ? ?* @return List?
? ? ?*/ ?
? ? public List<InboundMessage> readSMS() { ?
? ? ? ? List<InboundMessage> msgList = new LinkedList<InboundMessage>(); ?
? ? ? ? if (!isStarted()) { ?
? ? ? ? ? ? return msgList; ?
? ? ? ? } ?
? ? ? ? try { ?
? ? ? ? ? ? this.smsService.readMessages(msgList, ?
? ? ? ? ? ? ? ? ? ? InboundMessage.MessageClasses.ALL); ?
? ? ? ? ? ? logger.info("read SMS size: " + msgList.size()); ?
? ? ? ? } catch (Exception e) { ?
? ? ? ? ? ? logger.error("read error:", e); ?
? ? ? ? } ?
? ? ? ? return msgList; ?
? ? } ?
??
? ? /**?
? ? ?* @param args 測試類
? ? ?*/ ?
? ? public static void main(String[] args) { ?
? ? ? ? Logger.getRootLogger().setLevel(Level.INFO); ?
? ? ? ? OutboundMessage outMsg = new OutboundMessage("189*****", "信息測試"); ?//綁定接收電話號碼和發送的消息
? ? ? ? SendSmsHandler smsHandler = new SendSmsHandler(); ?
? ? ? ? smsHandler.start(); ?//啟動
? ? ? ? //發送短信 ?
? ? ? ? smsHandler.sendSMS(outMsg); ?
? ? ? ? //讀取短信 ?
? ? ? ? List<InboundMessage> readList = smsHandler.readSMS(); ?
? ? ? ? for (InboundMessage in : readList) { ?
? ? ? ? ? ? System.out.println("發信人:" + in.getOriginator() + " 短信內容:" ?
? ? ? ? ? ? ? ? ? ? + in.getText()); ?
? ? ? ? } ?
? ? ? ? smsHandler.destroy(); ?//停止服務
? ? ? ? System.out.println("-----------"); ?
? ? } ?
??
}
發送短信親測,手機能正常接收顯示。讀取設備的短信程序運行結果結果如下:
引用
INFO - Service.listSystemInformation(113) | SMSLib: A Java API library forsending and receiving SMS via a GSM modem or other supported gateways.?
This software is distributed under the terms of the Apache v2.0 License.?
Web Site: http://smslib.org?
INFO - Service.listSystemInformation(114) | Version: 3.5.1?
INFO - Service.listSystemInformation(115) | JRE Version: 1.6.0_18?
INFO - Service.listSystemInformation(116) | JRE Impl Version: 16.0-b13?
INFO - Service.listSystemInformation(117) | O/S: Windows Vista / x86 /6.0?
INFO - SmsHandler.start(55) | SMS service start.....?
INFO - DefaultQueueManager.init(92) | Queue directory not defined. Queuedmessages will not be saved to filesystem.?
INFO - ModemGateway.startGateway(188) | GTW: modem.COM24: Starting gateway,using Generic AT Handler.?
INFO - SerialModemDriver.connectPort(68) | GTW: modem.COM24: Opening: COM24@9600?
INFO - AModemDriver.waitForNetworkRegistration(459) | GTW: modem.COM24: GSM:Registered to foreign network (roaming).?
INFO - AModemDriver.connect(175) | GTW: modem.COM24: MEM: Storage LocationsFound: SMBM?
INFO - CNMIDetector.getBestMatch(142) | CNMI: No best match, returning: 1?
INFO - ModemGateway.startGateway(191) | GTW: modem.COM24: Gatewaystarted.?
INFO - SmsHandler.readSMS(113) | read SMS size: 1?
發信人:8618918001030 短信內容:hello 回復測試?
INFO - ModemGateway.stopGateway(197) | GTW: modem.COM24: Stoppinggateway...?
INFO - SerialModemDriver.disconnectPort(120) | GTW: modem.COM24: Closing: COM24@9600?
INFO - ModemGateway.stopGateway(201) | GTW: modem.COM24: Gateway stopped.?
INFO - SmsHandler.destroy(72) | SMS service stop?
-----------
總結
以上是生活随笔為你收集整理的java 短信猫发送短信的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB 里面日期查询的问题
- 下一篇: oracle with check op